2011-04-24 66 views
2

我有一個大型的字節數組,其中大部分爲0,但有些值需要處理。如果這是C++或不安全的C#我會使用一個32位指針,只有當前的32位不是0,我會看看單個字節。這使得通過全部0個塊的掃描速度更快。不幸的是,這必須是安全的C#:-)作爲uint數組掃描字節數組

我可以使用一個uint數組,而不是一個字節數組,然後操縱個別字節,但它使我做的比我想象的更雜亂。我正在尋找更簡單的東西,比如指針示例(我想念指針嘆息

謝謝!

回答

2

如果代碼必須安全,並且您不想使用更大的類型和「移位」,那麼您必須迭代每個字節。

(編輯)如果數據足夠稀疏,您可以使用字典來存儲非零值;那麼找到非零值是微不足道的(而且稀疏數組變得很便宜)。

+0

你可能是對的,我也不知道有什麼辦法做到這一點,很遺憾,這是一個非常簡單的性能提升,移位等等,實際上會讓它變慢大多數字節不是零的情況(但通常它們大多爲零)。 – Rabbit 2011-04-24 19:49:10

+2

@ user72185 - 有一點需要檢查; WP7是否支持顯式佈局對結構?我不認爲*它確實,但值得一試? – 2011-04-24 20:22:17

0

您可以訪問字符

string.ToCharArray() 

或者您也可以訪問原始字節[]

Text.Encoding.UTF8Encoding.GetBytes(stringvalue) 

歸根結底,我認爲你需要在這裏是

MemoryStream stream; 
stream.Write(...) 

那麼你將可以直接刪除內存的緩衝區

還有UnmanagedMemoryStream,但我不知道是否會使用內部

+0

誰提到了字符串? – 2011-04-24 18:04:11

+0

嗯,我想我可以說:「我做了」LOL – sehe 2011-04-24 18:09:25

2

不安全電話我會關注你這個傢伙說: Using SSE in c# is it possible?

基本上,編寫C/C一點點++,可能使用SSE來有效地實現掃描部分,並從C#中調用它。

+0

在某些方面,「通過隱形不安全:將不安全的代碼放在我們看不到的地方」......當然,OP當然是否合理。 – 2011-04-24 18:23:52

+0

我想要,但它必須在Windows Phone 7上運行,所以它不是一個選項:( – Rabbit 2011-04-24 19:44:26

+0

@Marc:它不僅僅是隱形的,它允許應用SSE指令,否則將不會被使用(因爲它們不能被明確地編碼在.NET本身,據我所知) – 2011-04-24 21:09:38

0

可以使用BitConverter類:

byte[] byteArray = GetByteArray(); // or whatever 
for (int i = 0; i < b.Length; I += 2) 
{ 
    uint x = BitConverter.ToUInt32(byteArray, i); 
    // do what you want with x 
} 

另一個選擇是創建從字節數組一個MemoryStream,然後使用一個BinaryReader從中讀取32位值。

+0

這缺乏OP正在尋找的性能提升。 – 2011-04-24 20:36:36