【问题标题】:String Comparison vs Array Comparison in .NET.NET 中的字符串比较与数组比较
【发布时间】:2011-08-02 12:31:00
【问题描述】:

我有一段对速度至关重要的代码,它涉及比较 2 个 4 字节数组。我一直在努力找出实现这一目标的最快方法,并查看了this。

使用 pinvoke 和 memcmp 进行 100,000,000 次比较大约需要 9.5 秒,使用上面链接中发布的 UnsafeCompare 方法需要大约 3.5 秒。

如果设置 2 4 个字符串并使用 s1 == s2 进行比较,则需要约 0.5 秒。如果我使用 string.Compare(s1, s2) 大约需要 12 秒。

有什么方法可以让我的字节数组比较来比较执行 s1 == s2 的速度吗?如果没有,我做下面这样的事情会不会有任何问题,基本上将我的字节数组存储为字符串?

        string s1 = Convert.ToChar(1).ToString() + Convert.ToChar(2).ToString() + Convert.ToChar(3).ToString() + Convert.ToChar(4).ToString();
        string s2 = Convert.ToChar(1).ToString() + Convert.ToChar(2).ToString() + Convert.ToChar(3).ToString() + Convert.ToChar(4).ToString();

        if (s1 == s2)
            .....

希望有人可以帮助我解决这个问题。谢谢!

【问题讨论】:

    标签: .net arrays performance string comparison


    【解决方案1】:

    我推荐以下步骤:

    1. 逐字节比较两个 4 字节数组,即a[0] == b[1] && … && a[3] == b[3]。这将比任何对memcmp 等的调用都快得多。最有可能的是,JIT 编译器会将其编译为高效(且内联)的指令序列。您正在比较仅四个字节,您不能指望专为比较任意长的内存块而设计的算法会表现得更好。

    2. 考虑将数据存储为 32 位整数而不是 4 字节数组。这将提供另一个性能提升,因为比较 (a == b) 将被转换为单个 32 位比较指令。

    3. 尝试重新考虑您的算法 — 真的有必要进行 1 亿次比较吗?没有任何选项可以降低算法的时间复杂度吗? 这会产生相当大的性能提升。

    但是,如果不了解更广泛的背景,很难推荐任何更好的具体优化。

    【讨论】:

    • 我尝试了你在 1 中的建议。这花了大约 8 秒。 2 我认为是一个不错的选择,int32 比较大约需要 0.33 秒,所以这是最快的。 100m 的比较只是为了测试,实际的应用程序不会那么难打。
    【解决方案2】:

    还没有尝试过这个速度,但是如何硬编码长度并进行这样的比较:

    byte[] one = new byte[] { 0, 1, 2, 3 };
    byte[] two = new byte[] { 0, 1, 2, 4 };
    
    bool isEqual = ((one[0] == two[0]) && (one[1] == two[1]) && (one[2] == two[2]) && (one[3] == two[3]));
    

    【讨论】:

    • 如上所述,这似乎也比字符串比较慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多