for C++中的循环和性能关键应用程序

spe*_*ber 0 c++

我正在尝试为性能关键应用程序编写快速C++代码,但我对编译器和编译器实现的了解有限.我目前正在使用gcc编译器.因此,我想知道在实践中是否存在写入的for循环之间的性能差异

//size is int argument

for( int i = 0; i < size; ++i )
{
    //code sequence C
}
Run Code Online (Sandbox Code Playgroud)

和写的for循环

//struct definition
struct s
{
    int size;

    //[...]
};

//[...]

//obj is reference of type s& (say)

for( int i = 0; i < obj.size; ++i )
{
    //code sequence C
}
Run Code Online (Sandbox Code Playgroud)

当然,在哪里,sizeobj.size采取相同(大!)的int价值.所以问题是:在实践中,查找obj.size比查找花费更多时间size.具有恒定大小变量的代码是否会更快?它是否依赖于代码C(如果C足够简单,编译器可能会确定size变量的值是否会发生变化......?!).因此,如果查找obj.size需要更多时间,那么编写是否可取

//obj is reference of type s& (say)

const int size = obj.size;

for( int i = 0; i < size; ++i )
{
    //code sequence C
}
Run Code Online (Sandbox Code Playgroud)

或至少

//objs is std::vector<s> (say)

const int SIZE = objs.size();
int size;

for( int i = 0; i < SIZE; ++i )
{
    size = objs[i].size;

    for( int j = 0; j < size; ++j )
    {
        //code sequence C
    }
}
Run Code Online (Sandbox Code Playgroud)

如果假设一个更复杂的代码示例.

rmm*_*mmh 6

这不太可能成为您代码中的瓶颈.您可以使用perfLinux上的性能分析工具来确定CPU占用大部分时间的位置.

在这种情况下,如果编译器可以证明其正确性,则编译器可以自动执行您描述的转换(Loop Invariant Code Motion).特别是,编译器需要确保obj.size在循环内部没有被修改,因此通过obj引用传递或调用方法obj可能会导致编译器假定obj.size可能被修改,这意味着每次都必须读取它.

通常,假设编译器将在优化代码方面做得很好,如果分析表明它很重要,则返回并手动进行微优化.