sak*_*sak 0 c++ optimization performance stl vector
什么是更快和/或更好?
vector<myType> myVec;
int i;
myType current;
for( i = 0; i < 1000000; i ++ )
{
current = myVec[ i ];
doSomethingWith( current );
doAlotMoreWith( current );
messAroundWith( current );
checkSomeValuesOf( current );
}
Run Code Online (Sandbox Code Playgroud)
要么
vector<myType> myVec;
int i;
for( i = 0; i < 1000000; i ++ )
{
doSomethingWith( myVec[ i ] );
doAlotMoreWith( myVec[ i ] );
messAroundWith( myVec[ i ] );
checkSomeValuesOf( myVec[ i ] );
}
Run Code Online (Sandbox Code Playgroud)
我目前正在使用第一个解决方案.每秒真的有数百万次调用,每一位比较/移动都是性能问题.
jal*_*alf 11
第一个版本可能不必要地昂贵,因为它依赖于在向量中创建对象的副本.除非myType
是一些非常小而简单的对象,比如int
存储引用可能是一个更好的主意.它也应该在您需要它时声明,而不是更早,以限制可能导致编译器发出效率较低的代码的别名问题:
vector<myType> myVec;
for(int i = 0; i < 1000000; i ++ )
{
myType& current = myVec[ i ];
doSomethingWith( current );
doAlotMoreWith( current );
messAroundWith( current );
checkSomeValuesOf( current );
}
Run Code Online (Sandbox Code Playgroud)
创建副本而不是使用引用的一个优点是,它可能导致编译器将对象加载到寄存器中,而不是在每次访问时从内存中读取它.所以这两个版本都值得一试.
当然,复制与参考建议也适用于您的每个功能.他们是通过价值还是参考来论证?根据他们对它的处理方式以及如何myType
定义,可能比另一个更快.
第二个版本是有缺陷的,因为它(除非编译器能够优化它)需要每次在内存中查找对象.根据您的STL实现,由于边界检查,可能还会有一些开销operator[]
.
首先创建一个临时的,然后传递给你的每个函数是正确的方法.问题是该临时值是否应为值类型(myType
)或引用类型(myType&
/ const myType&
)
另一个可能值得探索的选择是将每个函数调用放在它自己的独立循环中.这在某些方面会损害数据局部性,但如果某些函数使用大量本地数据,则可能会表现得更好.它也可以在指令缓存中发挥更好的作用.
但实际上,性能非常复杂.缓存,乱序执行,myType
(特别是其复制构造函数和大小)的确切语义以及编译器执行的优化量都是我们都不知道的.所以我们不能给你一个可靠的答案.
猜猜谁可以:你的编译器.写测试.试试两个.时间结果.选择更快的一个.
归档时间: |
|
查看次数: |
290 次 |
最近记录: |