c# – 对于byte [],安全比较与不安全
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 对于byte [],安全比较与不安全,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2988字,纯文字阅读大概需要5分钟。
内容图文
![c# – 对于byte [],安全比较与不安全](/upload/InfoBanner/zyjiaocheng/770/d507b004140042a2ad41d8c1a1095264.jpg)
我已经在不同的地方读过,关于使用固定块的数组之间不安全迭代的速度有多快.我试过.net 4和4.5,或多或少地实现了相同的结果.
安全比较总是更快,有时是一点点,有时几乎是一半时间,特别是在.net 4中.
难道我做错了什么?
class Program
{
public unsafe static int UnsafeCompareTo2(byte[] self, byte[] other)
{
if (self.Length < other.Length) { return -1; }
if (self.Length > other.Length) { return +1; }
GCHandle selfHandle =
GCHandle.Alloc(self, GCHandleType.Pinned);
GCHandle otherHandle =
GCHandle.Alloc(other, GCHandleType.Pinned);
byte* selfPtr = (byte*)
selfHandle.AddrOfPinnedObject().ToPointer();
byte* otherPtr = (byte*)
otherHandle.AddrOfPinnedObject().ToPointer();
int length = self.Length;
int comparison = 0;
for (int index = 0; index < length; index++)
{
comparison =
(*selfPtr++).CompareTo((*otherPtr++));
if (comparison != 0) { break; }
}
selfHandle.Free();
return comparison;
}
public static int CompareTo(byte[] self, byte[] other)
{
if (self.Length < other.Length) { return -1; }
if (self.Length > other.Length) { return +1; }
int comparison = 0;
for (int i = 0; i < self.Length && i < other.Length; i++)
{
if ((comparison = self[i].CompareTo(other[i])) != 0)
{ return comparison; }
}
return comparison;
}
public unsafe static int UnsafeCompareTo(byte[] self, byte[] other)
{
if (self.Length < other.Length) { return -1; }
if (self.Length > other.Length) { return +1; }
int n = self.Length;
fixed (byte* selfPtr = self, otherPtr = other)
{
byte* ptr1 = selfPtr;
byte* ptr2 = otherPtr;
while (n-- > 0)
{
int comparison;
if ((comparison = (*ptr1++).CompareTo(*ptr2++)) != 0)
{
return comparison;
}
}
}
return 0;
}
static void Main(string[] args)
{
byte[] b1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
byte[] b2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21 };
Stopwatch watch = new Stopwatch();
watch.Start();
int result;
for(long i = 0; i < Math.Pow(10, 2); i++)
result = CompareTo(b1, b2);
watch.Stop();
Console.WriteLine("safe = {0}", watch.Elapsed);
watch.Restart();
for (long i = 0; i < Math.Pow(10, 2); i++)
result = UnsafeCompareTo(b1, b2);
watch.Stop();
Console.WriteLine("unsafe1 = {0}", watch.Elapsed);
watch.Restart();
for (long i = 0; i < Math.Pow(10, 2); i++)
result = UnsafeCompareTo2(b1, b2);
watch.Stop();
Console.WriteLine("unsafe2 = {0}", watch.Elapsed);
Console.ReadLine();
}
}
解决方法:
在我看来,差异经常被开销和随机噪声所淹没.我发现它对于更多的迭代更加突出,更重要的是更长的字节数组.我通过更频繁地避免方法调用开销来制作一个更快的变体:
public unsafe static int UnsafeCompareTo(byte[] self, byte[] other)
{
if (self.Length < other.Length) { return -1; }
if (self.Length > other.Length) { return +1; }
int n = self.Length;
fixed (byte* selfPtr = self, otherPtr = other)
{
byte* ptr1 = selfPtr;
byte* ptr2 = otherPtr;
byte b1;
byte b2;
while (n-- > 0)
{
b1 = (*ptr1++);
b2 = (*ptr2++);
if (b1 == b2)
continue;
return b1.CompareTo(b2);
}
}
return 0;
}
我还注意到你的代码中有一个错误(不会真的减慢速度),如下所示:
GCHandle otherHandle = GCHandle.Alloc(self, GCHandleType.Pinned);
它应该是使用其他的,它应该在之后释放它.
内容总结
以上是互联网集市为您收集整理的c# – 对于byte [],安全比较与不安全全部内容,希望文章能够帮你解决c# – 对于byte [],安全比较与不安全所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。