如果更快,更少的内存?

时间:2015-02-04 16:05:00

标签: c++ performance

我想知道什么是更快并且使用更少的内存,我会假设它的块,但它们可能是相同的:

if((X[i] == 0 && Y[i] == 0) ||
    (X[i] == 1 && Y[i] == 1) ||
    (X[i] == 0 && Y[i] == 2) ||
    (X[i] == -1 && Y[i] == 3) ||
    (X[i] == -2 && Y[i] == 2) ||
    (X[i] == -3 && Y[i] == 1) ||
    (X[i] == -4 && Y[i] == 0)) cout << "DA";

或者可能是这个块:

if(X[i] == 0 && Y[i] == 0) cout << "DA";
else if(X[i] == 1 && Y[i] == 1) cout << "DA";
else if(X[i] == 0 && Y[i] == 2) cout << "DA";
else if(X[i] == -1 && Y[i] == 3) cout << "DA";
else if(X[i] == -2 && Y[i] == 2) cout << "DA";
else if(X[i] == -3 && Y[i] == 1) cout << "DA";
else if(X[i] == -4 && Y[i] == 0) cout << "DA";

还是有更快的方法?感谢。

3 个答案:

答案 0 :(得分:6)

如果您的编译器有价值,两者都将导致完全相同的编译代码 如果禁用所有优化,可能会出现例外情况,这种情况对优化来说根本就没有意义。

因此,使用更清晰的代码,如果有疑问,则使用较短的代码:
使用第一个变体。

如果您想优化某些内容,请考虑只计算X[i]Y[i]一次,如果它们很贵(不太可能)。
此外,您可以根据可能性进行排序(尽管如果没有足够的测试,可能也不值得) 您还可以尝试更改短路操作符以进行非短路操作,以避免跳转(这可能会适得其反)。

顺便说一下,在这种情况下,流插入可能会将条件测试降级为无意义,性能方面。

答案 1 :(得分:4)

首先我要说的是,你在这里所做的一切都不会对速度或内存使用产生明显的影响。简单的事实是,导致写入cout的逻辑所需的时间将在噪声中完全丢失。对cout本身的写入将是如此绝大多数时间,(至少通常)变化如此广泛以至于其余逻辑的时间是100%不相关的

那就是说,你几乎可以肯定地减少逻辑的其余部分。第一次检查x [i] == 0&amp;&amp; y [i] == 0可以缩减为x[i] | y[i] == 0。看起来余数可以减少到unsigned(x[i])+4u < 5u && x[i] + y[i] == 2

将6个条件降低到3个条件+一点点数学。如果这是一个没有任何I / O的紧凑循环,我希望它明显更快(但结果是写入流,你可能甚至不能衡量可靠的差异,更不用说注意差异了。)

答案 2 :(得分:3)

就个人而言,为了清晰和重复,我会选择第一个。

同样利用短切:将最可能的情况放在第一位。

如果X和Y是具有昂贵的重载[]运算符的类的实例,则预先计算X[i]Y[i]。请注意,[]与trival类型的变量访问一样便宜。如果X和Y是模板的实例,则总是预先计算,以防[]对于特定类型而言是昂贵的。