内存效率与处理器效率

标签 memory process

在一般使用中,我应该押注于内存效率还是处理器效率?

最后,我知道这必须符合软件/硬件规范。但我认为没有界限时存在一般规则。

示例01(内存效率):

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

示例 02(处理器效率):

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

它们只是简单的示例,编写它们是为了展示我的意思。更好的例子将会受到欢迎。

提前致谢。

最佳答案

我将拿出通用性能问题王牌并说“都不是,赌正确性”。

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

(好像为了举例说明,假设 getRndNumber() 不返回常量值,您的“简单示例”会有不同的行为。如果您以最简单的方式编写它,例如 n = max(0, getRndNumber()) 那么它可能效率较低,但它会更具可读性并且更有可能是正确的。)

<小时/>

编辑:

为了回答下面德文的批评,我可能应该说明为什么我认为这个问题没有普遍的答案。

一个很好的例子是从序列中随机抽取样本。对于足够小的序列可以复制到另一个连续的内存块中,有利于计算效率的部分 Fisher-Yates 混洗是最快的方法。然而,对于没有足够内存可分配的非常大的序列,必须使用像水库采样这样有利于内存效率的方法;这将慢一个数量级。

那么这里的一般情况是什么呢?对于序列采样,您应该优先考虑 CPU 效率还是内存效率?如果不知道序列的平均和最大大小、机器中的物理和虚拟内存量、可能的并发采样数量、机器上运行的其他代码的 CPU 和内存要求等信息,您根本无法判断。 ,甚至诸如应用程序本身是否需要注重速度或可靠性之类的事情。即使您确实知道所有这些,那么您仍然只是猜测,您并不真正知道该支持哪一个。

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

关于内存效率与处理器效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1977829/

相关文章:

c++ - 释放静态内存?不,那不可能

java - 为什么 boolean 值在数组中占用的内存更少?

c++ - 如何确定 C++ 中对象的大小?

c++ - Bash 在子 shell 中的后台运行命令

javascript - 通过 nodejs 重新附加到生成的进程

c - for 循环内出现 fork,进程过多

android - 如何以编程方式清除 Android 中的非 Activity 内存?

c# - 统一: What's allocating memory in my function?

shell - 如何在unix中使用进程ID仅获取进程名称

Windows,多进程与多线程