2017-09-14 89 views
-3

在制作多语言生成文件(启动数千个进程)时,我注意到脚本语言的启动性能差异很大为什么Python,Ruby和Node.js比Bash,AWK,Perl慢得多?


猛砸

$ 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程序还要多?这只是事情发生的方式,还是有一些更重要的关于他们的设计,使他们有更多的开销?

+0

红宝石加载宝石,试试'ruby --disable-gems -e“...”' – Stefan

回答

4

在你的例子中,你几乎只测量他们开始的时间。因此,最慢的3个是最慢的,因为他们的解释器在开始的时候做的更多,但不一定意味着在长时间运行的程序中它们会更慢。您可以编写一些长时间运行的示例(您可以在其中进行数千次计算),然后您就可以看到哪一个实际上最慢。请注意,其中的每一个都是针对不同的事物,因此其中一个处理文件的速度可能非常快(awk),而其他处理将同时处理10个事件的速度非常快(Node.js)。

+0

当然可以。但我没有运行长时间运行的程序。我正在运行很多短时间运行的程序。 (这是如何使作品。)我不认为这是一个答案。 –

+0

由于您没有指定您正在使用哪种实现,因此无法说出那些实现可能影响其启动性能的操作。例如,JRuby通常会首先启动一个JVM(它包含一个*巨大的*标准库,可能包括或不包括解释器和/或多个编译器),然后启动JRuby,然后启动一个JRuby实例, turn包括一个解释器,两个编译器和一个相当大的运行时库,最后但并非最不重要的是将加载Ruby核心库(它也相当大),而后者又包含RubyGems。 –

相关问题