首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化代码- CPU与内存

优化代码- CPU与内存
EN

Stack Overflow用户
提问于 2014-02-26 15:51:34
回答 3查看 2.6K关注 0票数 1

我正在尝试优化我的程序核心中的一些算法,我想知道硬件的哪个部分真正“减慢”了一切。

当涉及到编程时,硬件中最重要的两个部分可能是CPU和RAM (以及CPU的高速缓冲存储器?)。但是当涉及到性能时,它们如何一起发挥作用呢?

考虑下面这段代码:

代码语言:javascript
复制
std::vector<int> vec;
for(int count = 0; count < 100000; count++)
{
    vec.push_back(count);
}

在这种情况下,真正使算法变慢的部分是内存写入RAM的速度(?)。CPU的速度几乎不会对代码的执行时间产生任何影响,因为没有太多要计算的东西,对吧?

但是现在,考虑这段代码:

代码语言:javascript
复制
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的速度,对吧?因为即使有一个更复杂的代码块,它也将始终采用以下形式:

代码语言:javascript
复制
//calculate something and write it to the RAM
int something = calculateSomething();

总是会有算术运算,以及内存分配。但是当我查看任务管理器时,我很少看到CPU在100 %地工作--它的结论是肯定有另一个部分减慢了整个过程。

言归正传:在优化算法时,我必须考虑的最重要的事情是什么?分配更少的内存并更频繁地重新计算值,这会增加CPU工作并减少内存分配-还是只计算一次值并将其写入内存?什么会给我的算法带来更多的性能呢?今天的现代硬件中,有哪些部分真正能让代码变得像现在这样快?

已经提前感谢了。

EN

Stack Overflow用户

发布于 2014-02-26 17:10:54

即使使用今天的硬件,也可以在一定程度上估计一些事情:算术操作的性能在某种程度上是可以预测的,您可以将一组操作所需的时间计算为单个操作所需时间的总和。粗略地说,高达两倍左右。不幸的是,对于大多数其他操作,这是不可能的。从内存中读取值可能需要1到200个时钟周期。条件跳转的数字是相似的,这取决于分支预测和跳转到的代码的缓存状态。由于这些操作通常会占用大部分性能,因此您很少仅通过查看代码就能猜到瓶颈。使用分析器并准备好迎接一些惊喜,计算平方根可能比从内存中读取结果更快。O(n^2)算法可以比O(n)算法更快。在某些情况下,如果编译器能够证明结果保持不变,它甚至可以将一个转换为另一个。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22035033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档