我正在尝试优化我的程序核心中的一些算法,我想知道硬件的哪个部分真正“减慢”了一切。
当涉及到编程时,硬件中最重要的两个部分可能是CPU和RAM (以及CPU的高速缓冲存储器?)。但是当涉及到性能时,它们如何一起发挥作用呢?
考虑下面这段代码:
std::vector<int> vec;
for(int count = 0; count < 100000; count++)
{
vec.push_back(count);
}在这种情况下,真正使算法变慢的部分是内存写入RAM的速度(?)。CPU的速度几乎不会对代码的执行时间产生任何影响,因为没有太多要计算的东西,对吧?
但是现在,考虑这段代码:
std::vector<int> vec;
for(int count = 0; count < 100000; count++)
{
vec.push_back(count/10/10/10/10);
}在这种情况下,在插入列表(在RAM上)之前(在CPU上)执行几个算术运算。在这种情况下会有很大的性能影响吗?CPU必须首先计算结果,然后才能将结果写入RAM,所以它肯定会更慢,对吧?
如果这是正确的,那么(据我所知)真正减慢程序速度的是可以写入RAM的速度,而不是CPU的速度,对吧?因为即使有一个更复杂的代码块,它也将始终采用以下形式:
//calculate something and write it to the RAM
int something = calculateSomething();总是会有算术运算,以及内存分配。但是当我查看任务管理器时,我很少看到CPU在100 %地工作--它的结论是肯定有另一个部分减慢了整个过程。
言归正传:在优化算法时,我必须考虑的最重要的事情是什么?分配更少的内存并更频繁地重新计算值,这会增加CPU工作并减少内存分配-还是只计算一次值并将其写入内存?什么会给我的算法带来更多的性能呢?今天的现代硬件中,有哪些部分真正能让代码变得像现在这样快?
已经提前感谢了。
发布于 2014-02-26 17:10:54
即使使用今天的硬件,也可以在一定程度上估计一些事情:算术操作的性能在某种程度上是可以预测的,您可以将一组操作所需的时间计算为单个操作所需时间的总和。粗略地说,高达两倍左右。不幸的是,对于大多数其他操作,这是不可能的。从内存中读取值可能需要1到200个时钟周期。条件跳转的数字是相似的,这取决于分支预测和跳转到的代码的缓存状态。由于这些操作通常会占用大部分性能,因此您很少仅通过查看代码就能猜到瓶颈。使用分析器并准备好迎接一些惊喜,计算平方根可能比从内存中读取结果更快。O(n^2)算法可以比O(n)算法更快。在某些情况下,如果编译器能够证明结果保持不变,它甚至可以将一个转换为另一个。
https://stackoverflow.com/questions/22035033
复制相似问题