我试图比较VB.NET中的两个长字节数,并遇到了障碍.比较两个50兆字节的文件大约需要两分钟,所以我显然做错了什么.我在一台拥有大量内存的x64机器上,所以那里没有问题.这是我目前使用的代码,想要改变.
_Bytes
并且item.Bytes
是要比较的两个不同的数组,并且已经是相同的长度.
For Each B In item.Bytes If B <> _Bytes(I) Then Mismatch = True Exit For End If I += 1 Next
我需要能够尽可能快地比较可能数百兆字节甚至可能是一千兆字节或两千兆字节的文件.任何能够更快地完成此任务的建议或算法?
Item.bytes
是从数据库/文件系统中取出的对象,它返回比较,因为它的字节长度与用户想要添加的项匹配.通过比较两个阵列,我可以确定用户是否已经向DB添加了新内容,如果没有,那么我可以将它们映射到另一个文件而不会浪费硬盘空间.
[更新]
我将数组转换为Byte()的局部变量,然后进行相同的比较,相同的代码并在一秒钟内运行(我必须对其进行基准测试并将其与其他人进行比较),但如果你对本地做同样的事情变量和使用通用数组变得非常慢.我不确定为什么,但它为我提出了更多关于数组使用的问题.
这叫什么_Bytes(I)
电话?它不是每次都加载文件,是吗?即使有缓冲,这也是坏消息!
在一次查看多头,可能使用不安全的代码等方面,将有很多方法可以微观优化这一点 - 但我只是专注于首先获得合理的性能.显然,有一些非常奇怪的事情发生.
我建议你将比较代码提取到一个单独的函数中,该函数需要两个字节的数组.这样你知道你不会做任何奇怪的事情.我也会使用一个简单的For
循环而不是For Each
在这种情况下 - 它会更简单.哦,先检查长度是否正确:)
编辑:这是我使用的代码(未经测试,但很简单).这是在C#中的一分钟 - 我将在一秒钟内转换它:
public static bool Equals(byte[] first, byte[] second) { if (first == second) { return true; } if (first == null || second == null) { return false; } if (first.Length != second.Length) { return false; } for (int i=0; i < first.Length; i++) { if (first[i] != second[i]) { return false; } } return true; }
编辑:这是VB:
Public Shared Function ArraysEqual(ByVal first As Byte(), _ ByVal second As Byte()) As Boolean If (first Is second) Then Return True End If If (first Is Nothing OrElse second Is Nothing) Then Return False End If If (first.Length <> second.Length) Then Return False End If For i as Integer = 0 To first.Length - 1 If (first(i) <> second(i)) Then Return False End If Next i Return True End Function