当前位置: 首页 > 科技观察

深入分析Go泛型版本排序比sort包快?

时间:2023-03-19 18:36:13 科技观察

大家好,我是程序员幽灵。随着Go1.18的发布,泛型已经到来。一组新的排序函数也进入了Go[1]中的golang.org/x/exp/slices[2]包。这些函数利用Go泛型来提供更符合人体工程学的排序API(无需用户实现sort.Interface[3]),并且还提供了很好的性能改进,如上面的CL所示。在本文中,我将深入探讨为什么这些通用函数比sort包中的现有函数更快,即使它们使用完全相同的算法和循环结构。希望这可以有趣地了解与现有动态调度机制(接口)相比,Go泛型是如何实现的。为了将我们的讨论与Go标准库和实验存储库的混乱细节分离,并能够专注于更小、更简单的代码示例,我在更简单的排序算法上重新实现了这个比较,其中性能差异也显示在后面。冒泡排序首先是冒泡排序。GitHub[4]上提供了来自维基百科文章的Bubblesort动画的完整代码,以及测试和基准测试。这是一个简单的冒泡排序实现,使用Go中的sort.Interface接口定制:funcbubbleSortInterface(xsort.Interface){n:=x.Len()for{swapped:=falsefori:=1;我ROUTINE=========================main.bubbleSortInterface350ms1.10s(flat,cum)100%ofTotal。.26:。.27:funcbubbleSortInterface(xsort.Interface){..28:n:=x.Len()。.29:对于{。.30:swapped:=false70ms70ms31:fori:=1;我