프로그래밍 언어 별 성능 측정

원본에서 더 깔끔합니다.

 

[알고리즘]

비교 알고리즘: 피보나치 수열

반복횟수: 5회

피보나치 값: 38

 

[C++] (MSVC, 최적화 안함)

#include <iostream>
#include "HourMeter.h"
using namespace std;
int fibonacci(const int value) {
	if (value == 0 || value == 1) {
		return 1;
	}
	return fibonacci(value - 1) + fibonacci(value - 2);
};
void main() {
	HourMeter hm;
	int fibValue{ 38 };

	for(int i=0;i<5;i++){
		printf("fibValue: %d\n", fibValue);
		hm.startMeasure();
		int result = fibonacci(fibValue);
		hm.endMeasure();
		printf("value: %d\n", result);
	}
}

 

[Node.js]

function fibonacci(value){
  if(value === 0 || value === 1){
    return 1;
  }
  return fibonacci(value - 1) + fibonacci(value - 2);
}

let result;
let fibValue = 38;

for(let i=0;i<5;i++){
  console.time('alice');
  result = fibonacci(fibValue);
  console.timeEnd('alice');
  console.log(result);
}

 

[LuaJIT]

function fiboniacci(value)
  if (value == 0 or value == 1) then
    return 1
  end

  return fiboniacci(value - 1) + fiboniacci(value - 2)
end

fibValue = 38
for i=1,5 do
  start_time = os.clock()
  result = fiboniacci(fibValue)
  end_time = os.clock()

  elapsed_time = end_time - start_time

  print("elapsed_time: " .. elapsed_time .. "sec");
  print("result: " .. result)
end

 

[Golang]

package main

import (
  "time"
)

func fibonacci(value int) int {
  if value == 0 || value == 1 {
    return 1
  }
  return fibonacci(value-1) + fibonacci(value-2)
}

func main() {
	fibValue := 38
	for i:=0;i<5;i++ {
		startTime := time.Now()
		result := fibonacci(fibValue)
		elapsedTime := time.Since(startTime)
		d2 := elapsedTime / time.Millisecond
		println("time: ", d2, ", result: ", result)
	}
}

 

[웹 브라우저] (파이어폭스, 크롬, 엣지)

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Go wasm</title>
    <script>
        function fibonacci(value){
				  if(value === 0 || value === 1){
					return 1;
				  }
				  return fibonacci(value - 1) + fibonacci(value - 2);
				}
		
				let result;
				let fibValue = 38;
		
				for(let i=0;i<5;i++){
				  console.time('alice');
				  result = fibonacci(fibValue);
				  console.timeEnd('alice');
				  console.log(result);
				}
    </script>
</head>
<body>
</body>
</html>

 

[Rust]

//rustc ./main.rs
use std::time::{Instant};

fn fib(value: i32) -> i32 {
  if value == 0 || value == 1 {
      return 1;
  }
  return fib(value - 1) + fib(value - 2);
}

fn main() {
  let fib_value= 38;
  for _n in 1..5 {
    println!("start. fib_value {}", fib_value);
    let start_time = Instant::now();
    let a: i32 = fib(fib_value);
    let end_time = Instant::now();
    let elapsed_time = end_time.duration_since(start_time);
    println!("{:?}", elapsed_time);
    println!("{}", a);
  }
}

 

[C#]

using System;
using System.Text;
using System.Diagnostics;

class MainClass {
  static long fibonacci(long value){
    if(value == 0 || value == 1){
      return 1;
    }
    return fibonacci(value - 1) + fibonacci(value - 2);
  }

  public static void Main (string[] args) {
    int fibValue = 38;
    Console.WriteLine("fibValue: " + fibValue);
    for(int i = 0; i < 5; i++)
    {
		    Stopwatch sw = new Stopwatch();
        sw.Start();
        long result = fibonacci(fibValue);
        sw.Stop();
        Console.WriteLine("result: " + result);
        Console.WriteLine("time:" + sw.ElapsedMilliseconds.ToString() + "ms");
    }
  }
}

 

[Java]

class Main {
  static long fibonacci(long value){
    if(value == 0 || value == 1){
      return 1;
    }
    return fibonacci(value - 1) + fibonacci(value - 2);
  }

  public static void main(String[] args) {
    long fibValue = 38;
    System.out.println("fibValue: " + fibValue);
    for(int i=0;i<5;i++){
      long startTime = System.currentTimeMillis();
      long result = fibonacci(fibValue);
      long endTime = System.currentTimeMillis();
      System.out.println("result: " + result);
      System.out.println("elapsed time:" + (endTime - startTime) + "ms");
    }
  }
}

 

[Python]

import time

def fibonacci(value):
  if value == 0 or value == 1:
    return 1
  return fibonacci(value - 1) + fibonacci(value - 2)

fibValue = 38

for i in range(0, 5):
  print('start fibonacci')
  start = time.time()
  result = fibonacci(fibValue)
  end = time.time()
  print('result(', i, '): ', result)
  print('elapsed time: ', end - start, 's')

 

 

[테스트 환경]

*운영체제: 윈도우 10 pro 64비트

→ 빌드 버전: 1903

*CPU: AMD Ryzen 1700 8-Core Processor

*RAM: 32.0GB

 

[테스트 결과]

*C++: 0.290초 (최적화 사용시 0초)

*Golang: 0.296초

*Node.js: 0.483초

*Python: 15.744초

*C#: 0.307초

*Java (v1.8.0_251): 0.248초

*Rust: 0.580초

*LuaJIT: 0.535초

*파이어폭스: 0.365초

*크롬: 0.521초

*엣지: 0.525초

 

 

[속도 순서 정렬]

*C++ (최적화 사용시 0초) >>>> Java > Golang > C# >파이어폭스> Node.js > 크롬 > 엣지 > LuaJIT > Rust >>>>> Python

 

[주의사항]

*본 테스트는 오로지 피보나치 수열에서의 성능만 측정하였으므로, 이로 인해 언어의 성능을 판단하기 부족합니다.