我们正在开发一种高度实时的应用程序。该应用程序未达标。我们做了一些性能分析,发现下面的代码占用了大部分时间
for (int i = 0; i < _chunkSize; i++)
{
outputData[i] = (byte)(inputText[i] ^ nonce[i % NonceSize]);
}
_chunkSize
为1024000
且NonceSize
为16
。变量inputText
,outputData
和nonce
是byte
数组。
请建议更改此代码段以提高效果
修改
提供更多背景信息 -
我开发了自己的DRM系统,我使用CTR加密算法的自定义.NET实现。在播放电影时,从加密的媒体文件中读取1 MB的电影块,在存储器中解密并馈送到播放器。解密运行缓慢,因此播放器无法播放更大尺寸(> 300MB)的电影。上面一段代码中的nonce是在运行时为每个加密的1 MB块计算的,并与块进行XOR处理以对其进行解密。
答案 0 :(得分: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%。