首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >帮助我优化这个平均计算片段

帮助我优化这个平均计算片段
EN

Stack Overflow用户
提问于 2009-06-27 21:48:50
回答 8查看 434关注 0票数 1

有可能加速这个片段吗?

firstSamplelastSample是我对这个迭代感兴趣的数组的一部分。当这个间隔达到> 3000时,我得到了一个明显的减速。_average数组可以包含6-6 000万int值。

minYmaxY是完成此计算后使用的结果。

代码语言:javascript
运行
复制
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++;
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-06-27 22:02:59

_averagesample表达式是一个巨大的瓶颈,因为它包含对每个迭代的隐式边界检查。使用指向"_average“数组(和不安全关键字)的指针。然后避免调用任何函数,所以不要调用Math.Min/Max调用,这样就可以自己进行检查。

现在没有任何编译器在我手中,我认为它应该是这样的:

代码语言:javascript
运行
复制
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“实际上没有在循环中使用,所以可以将其更改为一个循环变量,该循环变量可以计数为零,因此循环终止检查是针对一个常量(零)而不是一个变量进行的。

票数 9
EN

Stack Overflow用户

发布于 2009-06-27 22:20:13

不安全的代码将允许您使用指针来索引数组,因为在这种情况下,JIT编译器将无法删除边界检查。看看这里是怎么做的。

您也可以尝试插入Min/Max调用自己,但很有可能JIT已经为您这样做了。

最后,使用.NET 4的并行扩展(您可以使用.NET 3.5的CTP )来并行化这一点非常容易。只需确保不要同时从多个线程写入min/max值。但是,也不要锁定它,我将为每个线程提供一个min/max值,并在完成所有线程/任务时对每个线程/任务的min/max值进行最后的比较。

票数 1
EN

Stack Overflow用户

发布于 2009-06-27 21:52:39

如果您有3.5+框架,您可以使用FOR比while更快,也可以使用并行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1053705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档