我在一篇演讲中读到,Go编译器将积极删除未在输出二进制文件中使用的代码。我无法找到的谈话用于添加一些对测试有用的代码。有没有人有关于它如何工作的更多信息?是否有关于先进测试技术的讨论?
答案 0 :(得分:0)
Dave Cheney在他的基准博客文章中谈到了这一点:
http://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go(关于编译器优化的说明)
答案 1 :(得分:0)
死码消除
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
}
}
可以用于包含仅用于测试的代码。