【发布时间】:2021-04-05 10:13:35
【问题描述】:
冒着重复的风险,也许我现在找不到类似的帖子:
我正在用 C++ 编写(具体来说是 C++20)。我有一个带有计数器的循环,每回合都会计数。我们称之为counter。如果这个counter 达到页面限制(我们称之为page_limit),程序应该在下一页继续。所以它看起来像这样:
const size_t page_limit = 4942;
size_t counter = 0;
while (counter < foo) {
if (counter % page_limit == 0) {
// start new page
}
// some other code
counter += 1;
}
现在我想知道,因为计数器变得非常高:如果我不让程序每次都计算模 counter % page_limit,而是创建另一个计数器,程序会运行得更快吗?它可能看起来像这样:
const size_t page_limit = 4942;
size_t counter = 0;
size_t page_counter = 4942;
while (counter < foo) {
if (page_counter == page_limit) {
// start new page
page_counter = 0;
}
// some other code
counter += 1;
page_counter += 1;
}
【问题讨论】:
-
使用像
googlebenchmark这样的基准工具并找出答案。 -
这将是一个微优化 - 现代编译器通过使用一些我从未听说过的疯狂 CPU 指令来优化整数模运算 - 所以我认为你问这个问题是在浪费你的时间.在发布任何编译器优化问题之前,您还应该查看 GodBolt.org。
-
优化代码时的一般经验法则:您是否调用了超过十亿次?如果你故意让它变慢,例如
if (x % y || x % y || x % y ...)重复 20 次,它是否会导致 可衡量的 性能拖累?如果没有,请继续,这不是问题。 -
你应该把正确性放在过早的优化之前。
if (counter % page_limit)可能不是你想要的。你的两个 sn-ps 做不同的事情,因此比较它们的性能不是很有意义。 -
@Jere:您实际上希望手持编译器使用递减计数器,而不是向上计数。
if(--pgcount == 0) { /*new page*/; pgcount=page_limit; }。这在 asm 中效率更高,在 C 中同样具有可读性,因此,如果您要进行微优化,则应该这样编写。相关:using that technique in hand-written asm FizzBuzz。也可能是 3 和 5 的倍数的 asm 和的 code review,但它对不匹配没有任何作用。
标签: c++ performance assembly micro-optimization branch-prediction