Nif*_*fle 1 .net c# algorithm optimization
是否有可能加快这个片段的速度?
firstSample和lastSample是我对此迭代感兴趣的数组的一部分.当这个间隔达到> 3000时,我得到明显的减速.该_average阵列可以容纳6-60万人INT值.
minY和maxY是我在完成此计算后使用的结果.
int minY = Int32.MaxValue;
int maxY = Int32.MinValue;
int Y = 0;
int sample = firstSample + 1;
while (sample <= lastSample)
{
Y = _average[sample];
minY = Math.Min(Y, minY);
maxY = Math.Max(Y, maxY);
sample++;
}
Run Code Online (Sandbox Code Playgroud)
_average [sample]表达式是一个巨大的瓶颈,因为它包含对每次迭代的隐式边界检查.使用指向"_average"数组(和unsafe关键字)的指针.然后避免调用任何函数,所以摆脱Math.Min/Max调用并自己进行检查.
我现在没有任何编译器,我认为它应该是这样的:
unsafe
{
fixed ( int* paverage = _average )
{
int* p = paverage + firstSample + 1;
for ( int sample = firstSample+1 ; sample <= lastSample ; sample++ )
{
if ( *p < minY )
minY = *p;
if ( *p > maxY )
maxY = *p;
p++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,由于"sample"实际上并未在循环中使用,因此可以将其更改为循环变量,该变量向下计数到零,以便对常量(零)而不是变量进行循环终止检查.
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |