c++ - 如何使这段代码更快(学习最佳实践)?

标签 c++ performance gcc

<分区>

我这里有这个小循环,我想知道我是否犯了一些大错误,性能明智。

例如,有没有办法以不同的方式重写部分内容,使矢量化成为可能(假设 GCC4.8.1 和所有矢量化友好标志都已启用)?

这是向列表传递数字 (const float name_of_var[]) 的最佳方式吗?

代码的想法是获取一个 vector (在数学意义上,不一定是 std::vector)(未排序的数字)y和两个绑定(bind)值 ( ox[0]<=ox[1] ) 并存储在整数 vector 中 rdx索引i y 的条目满足 ox[0]<=y[i]<=ox[1].

rdx可以包含 m元素和 y有能力nn>m .如果超过m y[i] 的值满足 ox[0]<=y[i]<=ox[1] 那么代码应该返回第一个 m

提前致谢

void foo(const int n,const int m,const float y[],const float ox[],int rdx[]){
    int d0,j=0,i=0;
    for(;;){
        i++;
        d0=((y[i]>=ox[0])+(y[i]<=ox[1]))/2;
        if(d0==1){
            rdx[j]=i;
            j++;
        }
        if(j==m)    break;
        if(i==n-1)  break;
    }
}

最佳答案

d0=((y[i]>=ox[0])+(y[i]<=ox[1]))/2;
if(d0==1)

我相信使用中间变量是没有用的,多做几个循环

这是我能想到的最优化的版本,但它完全不可读......

void foo(int n, int m, float y[],const float ox[],int rdx[])
{
    for(int i = 0; i < n && m != 0; i++)
    {
        if(*y >= *ox && *y <= ox[1])
        {
            *rdx=i;
            rdx++;
            m--;
        }
        y++;
    }
}

我认为以下具有良好优化标志的版本应该可以完成这项工作

void foo(int n, int m,const float y[],const float ox[],int rdx[])
{
    for(int j = 0, i = 0; j < m && i < n; i++) //Reorder to put the condition with the highest probability to fail first
    {
        if(y[i] >= ox[0] && y[i] <= ox[1])
        {
            rdx[j++] = i;
        }
    }
}

关于c++ - 如何使这段代码更快(学习最佳实践)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821651/

相关文章:

ruby - 如何改善 jRuby 加载时间?

在触发操作中使用 system() 时,C++ QT QFileDialog 不会关闭

c++ - 函数调用与局部变量

c++ - 尝试嵌入 v8 的链接器错误

c++ - 如何在 x3 中用 qi::_1/qi::_N 重写 qi 解析器?

SQL:long varchar 及其对性能的影响

iphone - Objective C 是否足够快用于 DSP/音频编程

c - 为什么会出现 "assigning to ' int *' from incompatible type ' void *' "错误?

c - 在运行时加载动态库会产生不一致和意外的结果、缺少符号和空 PLT 条目。为什么?

c - asm x86 中变量声明的顺序?