我想知道什么是更快并且使用更少的内存,我会假设它的块,但它们可能是相同的:
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";
还是有更快的方法?感谢。
答案 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是模板的实例,则总是预先计算,以防[]
对于特定类型而言是昂贵的。