姓名:房小慧
學(xué)號(hào):17101223361
專業(yè):軟件工程
轉(zhuǎn)載自:sunsky303 - 博客園? ? ?鏈接:www.cnblogs.com/sunsky303/p/6506663.html
【嵌牛導(dǎo)讀】:本文把最近主流的編程語(yǔ)言性能作個(gè)簡(jiǎn)單的比較杆怕, 至于怎么比族购,要用神奇的斐波那契算法壳贪。
【嵌牛鼻子】:編程語(yǔ)言性能
【嵌牛提問(wèn)】:編程語(yǔ)言在性能方面都有什么優(yōu)缺點(diǎn)?
【嵌牛正文】:
本人在PHP/C++/Go/Py時(shí)寝杖,突發(fā)奇想违施,想把最近主流的編程語(yǔ)言性能作個(gè)簡(jiǎn)單的比較, 至于怎么比瑟幕,還是不得不用神奇的斐波那契算法磕蒲。可能是比較常用或好玩吧只盹。好了辣往,talk is cheap, show me your code! ?打開(kāi)Mac,點(diǎn)開(kāi)Clion開(kāi)始Coding吧殖卑!
1.怎么第一是Go呢站削,因?yàn)槲覀€(gè)人最近正在用,感覺(jué)很不錯(cuò)
package main
import "fmt"
func main(){
fmt.Println(fibonacci(34))
}
func fibonacci(i int) int{
if(i<2){
return i;
}
return fibonacci(i-2) + fibonacci(i-1);
}
先用 Go1.7看看:
qiang@localhost:/works/learnCPP$ go version && time go build ?fib.go ?&& time ./fib
go version go1.7.5 darwin/amd64
real ? ?0m0.206s
user ? ?0m0.165s
sys ? ? 0m0.059s
real ? ?0m0.052s
user ? ?0m0.045s
sys ? ? 0m0.004s
然后孵稽,再看看1.8的:
qiang@localhost:/works/learnCPP$ go18 version && time go18 build ?fib.go ?&& time ./fibgo version go1.8darwin/amd64 ? real0m0.204s ? user0m0.153s ? sys0m0.062s ? real0m0.051s ? user0m0.045s ? sys0m0.003s
感覺(jué)看不出差異许起,但官方1.8在GC、Compile等方面優(yōu)化提升了20%菩鲜,可能是這demo太簡(jiǎn)單了吧园细。
2.Python,最近玩得也火熱接校,所以拿來(lái)比比
deffibonacci(i):ifi<2:returnireturnfibonacci(i-2) + fibonacci(i-1) ? print(fibonacci(34))
先來(lái)看看python2.7
qiang@localhost:/works/learnCPP$ python2 -V && time python2 ./fib.py
Python2.7.13real
0m2.651s ? user0m2.594s ? sys0m0.027s
接著是Py 3.5
qiang@localhost:/works/learnCPP$ python3 -V && time python3 ./fib.pyPython3.5.1
real0m3.110s ? user0m2.982s ? sys0m0.026s
一眼就看出Py最大的問(wèn)題了:越升級(jí)越慢猛频, 而且要命的是很多語(yǔ)法不兼容,但平時(shí)寫(xiě)寫(xiě)算法蛛勉、小程序還不錯(cuò)鹿寻,其它的時(shí)候,就算了董习,還是用Go吧烈和。
3.PHP嘛,我工作用的多皿淋,所以也必須比較下
function fibonacci($i){
if($i<2) return $i;
return fibonacci($i-2) + fibonacci($i-1);
}
echo ?fibonacci(34);
由于我的工作主要用的php5.4招刹,所以先來(lái)波:
qiang@localhost:/works/learnCPP$ php54 -v && time php54 ?fib.php
PHP5.4.43(cli) (built: Dec21201612:01:59) ? ?Copyright (c)1997-2014The PHP Group ? Zend Engine v2.4.0, Copyright (c)1998-2014Zend Technologies ? real0m2.288s ? user0m2.248s ? sys0m0.021s
測(cè)試環(huán)境是5.6,所以也來(lái)波:
qiang@localhost:/works/learnCPP$ php -v && time php ?fib.php
PHP5.6.28(cli) (built: Dec6201612:38:54) ? ?Copyright (c)1997-2016The PHP Group ? Zend Engine v2.6.0, Copyright (c)1998-2016Zend Technologies ? real0m2.307s ? user0m2.278s ? sys0m0.017s
新項(xiàng)目窝趣、自己玩什么的都是php7, 請(qǐng)看:
qiang@localhost:/works/learnCPP$ php -v && time php ?fib.php
PHP5.6.28(cli) (built: Dec6201612:38:54) ? ?Copyright (c)1997-2016The PHP Group ? Zend Engine v2.6.0, Copyright (c)1998-2016Zend Technologies ? real0m2.307s ? user0m2.278s ? sys0m0.017s
感覺(jué)php7和5是天壤之別疯暑,完全不是一個(gè)東西,而且進(jìn)步提升太大了哑舒,在此依賴?guó)B哥點(diǎn)個(gè)贊妇拯!建議大家多用php7.
4.C++是我最愛(ài)的理論基礎(chǔ),當(dāng)然說(shuō)的是C++11/14,不是老古董c99等
#include
constexpr int fibonacci(const int i){if(i<2)returni;returnfibonacci(i-2) + fibonacci(i-1); ? } ? int main() { ?? ? ?fibonacci(34);return0; ? }
先用g++ 6.2 無(wú)優(yōu)化看看:
qiang@localhost:/works/learnCPP
$ time g++-6 ?-o a.bin main.cpp && time ?./a.bin
real0m0.378s ? user0m0.254s ? sys0m0.104s ? real0m0.050s ? user0m0.043s ? sys0m0.002s
加優(yōu)化-O2后越锈,
qiang@localhost:/works/learnCPP
$ time g++-6 -O2 -o a.bin main.cpp && time ?./a.bin
real0m0.874s ? user0m0.344s ? sys0m0.180s ? real0m0.034s ? user0m0.019s ? sys0m0.004s
效果還是很明顯的仗嗦, 運(yùn)行時(shí)間只有前者一半。
5. C也寫(xiě)了個(gè)
#include ? int fibonacci(int i){if(i<2)returni;returnfibonacci(i-2) + fibonacci(i-1); ? } ? int main(){ ?? ? ?printf("%d",fibonacci(34)); ? }
不加優(yōu)化:
#include ? qiang@localhost:/works/learnCPP
$ time gcc-6-o c.bin fib.c && time ./c.bin ? ?real0m0.341s ? user0m0.063s ? sys0m0.101s ? real0m0.049s ? user0m0.044s ? sys0m0.002s
加-O2優(yōu)化:
qiang@localhost:/works/learnCPP
$ time gcc-6-O2 -o c.bin fib.c && time ./c.bin ? ?real0m0.143s ? user0m0.065s ? sys0m0.034s ? real0m0.034s ? user0m0.028s ? sys0m0.002s
和C++14一樣甘凭, 優(yōu)化后提速明顯稀拐,快了一倍。
6.Java
clasFib{ ?? ? ?public ? staticvoidmain(String[] args){ ?? ? ? ? ?System.out.println(fibonacci(34)); ?? ? ?} ?? ? ?static int fibonacci( int i){if(i<2)returni;returnfibonacci(i-2) + fibonacci(i-1); ?? ? ?} ? }
編譯丹弱、運(yùn)行的結(jié)果是:
qiang@localhost:/works/learnCPP
$ java -version && time javac Fib.java && ?time java Fib ? ?java version"1.8.0_25"
Java(TM) SE Runtime Environment (build1.8.0_25-b17) ? Java HotSpot(TM)64-Bit Server VM (build25.25-b02, mixed mode) ? real0m0.952s ? user0m1.302s ? sys0m0.144s ? real0m0.150s ? user0m0.123s ? sys0m0.025s
性能還行德撬, Compile時(shí)間和c++/go比就太low了。
7.最后出場(chǎng)的當(dāng)然是一直大紫大紅的JavaScript躲胳,不蜓洪,準(zhǔn)確說(shuō)是Nodejs(這玩意和java真tmd沒(méi)半毛錢(qián)關(guān)系)
qiang@localhost:/works/learnCPP
$ java -version && time javac Fib.java && ?time java Fib
functionfibonacci(i){if(i<2)returni;returnfibonacci(i-2) + fibonacci(i-1); ? }console.log(fibonacci(34))
結(jié)果:
qiang@localhost:/works/learnCPP$ node -v && time node ?fib.js ? ?v6.10.0
real0m0.332s ? user0m0.161s ? sys0m0.062s
結(jié)果還是令人震驚的,竟然只有TMD 0.3s坯苹,一共也不到0.5s隆檀,幾乎接近java了, 但這代碼量北滥、維護(hù)性的優(yōu)勢(shì)還真得多感謝Google爹刚操、Chromium爹的V8兒子以及開(kāi)源社區(qū)闸翅。
如果Nodejs真的運(yùn)行得穩(wěn)定了再芋, 不準(zhǔn)真能一統(tǒng)“程序江湖”, 當(dāng)然我只是說(shuō)說(shuō)坚冀,不要太認(rèn)真济赎。
來(lái)張圖中吧:
總結(jié):
感覺(jué)每種language都不同用途记某,性能只是一個(gè)很單一的指標(biāo),我本人比較看重的是:可閱讀性壳猜、可維護(hù)性滑凉、可移植性畅姊、健壯性、擴(kuò)展性朱嘴,然后是性能粗合。 而且現(xiàn)代硬件越來(lái)越牛逼,動(dòng)不動(dòng)手機(jī)就8個(gè)G壤追,cpu趕上5年前的PC的cpu了大诸,ssd普及化...。 本人比較看好Golang/php/python焙贷,也關(guān)注現(xiàn)代的C++贿堰,如14、17, 至于rust故硅、swift纵搁、java腾誉、scala就算了,這主要和個(gè)人的需要趣效、公司技術(shù)棧相關(guān)跷敬。哈哈热押! 先寫(xiě)這么多吧!
注:如有需要池凄,請(qǐng)閱讀原文肿仑。