When I was working in PHP/C++/Go/Py, I suddenly had the idea to make a simple comparison of the performance of the recent mainstream programming languages. As for how to compare, I still had to use the magical Fibonacci algorithm. Maybe it’s more commonly used or fun.
Okay, talk is cheap, show me your code! Open your Mac, click on Clion and start coding!
1. Why is Go the first one? Because I am using it personally recently and it feels very good.
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); }
Let’s take a look with Go1.7 first:
The code is as follows: qiangjian@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
Then, let’s take a look at 1.8:
The code is as follows: qiangjian@localhost:/works/learnCPP$ go18 version && time go18 build fib.go && time ./fib
go version go1.8 darwin/amd64
real 0m0.204s
user 0m0.153s
sys 0m0.062s
real 0m0.051s
user 0m0.045s
sys 0m0.003s
I can’t see the difference, but the official 1.8 has improved optimization by 20% in aspects such as GC and Compile. Maybe this demo is too simple.
2. Python has been very popular recently, so let’s compare
def fibonacci(i): if i<2: return i return fibonacci(i-2) + fibonacci(i-1) print(fibonacci(34))
Let’s take a look at python2.7 first
qiangjian@localhost:/works/learnCPP$ python2 -V && time python2 ./fib.py Python 2.7.13 5702887 real 0m2.651s user 0m2.594s sys 0m0.027s
Then comes Py 3.5
qiangjian@localhost:/works/learnCPP$ python3 -V && time python3 ./fib.py Python 3.5.1 real 0m3.110s user 0m2.982s sys 0m0.026s
The biggest problem of Py can be seen at a glance: the more you upgrade, the slower it becomes, and what’s terrible is that many syntaxes are incompatible, but it’s not bad for writing algorithms and small programs. At other times, forget it and just use Go.
3. PHP, I use it a lot at work, so I have to compare it
<?php function fibonacci($i){ if($i<2) return $i; return fibonacci($i-2) + fibonacci($i-1); } echo fibonacci(34);
Since I mainly use php5.4 for my work, I’ll do the following first:
qiangjian@localhost:/works/learnCPP$ php54 -v && time php54 fib.php PHP 5.4.43 (cli) (built: Dec 21 2016 12:01:59) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies real 0m2.288s user 0m2.248s sys 0m0.021s
The test environment is 5.6, so there is also a wave:
qiangjian@localhost:/works/learnCPP$ php -v && time php fib.php PHP 5.6.28 (cli) (built: Dec 6 2016 12:38:54) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies real 0m2.307s user 0m2.278s sys 0m0.017s
New projects, playing by yourself, etc. are all php7, please see:
qiangjian@localhost:/works/learnCPP$ php -v && time php fib.php PHP 7.1.2 (cli) (built: Feb 17 2017 10:52:17) (NTS) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies 5702887 real 0m0.815s user 0m0.780s sys 0m0.015s
I feel that php7 and 5 are completely different, not the same thing at all, and the progress has been huge. I rely on Brother Bird to give me a thumbs up! It is recommended that everyone use php7.
4.C++ is my favorite theoretical basis, of course I am talking about C++11/14, not the old antique c99 etc.
#include constexpr int fibonacci(const int i){ if(i<2) return i; return fibonacci(i-2) + fibonacci(i-1); } int main() { fibonacci(34); return 0; }
First use g++ 6.2 without optimization to see:
qiangjian@localhost:/works/learnCPP$ time g++-6 -o a.bin main.cpp && time ./a.bin real 0m0.378s user 0m0.254s sys 0m0.104s real 0m0.050s user 0m0.043s sys 0m0.002s
After adding optimization-O2,
qiangjian@localhost:/works/learnCPP$ time g++-6 -O2 -o a.bin main.cpp && time ./a.bin real 0m0.874s user 0m0.344s sys 0m0.180s real 0m0.034s user 0m0.019s sys 0m0.004s
The effect is still very obvious, and the running time is only half of the former.
5. C also wrote one
#include int fibonacci(int i){ if(i<2) return i; return fibonacci(i-2) + fibonacci(i-1); } int main(){ printf("%d",fibonacci(34)); }
Without optimization:
qiangjian@localhost:/works/learnCPP$ time gcc-6 -o c.bin fib.c && time ./c.bin real 0m0.341s user 0m0.063s sys 0m0.101s real 0m0.049s user 0m0.044s sys 0m0.002s
Add-O2 optimization:
qiangjian@localhost:/works/learnCPP$ time gcc-6 -O2 -o c.bin fib.c && time ./c.bin real 0m0.143s user 0m0.065s sys 0m0.034s real 0m0.034s user 0m0.028s sys 0m0.002s
Same as C++14, the speed is significantly improved after optimization, twice as fast.
6.Java is what I least want to write. Although it is very popular, it feels too bloated
class Fib{ public static void main(String[] args){ System.out.println(fibonacci(34)); } static int fibonacci(int i){ if(i<2) return i; return fibonacci(i-2) + fibonacci(i-1); } }
The result of compiling and running is:
qiangjian@localhost:/works/learnCPP$ java -version && time javac Fib.java && time java Fib java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) real 0m0.952s user 0m1.302s sys 0m0.144s real 0m0.150s user 0m0.123s sys 0m0.025s
The performance is okay, but the Compile time is too low compared to c++/go.
7. Of course, the last one to appear is Javascript, which has always been popular. No, to be precise, it is Nodejs (this thing has nothing to do with Java)
function fibonacci(i){ if(i<2) return i; return fibonacci(i-2) + fibonacci(i-1); } console.log(fibonacci(34))
Result:
qiangjian@localhost:/works/learnCPP$ node -v && time node fib.js v6.10.0 real 0m0.332s user 0m0.161s sys 0m0.062s
The result is still shocking. It only takes TMD 0.3s, and the total is less than 0.5s, which is almost close to Java. However, the advantages of code volume and maintainability are really thanks to Google, Chromium, and V8. Open source community.
If Nodejs really runs stably, it may not really be able to unify the “program world”. Of course, I’m just talking, don’t take it too seriously.
Let’s take a picture:
Summary:
I feel that each language has different uses, and performance is just a single indicator. What I value more is: readability, maintainability, portability, robustness, scalability, and then performance. Moreover, modern hardware is becoming more and more powerful. Mobile phones often have 8G, CPUs have caught up with the CPUs of PCs 5 years ago, and SSDs are becoming more popular… I am more optimistic about Golang/php/python, and also pay attention to modern C++, such as 14 and 17. As for rust, swift, java, and scala, this is mainly related to personal needs and the company’s technology stack. Ha ha! Let’s write this much first!