Help us understand the problem. What is going on with this article?

色々な言語でファイルIOを競って速度比較

複数のプログラミング言語で約 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お待ちしております!
(基本コンセプトはそのままだとありがたいです)

今回作成したリポジトリ

https://github.com/MasanoriIwakura/multi-lang-battle

MasanoriIwakura
フルスタックを目指しているサーバーサイド〜インフラエンジニア SIerで4年ほど消化しましたが現在はWeb系エンジニアです。 技術書典7にて書籍出したので興味がある方はご覧ください! https://booth.pm/ja/items/1555055
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした