有可能加速这个片段吗?
firstSample和lastSample是我对这个迭代感兴趣的数组的一部分。当这个间隔达到> 3000时,我得到了一个明显的减速。_average数组可以包含6-6 000万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++;
}
发布于 2009-06-27 22:02:59
_averagesample表达式是一个巨大的瓶颈,因为它包含对每个迭代的隐式边界检查。使用指向"_average“数组(和不安全关键字)的指针。然后避免调用任何函数,所以不要调用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++;
}
}
}
最后,由于"sample“实际上没有在循环中使用,所以可以将其更改为一个循环变量,该循环变量可以计数为零,因此循环终止检查是针对一个常量(零)而不是一个变量进行的。
发布于 2009-06-27 22:20:13
不安全的代码将允许您使用指针来索引数组,因为在这种情况下,JIT编译器将无法删除边界检查。看看这里是怎么做的。
您也可以尝试插入Min/Max调用自己,但很有可能JIT已经为您这样做了。
最后,使用.NET 4的并行扩展(您可以使用.NET 3.5的CTP )来并行化这一点非常容易。只需确保不要同时从多个线程写入min/max值。但是,也不要锁定它,我将为每个线程提供一个min/max值,并在完成所有线程/任务时对每个线程/任务的min/max值进行最后的比较。
发布于 2009-06-27 21:52:39
如果您有3.5+框架,您可以使用FOR比while更快,也可以使用并行。
https://stackoverflow.com/questions/1053705
复制相似问题