【问题标题】:If-statement put in for instruction用于指令的 if 语句
【发布时间】:2025-12-31 13:55:12
【问题描述】:

编辑:n 是一个常数。它不会在循环内改变。

鉴于两种情况:

1)

if (n % 2 == 0)
    for(i = 1; i <= 10; i++)
             ...
else 
    for(i = 1; i <= 9; i++)
             ...

2)

for(i = 1; i <= 9 + (n % 2 == 0); i++)
          ... 

这两种情况有时间上的差异吗? (案例2)验证n是否是偶数(或只是一个附加条件)的每一步应该运行程序有点慢,对吗?

【问题讨论】:

  • 比较两者生成的汇编代码。并在测量时运行每个变体一百万次。并记住在比较或基准测试之前启用优化。
  • 如果优化器可以确定 n 绝对不会改变,因此 (9 + (n % 2 == 0)) 是循环的常数,那么它可能是相同的。唯一知道的方法是检查
  • 如果您想了解性能,您需要对其进行衡量。在当今具有推测执行、乱序执行、指令/数据预取等的现代 CPU 上,即使检查生成的代码也无济于事..
  • 你可能会得到完全相同的程序集
  • 如果这里有差异,那么差异将非常小,以至于很难以任何准确度进行测量。

标签: c++ for-loop if-statement time


【解决方案1】:

验证每一步是否 n 是偶数(或只是一个附加条件)应该运行程序有点慢,我正确吗?

一般情况下是的,在这种特殊情况下,这取决于您是否可以在循环内更改n 以及n 是什么,即编译器是否可以检测到n 可以更改或不进行优化。所以你应该向读者和编译器说明你的意图:

auto limit = 9 + (n % 2 == 0); 
for(i = 1; i <= limit; i++)
      ... 

【讨论】:

  • 也许,您还想将auto limit = 9 + (n % 2 == 0); 替换为auto limit = 10 - (n%2);。恕我直言,没有那个==0
  • @Federico 这是主观的,我只是使用了 OP 喜欢的风格,并且不想在不改变其他任何东西时坚持特定的方式。