【发布时间】:2018-10-21 11:27:56
【问题描述】:
我正在编写一个简单的 C++ 函数来反转整数,如下所示:
int reverse(int x) {
int result = 0;
int overflow_max = INT_MAX / 10;
int underflow_min = INT_MIN / 10;
while (x != 0) {
int pop = x % 10;
if (result > overflow_max || (result == overflow_max && pop > 7))
return 0;
if (result < underflow_min || (result == underflow_min && pop < -8))
return 0;
result *= 10;
result += pop;
x /= 10;
}
return result;
}
该程序运行良好且快速。但是,当我在测试不同版本的代码优化功能时,我发现这个版本的运行速度略快:
int reverse(int x) {
int result = 0;
while (x != 0) {
int pop = x % 10;
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && pop > 7))
return 0;
if (result < INT_MIN / 10 || (result == INT_MIN / 10 && pop < -8))
return 0;
result *= 10;
result += pop;
x /= 10;
}
return result;
}
我不明白第二个版本运行速度更快的原因,因为它显然重复了 INT_MAX / 10 和 INT_MIN / 10 的计算,所以它的性能应该比使用临时变量存储的第一个版本更差避免重复计算。
【问题讨论】:
-
弹性测量数据和minimal reproducible example好吗?
-
你是怎么编译的?什么优化级别?使这些变量
const并再次检查。INT_MAX / 10是编译时常量,不在运行时计算。 -
您是如何衡量性能的?你是在调试还是发布模式下运行的?
-
你是如何分析这段代码的?你是如何编译这段代码的?其余代码在哪里...这是一个不完整的 sn-p。
-
您的编译器和优化设置是什么?带有
-O2的 gcc 为两者生成相同的代码(如果两者都有,它甚至会用跳转到另一个替换一个)。
标签: c++ algorithm performance