更快,更少的内存,如果?
Faster, less memory if?
我想知道什么速度更快且使用的内存更少,我假设它是这个块,但它们可能是相同的:
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";
或者有没有更快的方法?谢谢
两者都会产生完全相同的编译代码,如果您的编译器值得的话。
也许除了禁用所有优化之外,这种情况根本没有必要进行优化。
因此,使用更清晰的代码,如果有疑问,它是更短的代码:
使用第一个变体。
如果你想优化事物,考虑只计算一次 X[i]
和 Y[i]
,如果它们很昂贵(不太可能)。
此外,您可以根据可能性进行排序(尽管如果测试足够少,也可能不值得)。
您还可以尝试将短路运算符更改为非短路,以避免跳转(这可能适得其反)。
顺便说一句,在这种情况下,流插入可能使条件测试在性能方面变得微不足道。
就个人而言,为了清晰和减少重复,我会选择第一个。
也可以利用捷径:将最有可能的情况放在第一位。
如果 X 和 Y 是具有昂贵的重载 []
运算符的 class 实例,则预计算 X[i]
和 Y[i]
。请注意,[]
与普通类型的变量访问一样便宜。如果 X 和 Y 是模板的实例,那么 总是 预先计算以防万一 []
对于特定类型来说是昂贵的。
首先让我说,您在这里所做的任何事情都不可能对速度或内存使用产生任何显着差异。一个简单的事实是,导致写入 cout
的逻辑所花费的时间将完全消失在噪音中。对 cout
本身的写入将占绝大多数时间, 和 (至少通常)变化如此之大,以至于其余逻辑的时间是100% 无关。
也就是说,您几乎肯定可以稍微减少其余的逻辑。第一次检查 x[i] == 0 && y[i] == 0 可以简化为 x[i] | y[i] == 0
。看起来余数可以减少到 unsigned(x[i])+4u < 5u && x[i] + y[i] == 2
.
这将 6 个条件减少到 3 个条件 + 一点点数学。如果这是一个没有任何 I/O 的紧密循环,我希望它会明显更快(但结果是写入流,您可能甚至无法 可靠地测量差异,更不用说注意到差异了)。
我想知道什么速度更快且使用的内存更少,我假设它是这个块,但它们可能是相同的:
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";
或者有没有更快的方法?谢谢
两者都会产生完全相同的编译代码,如果您的编译器值得的话。
也许除了禁用所有优化之外,这种情况根本没有必要进行优化。
因此,使用更清晰的代码,如果有疑问,它是更短的代码:
使用第一个变体。
如果你想优化事物,考虑只计算一次 X[i]
和 Y[i]
,如果它们很昂贵(不太可能)。
此外,您可以根据可能性进行排序(尽管如果测试足够少,也可能不值得)。
您还可以尝试将短路运算符更改为非短路,以避免跳转(这可能适得其反)。
顺便说一句,在这种情况下,流插入可能使条件测试在性能方面变得微不足道。
就个人而言,为了清晰和减少重复,我会选择第一个。
也可以利用捷径:将最有可能的情况放在第一位。
如果 X 和 Y 是具有昂贵的重载 []
运算符的 class 实例,则预计算 X[i]
和 Y[i]
。请注意,[]
与普通类型的变量访问一样便宜。如果 X 和 Y 是模板的实例,那么 总是 预先计算以防万一 []
对于特定类型来说是昂贵的。
首先让我说,您在这里所做的任何事情都不可能对速度或内存使用产生任何显着差异。一个简单的事实是,导致写入 cout
的逻辑所花费的时间将完全消失在噪音中。对 cout
本身的写入将占绝大多数时间, 和 (至少通常)变化如此之大,以至于其余逻辑的时间是100% 无关。
也就是说,您几乎肯定可以稍微减少其余的逻辑。第一次检查 x[i] == 0 && y[i] == 0 可以简化为 x[i] | y[i] == 0
。看起来余数可以减少到 unsigned(x[i])+4u < 5u && x[i] + y[i] == 2
.
这将 6 个条件减少到 3 个条件 + 一点点数学。如果这是一个没有任何 I/O 的紧密循环,我希望它会明显更快(但结果是写入流,您可能甚至无法 可靠地测量差异,更不用说注意到差异了)。