去编译器技巧

时间:2014-10-20 15:24:13

标签: go

我在一篇演讲中读到,Go编译器将积极删除未在输出二进制文件中使用的代码。我无法找到的谈话用于添加一些对测试有用的代码。有没有人有关于它如何工作的更多信息?是否有关于先进测试技术的讨论?

2 个答案:

答案 0 :(得分:0)

Dave Cheney在他的基准博客文章中谈到了这一点:

http://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go(关于编译器优化的说明)

答案 1 :(得分:0)

  

Five things that make Go fast

     

Dave Cheney

     

死码消除

func Test() bool { return false }

func Expensive() {
  if Test() {
      // something expensive
  }
}
     

在这个例子中,虽然函数Test总是返回false,   如果没有执行它,昂贵无法知道。

     

当内联测试时,我们会得到类似这样的内容

func Expensive() {
  if false {
      // something expensive is
      // now unreachable
  }
}
     

编译器现在知道昂贵的代码无法访问。

     

这不仅节省了调用Test的成本,还节省了编译   或运行任何现在无法访问的昂贵代码。


例如,添加一些对测试有用的代码,

func Complicated() {
    if Test() {
        // something for testing
    }
}

切换Test
func Test() bool { return false }

内联

func Complicated() {
    if false {
        // something for testing
        // unreachable
    }
}

func Test() bool { return true }

内联

func Complicated() {
    if true {
        // something for testing
        // reachable
    }
}

可以用于包含仅用于测试的代码。