在一般使用中,我应该打赌内存效率还是处理器效率?
最后,我知道必须根据软件/硬件规格.但我认为没有边界就有一个普遍的规则.
例01(内存效率):
int n=0;
if(n < getRndNumber())
n = getRndNumber();
Run Code Online (Sandbox Code Playgroud)
例02(处理器效率):
int n=0, aux=0;
aux = getRndNumber();
if(n < aux)
n = aux;
Run Code Online (Sandbox Code Playgroud)
它们只是简单的例子并写下来以表明我的意思.更好的例子将受到欢迎.
提前致谢.
Gre*_*ech 11
我将推出普遍性能问题王牌并说"不要,赌正确性".
以最清晰的方式编写代码,设置具体的可测量性能目标,测量软件性能,对其进行分析以找出瓶颈,然后在必要时优化了解处理器或内存是否是您的问题.
(好像是为了说明一点,你的'简单例子'有不同的行为,假设getRndNumber()没有返回一个常量值.如果你用最简单的方式写它,n = max(0, getRndNumber())那么它可能效率较低但是它会更可读,也更可能是正确的.)
编辑:
为了回答下面对德尔文的批评,我应该说明为什么我认为这个问题没有一般性的答案.
一个很好的例子是从序列中随机抽取样本.对于小到足以被复制到另一个连续存储块的序列,有利于计算效率的部分Fisher-Yates shuffle是最快的方法.然而,对于可用于分配的内存不足的非常大的序列,必须使用诸如有利于存储器效率的储层采样之类的东西; 这将慢一个数量级.
那么这里的一般情况是什么?对于序列的采样,您是否应该支持CPU或内存效率?如果不知道序列的平均大小和最大大小,机器中的物理和虚拟内存量,可能的并发采样数,机器上运行的其他代码的CPU和内存要求,您根本无法分辨甚至应用程序本身是否需要支持速度或可靠性.即使你确实知道这一切,那么你仍然只是猜测,你真的不知道哪一个赞成.
因此,唯一合理的做法是以有利于清晰度和可维护性的方式实施代码(将您所知道的因素考虑在内,并假设清晰度不以总效率低为代价),在实际情况中进行测量以查看它是否导致问题以及问题是什么,然后如果改变它.大多数情况下,您不必更改代码,因为它不会成为瓶颈.这种方法的最终结果是,您将拥有一个清晰且可维护的代码库,其中特别需要对CPU和/或内存进行高效优化的小部件进行优化.