0

我在这里有一些简单且非常基本的问题,但我想永远结束一次,所以我决定提出要求。好的,这里有代码和问题:

是这样的

for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1; // x is something

比类似的东西更好

for (n=0;n<length;++n) {
  if (n != x) countsc[n]=0;
  else countsc[n]=1;
}

或者也

for (n=0;n<length;++n) countsc[n]=(n != x ? 0 : 1);

在性能和优化方面(速度、cpu 和内存使用)?例如,使用 Javascript 和/或 PHP 测量它是一种怎样的便捷方式?答案通常对所有编程语言都有效还是可能不同?

以类似的方式,类似于

a=0;
if (condition == true) a=1;

一般优于

if (condition == true) a=1;
else a=0;

或者也

a = (condition == true ? 1 : 0);

什么时候条件通常是错误的?

4

4 回答 4

2

可能不是您要寻找的答案,但总的来说,我认为没有一种通用的方法可以从代码的静态分析中找出答案。这不仅会因语言而异,而且可能会因运行它的架构而异。我怀疑任何半体面的编译器都应该优化这些,所以几乎没有/没有区别,但这对于解释语言来说可能不太可能。

如果它确实是代码的性能关键部分(并且您只能通过分析知道这一点),那么您将获得的最佳答案将是使用相关语言分析和比较目标架构上的两个候选代码部分。

于 2013-10-20T15:23:57.040 回答
0

我会认为

for (n = 0; n < x; ++n)
    countsc[n] = 0;
countsc[x] = 1;
for (n = x + 1; n < length; ++n)
    countsc[n] = 0;

会比使用条件更好,并且避免重写 countsc[x]。当然,一切都是 O(n),您不会注意到程序速度的任何变化。

于 2015-01-30T14:20:08.837 回答
0

根据编译器(或解释器,如果合适的话)的质量,

for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1;

更容易优化,因为没有(错误)预测的分支。countsc[x]与需要测试n每次迭代以及在

for (n=0;n<length;++n) {
  if (n != x) countsc[n]=0;
  else countsc[n]=1;
}

在分支预测方面,您使用三元运算符的第三个示例与第二个示例相同。

但是,除非这是一个紧密的内部循环,它要么经常执行和/或对于非常大的 值length,否则您使用哪种方法来查看程序的整体运行时间并不重要。

于 2013-10-20T15:21:42.733 回答
0
for (n=0;n<length;++n) countsc[n]=0;
countsc[x]=1;

是性能更高的选项,假设比较和分配的成本大致相同。

相似地,

if (condition) a=1; // boolean == true is not pretty
else a=0;

应该更高效;您只有一项作业和一次跳跃,而替代版本最多有两项作业和一次跳跃。这个版本

a = (condition == true ? 1 : 0);

应该一样好,我希望它被编译成与 if-else 版本相同的代码。

于 2013-10-20T15:22:59.037 回答