我有一段速度关键的代码,涉及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)
.....
希望有人可以帮我解决这个问题。谢谢!
答案 0 :(得分:3)
我建议这些步骤:
逐字节比较两个4字节数组,即a[0] == b[1] && … && a[3] == b[3]
。这比<{1}}的任何调用都快 。最有可能的是,JIT编译器会将其编译为高效(和内联)指令序列。您只比较四个字节,您不能指望用于比较任意长内存块的算法能够表现得更好。
考虑将数据存储为32位整数而不是4字节数组。这将提供另一个性能增益,因为比较(memcmp
)将被转换为单个32位比较指令。
尝试重新考虑您的算法 - 是否真的有必要进行1亿次比较?是否有任何选项可以减少算法的时间复杂度? 那会带来相当大的性能提升。
但是,如果不了解更广泛的背景,很难推荐任何更好和更具体的优化。
答案 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]));