Comparaison des performances de désérialisation de msgpack (C ++ / Python / Ruby)

J'ai étudié les performances de lecture en utilisant chaque bibliothèque msgpack en C ++, Python et Ruby. Je n'ai pas demandé de rigueur, mais je voulais avoir une idée approximative de la performance, donc je n'ai pas fait de réglages fins. Voici les performances lors de la lecture de 10 000 000 messages avec une entrée standard.

environnement 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

Voici les détails.

Environnement de mesure

Méthode de mesure

Code utilisé pour la mesure

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

Recommended Posts

Comparaison des performances de désérialisation de msgpack (C ++ / Python / Ruby)
Comparaison de vitesse de Python, Java, C ++
Comparaison grammaticale de base en cinq langues (C #, Java, Python, Ruby, Kotlin)
Sélection en plusieurs étapes (Go / C # / Ruby / Python)
Appeler popcount depuis Ruby / Python / C #
4 langage de comparaison de fermeture (Python, JavaScript, Java, C ++)
Grande différence dans les performances de ruby, python, httpd
Premier Python 3 ~ Première comparaison ~
Comparaison des performances du détecteur de visage avec Python + OpenCV
notes de python C ++
python, openFrameworks (c ++)
paiza POH ec-campagne (C # / Java / Python / Ruby) # paizahack_01
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Comparaison du temps d'exécution de Python SDP
Pointeur de modèle d'extension Python C / C ++
Ruby, Python et carte
Next Python en langage C
Python et Ruby se séparent
Comparaison du gestionnaire de packages Python
API C en Python 3
ABC147 C --HonestOrUnkind2 [Python]
Résolution avec Ruby et Python AtCoder ARC 059 C Méthode du carré minimum
Comparaison des performances du framework Web Python (Django, Flask, responder, FastAPI, japronto)
Mandelbrot Benchmark (C, PHP, HHVM, Ruby, Python, PyPy et Kinx)
Résolution avec Ruby et Python AtCoder ABC011 C Méthode de planification dynamique
Résolution avec Ruby et Python AtCoder ARC067 C factorisation premier
AtCoder ABC151 Problème D Comparaison de la vitesse en C ++ / Python / PyPy
Performances Ruby vs Python Comment choisir la bonne technologie?