読者です 読者をやめる 読者になる 読者になる

和歌山産pythonプログラマのブログ

和歌山出身プログラマmatsu7874が書いています。Python3と時々C++11を書きます。

Python3, C++11, JavaScriptでの実行時間計測

C++ Python JS 時間計測

Python3, C++11, JavaScriptでの実行時間計測

C++とJSを勉強中なのですが、Python,C++,JSの3言語で実行時間計測をどのように書くのか調べてみました。
サンプルとして$109$回足し算をする時間を計測します。

Python3

まずは普段使っているPython。バージョンはPython 3.5.1。

import time

def DoSomething():
    a = 0
    for i in range(1000000000):
        a += 1

START_TIME = time.time()

DoSomething()

ELAPSED_TIME = time.time() - START_TIME
print('Elapsed Time:', ELAPSED_TIME*1000 ,'[ms]')

C++11

バージョンはg++ (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 5.1.0。
g++ -std=c++0xコンパイルしました。(最適化オプションは付けていません。)

#include <iostream>
#include <chrono>

long DoSomething(){
    long a=0;
    for(int i = 0; i<1000000000; ++i){
        ++a;
    }
    return a;
}

int main(){
    std::chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();

    DoSomething();

    end = std::chrono::system_clock::now();
    double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << "Elapsed Time: " << elapsed << "[ms]" << std::endl;

}

JavaScript

最近競プロで使っているのですが、まだ速いのか遅いのか分からない言語。環境はNode.js v4.4.4。

function DoSomething() {
    var a;
    for (var i = 0; i < 1000000000; ++i){
        ++a;
    }
}

var start = new Date().getTime();

DoSomething();

var end = new Date().getTime();
console.log("Elapsed Time: " + (end - start) + "[ms]");

結果

C++Pythonの40倍速い!
JSもPythonの25倍速い!

言語 実行時間[ms] Python
Python3 91966 1
C++ 2216 0.0241
JS 3646 0.0396

これは強い人がC++を使うのも全くよく分かります。

追記

関数を渡すと実行時間と戻り値を表示してくれる関数にした方が使いやすいので、書き換えました。

def measure_elapsed_time(func):
    START_TIME = time.time()

    res = func()

    ELAPSED_TIME = time.time() - START_TIME

    print('Elapsed Time:', ELAPSED_TIME*1000 ,'[ms]')
    print(res)

if __name__ == '__main__':
    measure_elapsed_time(DoSomething)
template<class F>
void MeasureElapsedTime(F func){
    std::chrono::system_clock::time_point  start, end;
    start = std::chrono::system_clock::now();

    auto res = func();

    end = std::chrono::system_clock::now();
    double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
    std::cout << "Elapsed Time: " << elapsed << "[ms]" << std::endl;
    std::cout << res << std::endl;
}

int main(){
    MeasureElapsedTime(DoSomething);
}
function measureElapsedTime(func){
    var start = new Date().getTime();

    var res = func();

    var end = new Date().getTime();
    console.log("Elapsed Time: " + (end - start) + "[ms]");
    console.log(res);
}

measureElapsedTime(DoSomething);