【问题标题】:loop optimization difference for循环优化差异
【发布时间】:2019-05-03 19:56:58
【问题描述】:

这两者在效率方面有什么区别吗?第二个更优化吗?我编译了第一个代码,然后我反编译了它,得到了第二个代码。

for (i = 0; i < n; ++i) {
    if (a[i] == x) {
        printf("%d", a[i]);
        return 0;
    }
}
return 1;

i = 0;
while (1) {
    if (n <= i)
        return 1;
    if (a[i] == x)
        break;
    i = i + 1;
}
printf("%d", a[i]);
return 0;

【问题讨论】:

  • 他们根本不做同样的事情。
  • 您是否错过了第二行的i++ 行? (顺便问一下,用的是哪个反编译器?)
  • @chqrlie 啊,现在我明白了 :D 条件颠倒了。太可怕了。
  • @AnttiHaapala:最初的版本确实不同......没有i = i + 1

标签: c optimization compilation decompiling


【解决方案1】:

两个代码片段执行相同的操作。主要区别是第一个可读易懂,第二个被混淆了,需要一些思考才能确定它真的等同于第一个,正如许多 cmets 所证实的那样确实令人困惑。

在这些情况下考虑优化是徒劳的,编译器很可能会为两者生成等效的代码。

结论很清楚:

  • 始终编写简单易读的代码。
  • 低效但正确的代码总是胜过损坏的优化代码。
  • 忘掉微优化吧,编译器比人类更擅长。
  • 性能与其说是代码微调,不如说是算法复杂性的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多