LoginSignup
16
15

More than 5 years have passed since last update.

msgpackのデシリアイズ性能比較(C++/Python/Ruby)

Last updated at Posted at 2015-09-14

C++, Python, Rubyで各msgpackのライブラリを使用した読み込みがどの程度の性能なのか調べました。厳密さは求めておらずざっくりとした性能感を知りたかったのが目的なので、細かい調整などはしていません。以下が10,000,000メッセージを標準入力で読み込ませた時の性能です。

環境 user time sys time total performance
C++ (Apple LLVM version 6.1.0 (clang-602.0.53) + msgpack-c 1.2.0) 6.13s 1.38s 7.649 1,307,360.43 msg/sec
Python (Python 2.7.6 +,msgpack-python 0.4.6) 17.50s 1.62s 20.561 486,357.66 msg/sec
Ruby (2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14] + msgpack-ruby 0.6.2) 26.67s 0.95s 27.729 360,633.27 msg/sec

以下、詳細です。

測定環境

  • MacBook Pro (Retina, Mid 2012)
  • OSX Yosemite 10.10.4 (14E46)
  • CPU: 2.3 GHz Intel Core i7
  • Memory: 16 GB 1600 MHz DDR3

測定方法

  • 10,000,000件のメッセージを標準入力で読み込ませる。
  • 読み込んだメッセージがArrayかどうかを確認し、数え上げる
  • 実行時間測定はtimeコマンド
  • 数回実行して最も短かった実行時間を記載

測定に利用したコード

C++

#include <msgpack.hpp>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char *argv[]) {
  static const size_t BUFSIZE = 4096;
  msgpack::unpacker unpkr;
  int rc;
  int array_count = 0;

  char buf[BUFSIZE];

  while (0 < (rc = read(0, buf, sizeof(buf)))) {
    unpkr.reserve_buffer(rc);
    memcpy(unpkr.buffer(), buf, rc);
    unpkr.buffer_consumed(rc);

    msgpack::unpacked result;
    while (unpkr.next(&result)) {
      const msgpack::object &obj = result.get();
      if (obj.type == msgpack::type::ARRAY) {
        array_count++;
      }
      result.zone().reset();
    }
  }
  printf("%d\n", array_count);

  return 0;
}

Python

#!/usr/bin/env python

import msgpack
import sys

array_count = 0
for msg in msgpack.Unpacker(sys.stdin):
    if isinstance(msg, list): array_count += 1

print array_count

Ruby

#!/usr/bin/env ruby

require 'msgpack'

array_count = 0

unpkr = MessagePack::Unpacker.new(STDIN)
unpkr.each do |msg|
  if msg.instance_of? Array
    array_count += 1
  end
end

puts array_count
16
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15