メモリー上で処理するよりもディスクに直接書き込む方が高速?
2015年3月28日 20:50
ソフトウェア開発者の間では一般的に、ディスクアクセスを避けてできるだけメモリー上で処理することが実行時間の短縮につながると考えられているが、これに逆行する研究結果をカナダ・カルガリー大学とブリティッシュコロンビア大学の研究チームが発表した(論文: PDF、ITworldの記事、本家/.)。
実験はJavaおよびPythonを使い、WindowsおよびLinux上で1バイト、10バイト、1,000バイトの文字列をそれぞれ100万バイトになるまで繰り返し結合し、結果をディスクに書き込むというもの。比較対象としては同じく1バイト、10バイト、1,000バイトの文字列を結合せずに計100万バイトになるまで直接ディスクに書き込んでいる。また、同じコードにより100万バイトの文字列を処理する実験も行っている。
その結果、Javaで1バイトの文字列を結合処理してからディスクに書き込んだ場合、ディスクへの直接書き込みと比べて約9,000倍の時間がかかったという。PythonではJavaほどの速度低下は見られなかったものの、直接書き込みの方がメモリー上での処理よりも数百倍高速だったとのこと。また、Linux上で実行したPythonのコードでは、元の文字列に新しい文字列を結合する方が新しい文字列に元の文字列を結合するよりも高速だったとしている。
論文ではこのような結果になった原因として、OSによるバッファリングがあるためにディスクへ直接書き込んでも速度がそれほど低下しないと指摘。また、OSのメモリー管理がメモリー上での処理を低下させる原因になる可能性もあるとし、開発者はOSやライブラリーなどについてより多くの知識を持つことでパフォーマンスを改善できるなどと結論付けている。ただし、論文の最後に掲載されているコードを見ればわかるように、文字列の結合には「+=」または「+」を使用しており、効率の良い処理を選択しているとはいえない。論文には「JavaではStringBuilderやStringBufferといったミュータブルなデータ型を使用すれば結果が大幅に改善する」といった記述もある。本家/.では結論に合わせた結果が出るように実験したのではないかとの指摘もみられるが、皆さんはどう思われるだろうか。 スラッシュドットのコメントを読む | デベロッパーセクション | ハードウェア | プログラミング | Java | デベロッパー | Python | ストレージ
関連ストーリー:
「世界一IQの低い」ソースコード 2014年08月05日
もっとも「WTF」なプログラミング言語って? 2013年09月29日
同僚にコードがひどいと言われたら、どう反応すればいい? 2013年01月12日
同僚の書く酷いコード、どうやって気づかせる? 2013年01月05日
酷いコードを収集する「ウンコード・マニア」 2012年08月14日
「世界最速」をうたう SQL データベース「MemSQL」 2012年06月26日
#俺が見たクソコード選手権、Twitterで盛り上がる 2012年04月03日
メモリデータベースでコスト削減 2006年02月22日
話題の「i-RAM」、出荷開始 2005年10月03日