2014-10-12 177 views
2

Go使用通用的sort.Interface有一个很好的introsort通用实现。但是C++的std::sort的优点之一是你可以指定一个内联的比较函子,并且省略了不必要的函数调用。 我们是否可以强制当前的本地Go编译器以某种方式内联那些sort.Swapsort.Less调用?我不考虑gccgo,因为它与本地编译器相比,会带来可怕的结果。Go中的内联函数

回答

1

For Go 1.x的答案是一个声音没有。

Go编译器可能会以某些特定方式在某些平台上内联某些类的函数。你甚至可以弄清楚一些技巧,通过这些技巧你可以让目前的编译器在你的架构上嵌入排序 - “函子”,但绝对不能保证它在未来的版本中将保留,并且可能对你有用(甚至当编译器改变时,根据涉及的hackery的级别来破坏你的代码)。

Go(2.x?)可能的主要版本提供了有关优化的一些保证;但对于Go 1.x来说,没有那样的东西。即使Go作者想这样做,也很难为所有平台提供这样的保证(请记住Go在许多架构上运行)。

更为普遍的是,在任何语言中依赖编译器特有的行为是一个坏主意。

+0

谢谢。我绝对同意依靠特定的编译器优化是一个坏主意。但是目前我们有一个“排序密集型”模块,遗憾的是Go比C++慢两倍,仅仅是因为这种内联的事情。我们测量了没有'sort.Interface'的版本,差别很大。 – eeq 2014-10-12 09:56:34

+2

如果排序性能至关重要,那么您可能很有必要编写更具用例且更快的排序实现;定制为您的需求。 – thwd 2014-10-12 09:59:42

+1

你确定Swap和Less没有内联吗?您可以使用'go build -gcflags =' - m''查看优化决策。 Simple Less和Swap函数通常是内联的。 – siritinga 2014-10-12 20:29:06