【问题标题】:C syntax or binary optimized syntax?C 语法还是二进制优化语法?
【发布时间】:2010-05-13 06:19:59
【问题描述】:

让我们举一个简单的例子,假设两条线做同样的事情:

如果(值 >= 128 || 值

如果 (值 & ~ 127) ...

假设“如果在数千次迭代的循环中代价高昂,是保持传统 C 语法更好还是尽可能找到二进制优化的语法更好?

【问题讨论】:

  • 猜测会完成什么?分析它并找出答案。如果你要买一辆车,你会猜猜你更喜欢哪一辆,还是每个都试一试看看?也就是说,使用前者:它更具可读性,这才是最重要的。编译器比你更擅长优化;你编写代码,他们生成二进制文件。
  • 这些语句不等价。
  • 这仅适用于 2 的幂,但这只是使用二进制代码“可能”比编译器更快的示例。
  • 可能没有任何意义。试试看。看组装。让它以易于阅读和维护的方式工作,必要时加快速度。好的代码很容易优化。

标签: c syntax binary


【解决方案1】:

我会使用传统语法的第一个语句,因为它更具可读性。 用第二个说法就可以破眼睛了。

关心会在你之后使用代码的程序员。

【讨论】:

    【解决方案2】:

    在 100 个案例中的 99 个案例中,选择更具可读性并更好地表达您的意图的案例。

    【讨论】:

      【解决方案3】:

      理论上,编译器会为你做这种优化。在实践中,他们可能不会。这个特殊的例子有点微妙,因为两者并不等价,除非您对value 以及有符号算术是否是目标平台上的 2 的补码做出一些假设。

      使用您认为更易读的那个。如果并且当您有证据表明此特定测试的性能很关键时,请使用任何可以为您提供最佳性能的方法。就个人而言,我可能会写:

      if ((unsigned int)value >= 96U)
      

      因为这对我来说更直观,并且更有可能被我使用过的大多数编译器很好地处理。

      【讨论】:

      • 你是对的练习部分,他们通常不会过度优化,即使在-o3,这就是我问这个问题的原因。经过数千次迭代,差异可能会很大。不过,我看不出那个例子中无符号的意义吗?
      • @Dpp: 如果valueint,那么任何负值在转换为unsigned int 时都会变得大于96,因此这消除了对
      • 嗬嗬,因为第 8 位设置为 1,我喜欢它!然后预编译器可能会更好地优化它!
      • @Dpp:caf 说了什么;更准确地说,我会这样做是因为 (a) 它由 C 标准保证,而不是依赖于有符号算术是 2s 补码,并且 (b) cmp-branch 在处理器设计中进行了大量优化,并且可以更快在某些平台上比 and-branch 或 and-test-branch。
      【解决方案4】:

      这取决于检查的方式/地点。如果在程序启动期间检查命令行参数,那么性能问题完全没有实际意义,您应该使用更自然的方法。

      另一方面,如果检查是在某个每秒发生数百万次的内部循环中进行的,那么它可能很重要。但不要假设一个会更好;您应该创建两个版本并为它们计时,以查看两者之间是否有任何可测量的差异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 2014-01-02
        • 2011-09-18
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多