《OCaml很棒》(2019)

2020-05-02 18:03:08

我在工作中遇到了数据可视化问题。我一直在考虑布景覆盖的问题,并想测试一些可视化的想法。我曾经想要可视化聚合度量的空间(即像手段之类的东西)。后来发现我不需要它,因为我对这个问题的想法从一开始就是错误的。我已经写了一些代码,非常想检查一下。到了最后,它已经变成了完全不同的东西,但这是一个很好的娱乐之夜……。

由于某些原因,计算机语言基准游戏已经在我的一个浏览器选项卡上打开了大约一个月。我想知道这些数据是否可以免费获得。确实是。我揉了揉手就开始工作了。一小时后,我有了这个(解释和操作指南如下)。

X轴表示CLEAN(即无注释、标准化空白)GZip‘d程序源代码的大小(以字节为单位)。Y轴表示性能,以CPU时间衡量-越低越好。这些点是基准游戏数据集中所有语言的所有基准的所有数据点。在每个小情节中,都有特定语言的情节。每条红线是从给定语言的平均值(X,Y)到数据点的一条线。编程语言的特定子集.。

此图表显示了用语言编写的程序的冗长程度与其运行时性能之间的平衡。理想的编程语言应该位于左下象限。您可能已经注意到,我省略了我最喜欢的语言之一Python。这是因为我在给定的最大X和Y处截断了图表。Python的这样一个情节不会显示红线。我把它换成了斯威夫特。

线条的密度显示了正在考虑的计划数量。在数据集中,为每种语言的每个基准考虑多个实现。对于上图,我只考虑了每种语言基准测试的最高性能基准。这里有一个没有只过滤最好的:

面积基本上就是方差。我原本还想绘制连接它们的多边形。但我认为人类的大脑不擅长理解某些领域,所以我决定不这么做。

这些图表有什么意义?嗯,首先,它让我扮演业余分类学家的角色。它绝对不是正式的,但是现在我可以根据编程语言的大小-性能图的形状来量化它们的种类。它允许进行以下观察。

围棋是为喜欢“中道”的佛教徒准备的。这真的很普通。完全是偶然的,我把它落在了剧情的中央。Ruust具有C语言的性能特征,但更加冗长。最令人惊讶的是函数式语言OCaml和Haskell。事实证明,对于一种以简洁著称的语言,Haskell并不像预期的那样简洁-它的平均源代码大小大于Go源代码的平均大小。另一方面,奥卡姆尔则是一匹黑马。是关于..。

朱莉娅在几个方面相当令人惊讶:朱莉娅是个口齿不清的人。因此,它的简洁性是意料之中的。Julia使用LLVM,它有令人难以置信的后端优化。这就是为什么它的较低表现有点令人惊讶。然而,使用中值聚合衡量标准,朱莉娅看起来更像预期的那样。

令人惊讶的是,绝对没有一个经常阅读这个博客的人(你们两个好),我把它写在围棋里了。我使用了戈纳姆的曲线图库来生成曲线图。完整的源代码可以在这里找到。

这个程序确实需要一些解释。没有绘图。绘图机用来画线,所以我不得不从头开始写。以下是相关行:

//STAR是用于绘制线条Starstype STAR Struct{plotter.XYs绘图的数据结构。LineStyle MX,my float64 trx,try float64//truncate at}func(s*star)Plot(c dra.Canvas,p*plot.Plot){tx,ty:=p.Transforms(&;c)trx,try:=tx(s.trx),ty(s.try)ls:=s.LineStyle mx,my:=tx(s.mx),ty(s.my)for_,xy:=range s.xy{x:=tx(xy.x)y:=ty(xy.Y)if x>;trx{x=trx}if y>;try{y=try}c.StrokeLine2(ls,mx,my。

我不太记得怎么做这件事了。但谢天谢地,我已经写了一本关于如何使用定制的Gonum绘图仪进行绘图的书,所以我可以参考一下。如果你想要完整的解释,买这本书,或者友好地问我,作为我的营销合同要求的一部分,我需要写一篇关于我的书的文章。写书的经历比预想的要仓促得多,如果有人问我,我会说我本可以写得更好。因此,我将颠覆这篇文章,因为前面提到的.。

此外,为了平铺图形,我使用了Gorgonia张量包,它提供了真正通用的多维数组。对于3x3的地块来说,这并不是严格意义上的,但对我来说,这是一种快捷而简单的方式:

t:=tensor.New(tensor.WithBacking(Ps),tensor.WithShape(len(List)/cols))matUgh,err:=native.Matrix(T)dieIfErr(Err)mat:=matUgh.([][]*plot.Plot)平铺