我该如何快速完成?
当然,我可以这样做:
static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
if (a1.Length != a2.Length)
return false;
for (int i=0; i<a1.Length; i++)
if (a1[i]!=a2[i])
return false;
return true;
}
但是我正在寻找BCL功能或一些经过高度优化的行之有效的方法。
java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);
效果很好,但看起来不适用于x64。
在这里记下我的超快速回答。
#1楼
我想到了许多图形卡内置的块传输加速方法。 但是随后您将不得不按字节复制所有数据,因此如果您不想以不受管且与硬件相关的代码来实现逻辑的整个部分,那么这将无济于事。
与上面显示的方法类似的另一种优化方法是,从一开始就将尽可能多的数据存储在long []中,而不是byte []中,例如,如果您从二进制文件中顺序读取数据,或者,如果您使用内存映射文件,则将数据读取为long []或单个long值。 然后,您的比较循环将只需要对包含相同数据量的byte []执行的迭代次数的1/8。 您需要何时以及多长时间比较一次,以及何时以及多长时间需要按字节访问数据的问题,例如,在API调用中将其用作期望的方法中的参数一个字节[]。 最后,您只能告诉您是否真的知道用例...
#2楼
如果查看.NET如何处理string.Equals,您会发现它使用了一个称为EqualsHelper的私有方法,该方法具有“不安全”的指针实现。 .NET Reflector是您的朋友,可以了解内部的工作方式。
这可以用作字节数组比较的模板,我在博客文章C#中的快速字节数组比较中进行了实现。 我还做了一些基本的基准测试,以了解安全实施的时间快于不安全实施的时间。
也就是说,除非您真的需要杀手级的性能,否则我将进行简单的fr循环比较。
#3楼
为了比较短字节数组,以下是一个有趣的技巧:
if(myByteArray1.Length != myByteArray2.Length) return false;
if(myByteArray1.Length == 8)
return BitConverter.ToInt64(myByteArray1, 0) == BitConverter.ToInt64(myByteArray2, 0);
else if(myByteArray.Length == 4)
return BitConverter.ToInt32(myByteArray2, 0) == BitConverter.ToInt32(myByteArray2, 0);
然后,我可能会遇到问题中列出的解决方案。
对该代码进行性能分析将很有趣。
#4楼
P /调用电源激活!
[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int memcmp(byte[] b1, byte[] b2, long count);
static bool ByteArrayCompare(byte[] b1, byte[] b2)
{
// Validate buffers are the same length.
// This also ensures that the count does not exceed the length of either buffer.
return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
}
#5楼
如果您有一个巨大的字节数组,您可以通过将它们转换为字符串来比较它们。
你可以使用类似的东西
byte[] b1 = // Your array
byte[] b2 = // Your array
string s1 = Encoding.Default.GetString( b1 );
string s2 = Encoding.Default.GetString( b2 );
我使用过这个,我看到了巨大的性能影响。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3158299