利用蒙特卡洛法计算圆周率 π 的近似值。
具体计算方法如下:
下面列出参与实验的所有编程语言及其版本,其中竖线(|)之后的为最低可运行版本。
请注意版本差异带来的效率差异。
注意几个点:
using System; 语句。typing 库的 Tuple。将 tuple[float, float] 替换为 Tuple[float, float]。这是版本问题。readline 模块。源代码很多,所以我放在了云剪贴板。
下面给出影响计算效率的因素。我们只计时蒙特卡洛整个计算的时间,因此不包括输入输出等代码的耗时。您可以查看源代码了解。
另外,计算机配置也是一大因素。这里给出计算机配置:
本来想在 Ubuntu 虚拟机上测试的(Linux 系统测试更精确),但是我没下也没有那么多空间下载这么多语言编译器或解释器,所以就在 Windows 主机上进行了测试。Ubuntu 虚拟机主要是给我做开发的。
我用于测试的编译器和解释器都是 64 位的,所以不存在字长导致的效率差异。
我们测试了不同点数(分别是 105、106、107 和 108)下各种语言的蒙特卡洛算法的耗时并进行了排序。以下表格便是结果。为了简便,我们只显示语言名称和其用时,不包括语言版本。对于相同耗时的语言,我们令其并列。
| N=105 | N=106 | N=107 | N=108 | |
|---|---|---|---|---|
| 1 | Julia (0ms) | Julia (8ms) | Julia (42ms) | Julia (349ms) |
| 2 | C# (3ms) | C# (12ms) | C# (95ms) | C# (887ms) |
| 3 | C++ O2 & Go (4ms) | C++ O2 (20ms) | C++ O2 (193ms) | C++ O2 (1641ms) |
| 4 | / | Go (35ms) | JavaScript (245ms) | JavaScript (2202ms) |
| 5 | C O2 (8ms) | JavaScript (36ms) | PyPy (298ms) | PyPy (2972ms) |
| 6 | C (9ms) | C O2 & Java & PyPy (41ms) | C O2 (337ms) | C O2 (3327ms) |
| 7 | Java & PyPy (10ms) | / | Go (353ms) | Java (3726ms) |
| 8 | / | / | C (386ms) | C (3865ms) |
| 9 | JavaScript (14ms) | C (58ms) | Java (392ms) | Go (4014ms) |
| 10 | C++ (34ms) | C++ (303ms) | C++ (2885ms) | C++ (29013ms) |
| 11 | Python (58ms) | Python (441ms) | Python (4388ms) | Python (56138ms) |
再给出一张横向排名表:
| N=105 | N=106 | N=107 | N=108 | |
|---|---|---|---|---|
C | 6 | 9 | 8 | 8 |
C O2 | 5 | 6 | 6 | 6 |
C++ | 10 | 10 | 10 | 10 |
C++ O2 | 3 | 3 | 3 | 3 |
Java | 7 | 6 | 9 | 7 |
Python | 11 | 11 | 11 | 11 |
PyPy | 7 | 6 | 5 | 5 |
JavaScript | 9 | 5 | 4 | 4 |
Julia | 1 | 1 | 1 | 1 |
Go | 3 | 4 | 7 | 9 |
C# | 2 | 2 | 2 | 2 |