我有一个包含一些属性的结构(如int A1
,int A2
,...)。我将一个struct列表作为二进制文件存储在一个文件中。
现在,我正在使用二进制阅读器将文件中的字节读入Buffer
,我想根据结构的属性(如.A1 = 100 & .A2 = 12
)应用过滤器。
在我的场景中,性能非常重要,因此我将过滤条件转换为字节数组(Filter
),然后我想用Buffer
屏蔽Filter
。如果屏蔽结果等于Filter
,则Buffer
将转换为结构。
问题:屏蔽和比较两个字节数组的最快方法是什么?
更新: Buffer
大小超过256个字节。我想知道是否有更好的方法而不是在Buffer
和Filter
的每个字节中进行迭代。
答案 0 :(得分:3)
尝试使用System.BitConverter.ToInt64()
的简单循环。像这样:
byte[] arr1;
byte[] arr2;
for (i = 0; i < arr1.Length; i += 8)
{
var P1 = System.BitConverter.ToInt64(arr1, i);
var P2 = System.BitConverter.ToInt64(arr2, i);
if((P1 & P2) != P1) //or whatever
//break the loop if you need to.
}
我的假设是比较/屏蔽两个Int64
将比一次屏蔽一个字节要快得多(特别是在64位机器上)。
答案 1 :(得分:3)
我通常采用unsafe
代码的方法。您可以使用fixed
关键字将byte[]
作为long*
,然后可以在1/8的迭代中迭代 - 但使用相同的位操作。您通常会剩下几个字节(从它不是8个字节的精确倍数) - 之后只需手动清理它们。
答案 2 :(得分:0)
一旦你有两个阵列 - 一个来自读取文件而一个来自过滤器,你需要的只是对阵列的快速比较。查看以下使用不安全或PInvoke方法的帖子。