为什么 JavaScript 在这种计算中要快得多?
我一直在用四种简单的阶乘算法进行一些测试:递归、尾递归、while
循环和for
循环。我已经用 R、Python 和 Javascript 进行了测试。
我测量了每个算法计算 150 个阶乘、5000 次所花费的时间。对于 RI 使用system.time(replicate())
。对于 Python,我使用time.clock()
了 、resource
模块和timeit
模块。对于 JavaScript,我使用console.time()
、 Date().getMilliseconds()
和Date().getTime()
,通过终端使用节点运行脚本。
这从来不是为了比较语言之间的运行时间,而是为了查看哪种形式(递归、尾递归、for 循环或 while 循环)对于我正在学习的语言来说更快。不过,JavaScript 算法的性能引起了我的注意。
您可以在此处查看 4 种不同的阶乘算法和测量实现:
在以下示例中,f 代表 for 循环,w 代表 while 循环。
R 的结果是:
Running time of different factorial algorithm implementations, in seconds.
Compute 150 factorial 5000 times:
factorialRecursive()
user system elapsed
0.044 0.001 0.045
factorialTailRecursive()
user system elapsed
3.409 0.012 3.429
factorialIterW()
user system elapsed
2.481 0.006 2.488
factorialIterF()
user system elapsed
0.868 0.002 0.874
Python的结果是:
Running time of different factorial algorithm implementations.
Uses timeit module, resource module, and a custom performance function.
Compute 150 factorial 5000 times:
factorial_recursive()
timeit: 0.891448974609
custom: 0.87
resource user: 0.870953
resource system: 0.001843
factorial_tail_recursive()
timeit: 1.02211785316
custom: 1.02
resource user: 1.018795
resource system: 0.00131
factorial_iter_w()
timeit: 0.686491012573
custom: 0.68
resource user: 0.687408
resource system: 0.001749
factorial_iter_f()
timeit: 0.563406944275
custom: 0.57
resource user: 0.569383
resource system: 0.001423
JavaScript 的结果是:
Running time of different factorial algorithm implementations.
Uses console.time(), Date().getTime() and Date().getMilliseconds()
Compute 150 factorial 5000 times:
factorialRecursive(): 30ms
Using Date().getTime(): 19ms
Using Date().getMilliseconds(): 19ms
factorialTailRecursive(): 44ms
Using Date().getTime(): 44ms
Using Date().getMilliseconds(): 43ms
factorialIterW(): 4ms
Using Date().getTime(): 3ms
Using Date().getMilliseconds(): 3ms
factorialIterF(): 4ms
Using Date().getTime(): 4ms
Using Date().getMilliseconds(): 3ms
如果我理解正确的话,没有办法使用 JS 代码测量 JavaScript 中的 CPU 时间,而上面使用的方法测量挂钟时间。
JavaScript 的挂钟时间测量比 Python 或 R 实现快得多。
例如,使用 for 循环的阶乘算法的挂钟运行时间:R:0.874s Python:0.57 s JavaScript:0.004s
为什么 JavaScript 在这种计算中要快得多?