【发布时间】:2021-01-16 10:00:17
【问题描述】:
这不是 FizzBuzz 代码中关于如何处理重复的 if 语句的典型辩论。我认为这是个人喜好问题。
我是来问关于重复数学运算的选择的。
通常,FizzBuzz 代码的解决方案是在每次迭代中使用取模运算符。但是,我担心它对性能的影响。
据我所知,模数运算符与除法运算符紧密相连,与简单的增量和减量运算符相比,它具有相当大的性能开销。
另外,我不相信编译器有能力分析和优化循环中模运算符的使用。
因此,我给出了仅使用简单递减运算符的替代解决方案。以下代码是用 C++ 编写的。
我希望了解我的方法是否会带来性能优势,或者它是否真的是一个糟糕的想法会降低性能。
如果还有其他方法可以进一步优化 FizzBuzz 代码。 (我认为在经过修改的 FizzBuzz 拼图中有很多案例可供比较,查找表可能更可取)
典型的 FizzBuzz 解决方案。
for (unsigned int i = 1; i <= 1000000; ++i) {
if (!(i % 15))
std::cout << "FizzBuzz\n";
else if (!(i % 3))
std::cout << "Fizz\n";
else if (!(i % 5))
std::cout << "Buzz\n";
else
std::cout << i << '\n';
}
我的优化代码。
static const unsigned int fa {3};
static const unsigned int fb {5};
unsigned int a {fa};
unsigned int b {fb};
for (unsigned int i = 1; i <= 1000000; ++i) {
--a, --b;
if (!a && !b) {
a = fa;
b = fb;
std::cout << "FizzBuzz\n";
} else if (!a) {
a = fa;
std::cout << "Fizz\n";
} else if (!b) {
b = fb;
std::cout << "Buzz\n";
} else {
std::cout << i << '\n';
}
}
【问题讨论】:
-
如果您正在使用 FizzBuzz 进行工作面试的编码评估,我建议您不要提交您的“优化代码”。它看起来很模糊且难以维护。
-
恕我直言,这个问题更适合Code Review SE
-
@JHBonarius 别担心,这不是求职面试。我最近刚遇到 FizzBuzz,它引起了我的兴趣。
-
顺便说一句,你总是可以假设很多关于(微)优化的。但唯一知道的方法是测量。我建议你学习Google Test Framework 之类的东西,这样你就可以使用QuickBench。
-
看起来与quickbench相当(使用
std::stringstream而不是std::cout和下限以避免时间限制)。
标签: c++ performance optimization fizzbuzz