.net 改进一段c#代码性能的建议
我们正在开发一个高度实时的应用程序。应用程序的性能没有达到标准。我们做了一些性能分析,发现下面的代码占用了大部分时间.net 改进一段c#代码性能的建议,.net,c#-4.0,.net,C# 4.0,我们正在开发一个高度实时的应用程序。应用程序的性能没有达到标准。我们做了一些性能分析,发现下面的代码占用了大部分时间 for (int i = 0; i < _chunkSize; i++) { outputData[i] = (byte)(inputText[i] ^ nonce[i % NonceSize]); } for(int i=0;i300MB)的电影。上述代码段中的nonce是在运行时为每个加密的1MB块计算的,并与该块异或以解密它。您可以避免使用余数运算符将索引保持
for (int i = 0; i < _chunkSize; i++)
{
outputData[i] = (byte)(inputText[i] ^ nonce[i % NonceSize]);
}
for(int i=0;i<\u chunkSize;i++)
{
outputData[i]=(字节)(输入文本[i]^nonce[i%NonceSize]);
}
其中\u chunkSize
为1024000
,NonceSize
为16
。变量inputText
、outputData
和nonce
是byte
数组
请建议对此代码段进行更改以提高性能
编辑
提供更多的上下文-
我有一个自己开发的DRM系统,我使用CTR加密算法的自定义.NET实现。在播放电影时,从加密的媒体文件中读取1 MB的电影块,在内存中解密,并将其输入播放器。解密运行缓慢,因此播放机无法播放较大大小(>300MB)的电影。上述代码段中的nonce是在运行时为每个加密的1MB块计算的,并与该块异或以解密它。您可以避免使用余数运算符将索引保持在
[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]);
}
没有
1133 1197 1122 973 976 1032 1460 1229 1211 1145
Average: 1147.8
如果没有余数运算符,循环速度将提高13.6%。您可以避免使用余数运算符将索引保持在
[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]);
}
没有
1133 1197 1122 973 976 1032 1460 1229 1211 1145
Average: 1147.8
如果没有余数运算符,循环速度将提高13.6%。您可以避免使用余数运算符将索引保持在
[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]);
}
没有
1133 1197 1122 973 976 1032 1460 1229 1211 1145
Average: 1147.8
如果没有余数运算符,循环速度将提高13.6%。您可以避免使用余数运算符将索引保持在
[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]);
}
没有
1133 1197 1122 973 976 1032 1460 1229 1211 1145
Average: 1147.8
没有余数操作符,循环速度加快了13.6%。如果没有更多关于您在这里所做工作的信息,很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是
\u chunkSize
的杀手-通过循环进行1024000次迭代。循环的主体可以很快,但at仍然是您花费大量时间的地方:优化循环体的结果将少于计算是否/如何减少\u chunkSize
。您能否将其更改为int
或long
数组,以便一次处理4或8个字节?代码的内容是什么?除非看到较大的p,否则无法正确进行优化icture。一个非常简单的建议可能是“处理long
s而不是byte
s以利用您的CPU带宽”。但是,除非您公开整个算法,再加上您当前的性能结果,以及目标是什么(以及为什么),否则将一事无成。如果没有更多关于您在这里所做工作的信息,就很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是\u chunkSize
的杀手-通过循环进行1024000次迭代。循环体可以很快,但这仍然是您花费大量时间的地方:优化loop的主体产生的结果将少于计算是否/如何减少\u chunkSize
。能否将其更改为int
或long
数组以一次处理4或8个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“processlongs而不是byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义。如果没有更多关于您在这里所做工作的信息,就很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是\u chunkSize
的杀手-通过循环进行1024000次迭代。循环体可以很快,但这仍然是您花费大量时间的地方:优化loop的主体产生的结果将少于计算是否/如何减少\u chunkSize
。能否将其更改为int
或long
数组以一次处理4或8个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“processlongs而不是byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义。如果没有更多关于您在这里所做工作的信息,就很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是\u chunkSize
的杀手-通过循环进行1024000次迭代。循环体可以很快,但这仍然是您花费大量时间的地方:优化loop的主体产生的结果将少于计算是否/如何减少\u chunkSize
。能否将其更改为int
或long
数组以一次处理4或8个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“processlongs而不是byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义.有任何具体的衡量改进吗?@OndrejTucny我添加了一些具体的衡量改进吗?@OndrejTucny我添加了一些具体的衡量改进吗?@OndrejTucny我添加了一些数字