Speedwise,Pharo与Python3相比如何?

我在编程方面没有太多经验,但我知道一点 Python3,现在我正在迈出我学习 Pharo 的第一步。我仍然不熟悉面向对象编程或类浏览器,但我已经阅读了 ProfStef 教程,并且我正在 Playground 上玩小程序,以熟悉语法。

我好奇的第一件事是这两种语言在速度方面的比较,因为我在某处读到 Pharo 内置了 JIT 编译器。 所以我用两种语言写了一个异想天开的脚本,生成了 800 万个数字,过滤其中的1/3,对每个计算1/sqrt(x),将结果相加,重复该过程一百次,每次稍微改变间隔,最后再将结果相加,并对整个过程进行计时. 不是一个合适的基准,只是一个获得数量级估计的练习,但我试图让两个版本尽可能相似。

Python 3 版本:

import time, math

mega = lambda n: sum([1/math.sqrt(1 + i + n) for i in range(8000000) if (i + 1) // 3 == 0])
start = time.time()
print(sum([mega(n + 1) for n in range(100)]))
stop = time.time() - start
print(stop)

Python 3.8.5 的结果(默认,2020 年 7 月 28 日,12:59:40):

34.7701230607214
52.75216603279114

Pharo 8 版本:

| mega range start stop |.

range := [:n | (((1 to: 8000000) select: [:j | (j quo: 3) = 0]) collect: [:i | 1 / (n + i) sqrt]) sum].
start := DateAndTime  now.
Transcript show: (((1 to: 100) collect: [:n | range value: n]) sum); cr.
stop := (DateAndTime now - start) asSeconds.
Transcript show: stop; cr.
| mega range start stop |.

range := [:n | (((1 to: 8000000) select: [:j | (j quo: 3) = 0]) collect: [:i | 1 / (n + i) sqrt]) sum].
start := DateAndTime  now.
Transcript show: (((1 to: 100) collect: [:n | range value: n]) sum); cr.
stop := (DateAndTime now - start) asSeconds.
Transcript show: stop; cr.

Pharo-8.0.0+build.1141.sha.1b7a8d8203fce2a57794451f555bba4222614081(64位)上的结果:

正如我预期的那样,Pharo 版本运行得更快,但差距不大,45 秒对 Python 的 52 秒多一点。花费的时间减少了大约 13%。所以我猜他们的速度大约是相同的数量级。这是典型的情况吗?

回答

这种测试并不能说明什么。其主要原因是,计算的体积在于重复发送相同的消息给同一类的实例(quo:=用于select:/+sqrtcollect:, 等等。)。这意味着诸如方法查找之类的耗时(内部)操作仅发生一次,然后被困在内联缓存中。因此,您的系统在运行这些基准测试时可能会优于另一个系统,而在运行“真实”应用程序时会慢得多。除了(单声道或多态)内联缓存,它减少了对方法查找的需要,其他不同的技术是垃圾收集器的性能,方法内联(用目标代码的副本替换发送站点),寄存器分配(为了最小化内存访问),性能become:消息等。众多因素使得需要测量更复杂的代码片段,尝试使用我刚刚提到的已知瓶颈。有时,一个小的更改可能会暴露您系统的其他隐藏优势(或弱点)。所以我的建议是,要进行这种分析,您应该更努力地尝试并设计旨在测量系统如何响应特定压力的测试。


以上是Speedwise,Pharo与Python3相比如何?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>