Twitterに投稿 はてなブックマークに追加 Yahoo!ブックマークに追加 Google Bookmarksに追加

目次 >> C、C++ >> Tips

fstreamのバッファを増やすには?

ここでは、ofstreamのバッファを増やして、書き込み性能を向上させてみる。
ofstreamのバッファはrdbufでアクセスできる。
char buf[bufsize];
でバッファを確保し、
pubsetbuf(buf,bufsize)
でバッファをセットする。

下記は、10MB分ファイルに書き込むプログラムである。

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{
    const int bufsize=1000000;
    char buf[bufsize];
    ofstream os;
    os.rdbuf()->pubsetbuf(buf,bufsize);
    os.open ("test.txt",ios::out);
    for (int i=0;i<10000000;i++)
    {
        os<<"a";
    }
    os.close();
    return 0;
}

この実行は、バッファを大きくとったため、ほぼ一瞬で終わる。

$ time ./a.out
real 0m0.274s
user 0m0.260s
sys 0m0.020s

一方、バッファを小さくとると、

#include <iostream>
#include <fstream>
using namespace std;

int main(void)
{
    const int bufsize=2;
    char buf[bufsize];
    ofstream os;
    os.rdbuf()->pubsetbuf(buf,bufsize);
    os.open ("test.txt",ios::out);
    for (int i=0;i<10000000;i++)
    {
        os<<"a";
    }
    os.close();
    return 0;
}

下記のように非常に長い時間がかかることがわかる。

$ time ./a.out
real 0m10.258s
user 0m1.190s
sys 0m9.050s

最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて17.04、18.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2014 Chikuma Engineering Co., Ltd. All Rights Reserved.