内存效率与处理器效率

时间:2009-12-30 00:40:28

标签: memory process

在一般情况下,我应该打赌内存效率还是处理器效率?

最后,我知道必须根据软件/硬件规格。但是我觉得在没有边界的情况下有一个普遍的规则。

示例01(记忆效率):

int n=0;   
if(n < getRndNumber())
    n = getRndNumber();

示例02(处理器效率):

int n=0, aux=0;
aux = getRndNumber();
if(n < aux)
    n = aux;

他们只是简单的例子并写下来以表明我的意思。更好的例子会很受欢迎。

提前致谢。

7 个答案:

答案 0 :(得分:11)

我将推出普遍性能问题王牌并说“不要赌,不要赌正确”。

以最清晰的方式编写代码,设置具体的可测量性能目标,测量软件性能,对其进行分析以找出瓶颈,然后在必要时优化了解处理器或内存是否是您的问题。

(好像是为了说明一点,你的'简单例子'有不同的行为,假设getRndNumber()没有返回一个常量值。如果你用最简单的方式写它,就像{{ 1}}然后它可能效率较低,但它更具可读性,更可能是正确的。)


修改

为了回答下面对德温的批评,我应该说明为什么我认为这个问题没有一般的答案。

一个很好的例子是从序列中随机抽取样本。对于小到足以被复制到另一个连续存储块的序列,有利于计算效率的部分Fisher-Yates shuffle是最快的方法。然而,对于可用于分配的内存不足的非常大的序列,必须使用诸如有利于存储器效率的储层采样之类的东西;这将慢一个数量级。

那么这里的一般情况是什么?对于序列的采样,您是否应该支持CPU或内存效率?如果不知道序列的平均大小和最大大小,机器中物理和虚拟内存的数量,可能的并发采样数,机器上运行的其他代码的CPU和内存要求,您根本无法分辨甚至应用程序本身是否需要支持速度或可靠性。即使你确实知道这一切,那么你仍然只是猜测,你并不真正知道哪一个赞成。

因此,唯一合理的做法是以有利于清晰度和可维护性的方式实施代码(将您所了解的因素考虑在内,并假设清晰度不以总效率低为代价),在现实生活中衡量它情况,看它是否导致问题和问题是什么,然后如果是这样改变它。大多数情况下,您不必更改代码,因为它不会成为瓶颈。这种方法的最终结果是,您将拥有一个清晰且可维护的代码库,其中特别需要对CPU和/或内存进行高效优化的小部件进行优化。

答案 1 :(得分:2)

你必须根据特定的应用程序,用法等来决定。在上面的例子中,内存和处理器的使用都是微不足道的,所以不是一个很好的例子。

更好的例子可能是在国际象棋搜索中使用历史表。如果在游戏树的其他分支中或在下一次移动中重新搜索它们,则该方法将先前搜索的位置高速缓存在游戏树中。

然而,它确实需要花费空间来存储它们,而且空间也需要时间。如果耗尽太多内存,最终可能会使用速度很慢的虚拟内存。

另一个例子可能是数据库服务器中的缓存。显然,从主内存访问缓存结果会更快,但是再次保持加载和释放不太可能被重用的内存数据也不是一个好主意。

换句话说,你无法概括。您甚至无法根据代码做出决定 - 有时必须在可能的数据和使用模式的背景下做出决定。

答案 2 :(得分:2)

你认为一个与另一个无关?为什么你这么想?这里有两个例子,你会发现经常被发现的未被考虑的瓶颈。

示例1

您设计了一个与数据库相关的软件系统,并在您阅读其中一个表时发现I / O正在减慢速度。您可以先获取整个表,而不是允许多个查询导致多个I / O操作。现在表的所有行都在内存中,唯一的限制应该是CPU。在背后拍拍自己,你想知道为什么你的程序在内存不佳的计算机上变得非常慢。哦,亲爱的,你已经忘记了虚拟内存,交换等等。

示例2

你编写一个程序,你的方法创建许多小对象,但是拥有O(1),O(log)或最差的O(n)速度。您已针对速度进行了优化,但发现您的应用程序需要很长时间才能运行。奇怪的是,你想知道罪魁祸首是什么。令你懊恼的是,你会发现所有这些小物体都会快速增加。您的代码被GC阻止。

答案 3 :(得分:0)

过去10年。主存储器的速度几乎没有增加,而处理器继续竞争。没有理由相信这会改变。

编辑:很明显,在你的例子中,aux很可能最终会进入一个寄存器,而根本不会进入内存。

答案 4 :(得分:0)

还值得考虑您希望优化的操作范围;如果操作是时间敏感的,比如说Web请求或GUI更新的一部分,那么在完成它的过程中犯错误比保存内存更好。

答案 5 :(得分:0)

如果没有上下文,我认为优化除可读性和灵活性之外的任何其他内容

因此,我唯一同意的一般规则是“为了提高可读性,同时考虑到未来某些时候您可能需要针对内存或处理器效率进行优化”。

对不起它不像你想要的那样吸引人......

在你的例子中,版本2显然更好,即使版本1对我来说更漂亮,因为正如其他人所指出的那样,多次调用getRndNumber()需要更多关于getRndNumber()的知识。

答案 6 :(得分:-1)

处理器效率。与处理器相比,内存速度极慢。有关详细信息,请参阅this link

虽然在您的示例中,两者可能会被编译器优化为等效。