複数のプログラミング言語で約 1GB の CSV ファイルを Read/Write して時間を測定してみました!
共通ルール
- どの言語でも同じファイルを使用して確認すること
- ファイルは一行ずつ読み散り、一行ずつ書き込むこと
- OSの差を無くすため、Docker Image は全て base(Ubuntu 18.04 LTS)を使用すること
まずは結果
言語 | 5回実行した平均タイム(秒) |
---|---|
C-lang | 6.2962 |
C++ | 6.0538 |
C# | 17.1798 |
Golang | 10.3966 |
Java | 21.0840 |
Python | 32.6949 |
Ruby | 30.7153 |
Scala | 21.8364 |
やっぱりC/C++がダントツで早い!!
次点でGo言語
実装サンプル
5年ぶりくらいにC++書いたので綺麗ではないと思いますが、一番早かったのでサンプルとして載せます。
他の言語でも以下の動作をベースとして実装しました。
- 5回実行した平均時間を計算
- 1行読んで1行書き込む
#include <iostream>
#include <fstream>
#include <time.h>
#include <iomanip>
using namespace std;
int main(int argc, char *argv[])
{
cout << "START!!!" << endl;
clock_t start, end;
double time, sum = 0;
int count = 5;
for (int i = 0; i < count; i++)
{
start = clock();
ifstream ifs("/fixtures/sample.csv");
ofstream ofs("./sample.csv");
const int SIZE = 1024;
char buffer[SIZE];
while (ifs.getline(buffer, SIZE))
{
// ofs << buffer << endl; だとめっちゃ遅い
ofs << buffer << "\n";
}
end = clock();
time = (double)(end - start) / CLOCKS_PER_SEC;
cout << "Time Result: ";
cout << fixed << setprecision(4) << time << endl;
sum += time;
}
cout << "C++ Average: ";
cout << fixed << setprecision(4) << sum / count << endl;
return 0;
}
ソース内のコメントに記載しましたが、C++では ofs << buffer << endl;
で書き込むと速度が著しく低下する問題が発生したため、自分で改行コードを追記しています。
所感
結果としては予想通りで、C/C++がダントツでした。
RubyやPythonはスクリプト言語なので遅いかな〜と思いましたがやはり遅かったです。(私の書き方の問題かもですが)
Go言語も早かったので仕事で使ったことが無いのですがとても興味が湧きました!
その他
本当はRustも作りたかったのですが知識不足で途中まで実装して挫折したので今回は対象外としました。
Rustラブな方からのPRいつでもお待ちしております!
また、私の実装よりもより早くできて今回の順位と異なる結果となる書き方がありましたらPRお待ちしております!
(基本コンセプトはそのままだとありがたいです)
今回作成したリポジトリ