字符串比较与.NET中的数组比较

时间:2011-04-10 14:47:27

标签: .net arrays performance string comparison

我有一段速度关键的代码,涉及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)
            .....

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

2 个答案:

答案 0 :(得分:3)

我建议这些步骤:

  1. 逐字节比较两个4字节数组,即a[0] == b[1] && … && a[3] == b[3]。这比<{1}}的任何调用都快 。最有可能的是,JIT编译器会将其编译为高效(和内联)指令序列。您只比较四个字节,您不能指望用于比较任意长内存块的算法能够表现得更好。

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

  3. 尝试重新考虑您的算法 - 是否真的有必要进行1亿次比较?是否有任何选项可以减少算法的时间复杂度? 会带来相当大的性能提升。

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

答案 1 :(得分:1)

没有尝试过这个以获得速度,但是如何对这个长度进行硬编码并进行比较:

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]));