[英]Fast byte array masking in C#
我有一個具有一些屬性的結構(如int A1
, int A2
,...)。 我將一個struct列表作為二進制文件存儲在一個文件中。
現在,我正在使用二進制閱讀器將文件中的字節讀入Buffer
,我想根據結構的屬性應用過濾器(如.A1 = 100 & .A2 = 12
)。
性能在我的場景中非常重要,所以我將過濾條件轉換為字節數組( Filter
),然后我想用Filter
屏蔽Buffer
。 如果掩碼的結果等於Filter
,則Buffer
將轉換為struct。
問題:屏蔽和比較兩個字節數組的最快方法是什么?
更新: Buffer
大小超過256個字節。 我想知道是否有更好的方法而不是迭代Buffer
和Filter
每個字節。
嘗試使用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位機器上)。
我通常采用的方法是使用unsafe
代碼。 您可以使用fixed
關鍵字將byte[]
作為long*
,然后可以在1/8的迭代中迭代 - 但使用相同的位操作。 您通常會剩下幾個字節(從它不是8字節的精確倍數) - 之后只需手動清理它們。
一旦你有兩個數組 - 一個來自讀取文件而另一個來自過濾器,你需要的只是數組的快速比較。 查看以下使用不安全或PInvoke方法的帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.