【问题标题】:How can I defeat the Go optimizer in benchmarks?如何在基准测试中击败 Go 优化器?
【发布时间】:2020-05-06 21:02:54
【问题描述】:

在Rust中,你可以使用black_box函数来强制编译器

  1. 假设使用了函数的参数(强制它不优化生成该值的代码)
  2. 无法检查其返回值是如何产生的(阻止它进行常量折叠和其他此类优化)。

Go 中是否有类似的工具(完成任一任务)?

【问题讨论】:

    标签: performance go optimization performance-testing


    【解决方案1】:

    Go 中是否有类似的工具(完成任一任务)?

    没有。

    如果要使用结果:分配给导出的全局。

    【讨论】:

    • 这不足以进行基准测试。例如,它不会阻止不断折叠函数参数或删除基准循环。
    • @Veedrac 答案是简单的“不”,没有可靠的、有记录的、可行的方法来完成这两项任务。不同的编译器在这里可能表现不同。但是一个(目前)有效的(用于 gc 和 gcc)防止基准循环被删除的方法是分配给一个全局变量。
    【解决方案2】:

    我相信 runtime.KeepAlive 是推荐的,根据以下 Github 问题。不幸的是,尚不清楚函数参数是否存在,或者KeepAlive 是否可以保证工作。

    https://github.com/golang/go/issues/27400

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 2011-09-25
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2011-09-02
      • 2017-09-10
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多