Go 使用编译器技巧
我在一篇演讲中读到,Go编译器将积极删除输出二进制文件中未使用的代码。我找不到的谈话用它来添加一些对测试有用的代码。有没有人有更多关于这是如何工作的信息?有关于高级测试技术的讨论吗?戴夫·切尼在他的基准博客文章中谈到了这一点: 关于编译器优化的注记 死码消除Go 使用编译器技巧,go,Go,我在一篇演讲中读到,Go编译器将积极删除输出二进制文件中未使用的代码。我找不到的谈话用它来添加一些对测试有用的代码。有没有人有更多关于这是如何工作的信息?有关于高级测试技术的讨论吗?戴夫·切尼在他的基准博客文章中谈到了这一点: 关于编译器优化的注记 死码消除 func Test() bool { return false } func Expensive() { if Test() { // something expensive } } 在本例中,尽管函数测试总是返回
func Test() bool { return false }
func Expensive() {
if Test() {
// something expensive
}
}
在本例中,尽管函数测试总是返回false,
如果不执行它,我们就无法知道这一点
当测试内联时,我们得到如下结果
func Expensive() {
if false {
// something expensive is
// now unreachable
}
}
编译器现在知道昂贵的代码是无法访问的
这不仅节省了调用测试的成本,还节省了编译
或者运行任何现在无法访问的昂贵代码
例如,添加一些对测试有用的代码
func Complicated() {
if Test() {
// something for testing
}
}
开关试验
内联
func Complicated() {
if false {
// something for testing
// unreachable
}
}
func Complicated() {
if true {
// something for testing
// reachable
}
}
到
内联
func Complicated() {
if false {
// something for testing
// unreachable
}
}
func Complicated() {
if true {
// something for testing
// reachable
}
}
包含用于测试的代码可能很有用。看看这里关于Go的各种讨论:无法回答所有这些问题,但将结果分配给全局是确保代码不会优化的一种方法。当然,Dave Cheney会在最后介绍它,实际上,const Test=false可能是一个更好的选择。我缺少的部分是如何在不修改源代码的情况下切换此选项进行测试?@Drew当然您必须修改源代码,但只需修改一行。如果二进制文件不在源代码级别,编译器将如何从中删除它?我的意思是,是的,存在自修改二进制文件,但是。。。