【问题标题】:Why are Python, Ruby, and Node.js so much slower than Bash, AWK, Perl?为什么 Python、Ruby 和 Node.js 比 Bash、AWK、Perl 慢得多?
【发布时间】:2017-09-14 02:11:48
【问题描述】:

在制作多语言 makefile(启动数千个进程)时,我注意到脚本语言在启动性能方面差异很大


重击

$ TIMEFORMAT='%3R'; time bash -c "echo 'hello world'" > /dev/null
0.002

AWK

$ TIMEFORMAT='%3R'; time awk "BEGIN { print \"hello world\" }" > /dev/null
0.002

Perl

$ TIMEFORMAT='%3R'; time perl -e "print \"hello world\n\"" > /dev/null
0.003

所有这些都基本相同。但是这些脚本语言中的每一个都慢了一个数量级(!)。

Python

$ TIMEFORMAT='%3R'; time python -c "print 'hello world'" > /dev/null
0.023

红宝石

$ TIMEFORMAT='%3R'; time ruby -e "puts 'hello world'" > /dev/null
0.024

Node.js

$ TIMEFORMAT='%3R'; time node -e "console.log('hello world')" > /dev/null
0.082

Python、Ruby 和 Node.js 做了哪些事情来使它们比等效的 Bash、AWK 和 Perl 程序慢得多?是事情的结果如此,还是他们的设计有一些更基本的东西让他们有更多的开销?

【问题讨论】:

  • Ruby 加载 gems,试试ruby --disable-gems -e "..."

标签: python node.js ruby


【解决方案1】:

在您的示例中,您实际上只是在衡量它们开始所需的时间。 因此,那些最慢的 3 个是最慢的,因为它们的解释器在开始时会做更多的事情,但这并不一定意味着在长时间运行的程序中它们会更慢。

您可以编写一些长时间运行的示例(在其中进行数千次计算),然后您可以查看从长远来看哪个实际上最慢。

请记住,每一个都用于不同的事情,所以其中一个可能会非常快地处理文件 (awk),而其他人会非常快地同时处理 10 件事情 (Node.js )。

【讨论】:

  • 当然。但我没有运行长时间运行的程序。我正在运行许多短期运行的程序。 (这就是 make 的工作原理。)我不认为这是一个答案。
  • 由于您没有指定您正在使用哪些实现,因此无法说出这些实现在做什么可能会影响其启动性能。例如,JRuby 通常会首先启动一个 JVM(它包含一个 huge 标准库,可能包含也可能不包含解释器和/或多个编译器),然后启动 JRuby,然后启动一个JRuby 实例,它依次包括一个解释器、两个编译器和一个相当大的运行时库,最后但并非最不重要的一点是加载 Ruby 核心库(它也相当大),而后者又包括 RubyGems。
  • 似乎在大输入中也存在一些速度差异 FWIW:brenocon.com/blog/2009/09/… 但这并不能阻止我更喜欢 ruby​​ :)
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多