Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 改进一段c#代码性能的建议_.net_C# 4.0 - Fatal编程技术网

.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个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“process
longs而不是
byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义。如果没有更多关于您在这里所做工作的信息,就很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是
\u chunkSize
的杀手-通过循环进行1024000次迭代。循环体可以很快,但这仍然是您花费大量时间的地方:优化loop的主体产生的结果将少于计算是否/如何减少
\u chunkSize
。能否将其更改为
int
long
数组以一次处理4或8个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“process
longs而不是
byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义。如果没有更多关于您在这里所做工作的信息,就很难提出不同的、更有效的方法。您需要更好的硬件。DDR4很好。它是
\u chunkSize
的杀手-通过循环进行1024000次迭代。循环体可以很快,但这仍然是您花费大量时间的地方:优化loop的主体产生的结果将少于计算是否/如何减少
\u chunkSize
。能否将其更改为
int
long
数组以一次处理4或8个字节?代码的内容是什么?除非看到全局,否则无法正确进行优化。一个非常简单的建议可能是“process
longs而不是
byte
s来利用您的CPU带宽。但是,除非您将算法作为一个整体公开,再加上您当前的性能结果是什么,以及目标是什么(以及为什么),否则这将毫无意义.有任何具体的衡量改进吗?@OndrejTucny我添加了一些具体的衡量改进吗?@OndrejTucny我添加了一些具体的衡量改进吗?@OndrejTucny我添加了一些数字