2014-02-05 61 views
0

我們正在開發高度實時的應用程序。該應用程序不符合標誌。我們做了一些性能分析,發現下面這段代碼利用的大部分時間提高一塊c#代碼的性能的建議

for (int i = 0; i < _chunkSize; i++) 
{ 
    outputData[i] = (byte)(inputText[i]^nonce[i % NonceSize]); 
} 

哪裏_chunkSize1024000NonceSize16。變量inputTextoutputDatanoncebyte陣列。

請建議改變這個片段以提高性能

編輯

爲了讓更多的上下文 -

我有一個開發,我使用一個自定義的.NET實現我自己的DRM系統CTR加密算法。在播放電影時,將從加密的媒體文件中讀取1 MB大塊電影,在內存中解密並饋送給播放器。解密運行緩慢,因此播放器無法播放更大尺寸(> 300MB)的電影。上述代碼中的隨機數是在運行時爲每個加密的1 MB塊計算的,並與該塊進行XOR解密。

+4

沒有關於你在這裏做什麼的更多信息,很難提出不同的,更有效的方法。 –

+4

你需要更好的硬件。 DDR4很不錯。 –

+0

這是'_chunkSize',這是殺手 - 通過循環進行1,024,000次迭代。循環的主體可以很快,但這仍然是你花費大量時間的地方:優化循環的主體將比產生/ _如何減少'_chunkSize'少得多。 – J0e3gan

回答

3

您可以避免使用餘數運算符來將索引保留在[0, NonceSize[範圍內,而是手動執行此操作。

int index = 0; 
for (int i = index; i < _chunkSize; i++, index++) 
{ 
    if(index == NonceSize) 
     index = 0; 
    outputData[i] = (byte)(inputText[i]^nonce[index]); 
} 

這可能會有所幫助。


我將_chunkSize增加到102400000,使結果更相關。

其餘操作

1431 1411 1445 1368 1312 1427 1436 1265 1102 1077 
Average: 1327.4 

沒有

1133 1197 1122 973 976 1032 1460 1229 1211 1145 
Average: 1147.8 

沒有餘運算符,循環爲13.6%的速度。

+0

任何*具體*測量的改進? –

+1

@OndrejTucny我添加了一些數字 – dcastro

+0

+1;現在只需從'byte'切換到'long' ... :-) –