最近我收到了很多关于 Golang 语言的令人印象深刻的消息,包括许多将它与 Node Js 进行比较的 Youtube 视频。 在每一个视频中,人们都会得出结论,Go 是一门不可思议的语言。 几乎与 Rust 和 C 一样快,但具有 Node Js 易于开发的特性,两全其美!

所以作为一名开发人员,我决定自己测试一下。 然后,寻找一种快速的方法来测试它,我想,这是测试程序速度的最佳方法,而不是使用经典的排序算法。


我做的第一件事是创建一个 Node Js 脚本,该脚本将为我创建一个 json 文件,其中包含一个自定义长度的充满随机数的数组。 通过这种方式,我可以快速制作一个我想要的长度的示例数组。 然后在每个程序上我都会使用这个文件来获取我需要排序的数据,很简单吧?

之后,我开始编写 Node Js 示例,首先是经典的冒泡排序:

代码非常简单,它接收一个数组,循环遍历它,将每个位置与下一个位置进行比较,如果第二个小于第一个,则交换值,重复此过程直到整个数组被整理出来,然后它 返回它。 这是一个非常缓慢的过程,因为它必须在数组中循环多次。


然后合并排序:

这个有点难以解释,它遵循分而治之的概念,它使用递归将接收到的数组一遍又一遍地分成两半,然后将这个较小的数组与另一个数组进行比较和排序,基本上对整个数组进行排序 一气呵成。 它是我所知道的最快的排序算法,与简单的冒泡排序相比,它在性能和速度上的差异令人难以置信。


这里我们有一个比较图,对十个数组进行排序,每个数组包含 10000 个数字,X 轴代表尝试次数,Y 轴代表每个算法对每个整个数组进行排序所需的毫秒数。 正如我们所见,合并算法比冒泡排序更快、更稳定。

但随之而来的问题是,我们能否使用 Go 让最快的算法变得更快?

所以这是我第一次编写 Go,所以可能有更好的方法来编写这段代码,但我也尽量保持逻辑与 Node Js 中的逻辑相似。 在 Go 中没有 while 循环有点奇怪,但最后一个 for 循环就足够了,你可以看到逻辑与 Node Js 中的逻辑相同,并且代码本身非常相似且易于理解。


但是,当我们查看图表时,我们可以看到 Go 算法的稳定性要好得多,而且排序每个数组的时间几乎是 Node Js 的三分之一。

这里我们有对十个 10000 个数字数组进行排序的所有结果。 所有时间都以毫秒为单位,您可以看到 Node Js 和 Go 之间的巨大差异。

所以你怎么看? 这是一个很好的例子吗? 有什么我应该改变的吗? 是否值得将代码更改为 Go 以获得这种级别的性能改进? 我很想看看你的评论。