我正在尝试为性能关键应用程序编写快速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)
当然,在哪里,size
并obj.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)
如果假设一个更复杂的代码示例.
这不太可能成为您代码中的瓶颈.您可以使用perf
Linux上的性能分析工具来确定CPU占用大部分时间的位置.
在这种情况下,如果编译器可以证明其正确性,则编译器可以自动执行您描述的转换(Loop Invariant Code Motion).特别是,编译器需要确保obj.size
在循环内部没有被修改,因此通过obj
引用传递或调用方法obj
可能会导致编译器假定obj.size
可能被修改,这意味着每次都必须读取它.
通常,假设编译器将在优化代码方面做得很好,如果分析表明它很重要,则返回并手动进行微优化.
归档时间: |
|
查看次数: |
74 次 |
最近记录: |