海外テック情報局

C言語より高速なJavaScriptによるバイナリ操作が話題

画像

JavaScriptなどのスクリプト言語は動作が遅く、最適なパフォーマンスを得るにはC/C++で実装しなければならないという常識に挑んだ講演が国内外で大きな話題になっています。

題材になったのはベルリンの開発者、Felix Geisendorfer氏によるNode.jsからMySQLに接続するためのバインディングの実装です。Node.jsからMySQLへ接続するためのバインディングはJavaScriptだけで実装されているもの、Cで実装されたライブラリ(libmysql)を使ったもの、MySQLからフォークしたデータベース、MariaDBのライブラリを使ったものなど複数が存在しています。

Felix氏はあくまでJavaScriptのみによる実装で、C言語で実装されたライブラリを使ったバインディングを越えるパフォーマンスの実現に挑戦しました。次々に登場するライブラリの高いパフォーマンスを見るたびに「もうCのバインディングに勝つなんて無理だよ……」と弱音を吐きつつも、Node.jsが利用するJavaScript実行エンジンのV8の特性を探求した実装によりついにC言語で実装されたライブラリを越えるパフォーマンスを実現しています。

ただしそこで行われた実装は極めて特殊な実装といってよいでしょう。一例として次のようなレコードの情報を配列に格納する関数が挙げられています。

function parseRow(columns, parser) {
  var row = {};
  for (var i = 0; i < columns.length; i++) {
    row[columns[i].name] = parser.readColumnValue();
  }
}

上記の関数をV8の特性を利用して書きなおしたものが次のリストです。

var code = 'return {\n';
columns.forEach(function(column) {
  code += '"' + column.name + '":' + 'parser.
readColumnValue(),\n';
});
code += '};\n';
var parseRow = new Function('columns', 'parser', code);

これはevalとnew Functionを組み合わせた動的コード生成を行うことで実行性能が上がるという彼の発見から生まれた実装です。ほかにもswtich文を避ける、文字列のバッファリングは高性能であるといった点が紹介されていました。これはJavaScript一般には当てはまらず、あくまでV8の特性によるものであることには注意が必要です。可読性は低く、通常は参考にならない手法ですが、Felix氏によるとベンチマーク駆動開発ということであくまでパフォーマンスを上げることだけに注目したチューンナップだったようです。この情熱と結果には賞賛の声が数多く寄せられていました。

URLhttps://github.com/felixge/faster-than-c

著者プロフィール

安藤祐介(あんどうゆうすけ)

下北沢OSSカフェの常連。 イベントラッシュが終わって疲労気味。

Twitter:yando

小倉純也(おぐらじゅんや)

QNYP、LLC.のプログラマ。そろそろ自社サービスをサービスインしないと……。

Twitter:junya

溝畑考史(みぞはたたかし)

サンフランシスコにやってきました!

Twitter:beatak

おすすめ記事

記事・ニュース一覧