From 50da98462658182db4369c388b40ba79912527aa Mon Sep 17 00:00:00 2001 From: Rodolphe Marques Date: Wed, 18 May 2016 15:43:47 +0200 Subject: [PATCH] replaced json with rapidjson --- bigchaindb/util.py | 12 +++---- speed-tests/speed_tests.py | 70 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/bigchaindb/util.py b/bigchaindb/util.py index 59f658ef..a339d4ee 100644 --- a/bigchaindb/util.py +++ b/bigchaindb/util.py @@ -1,5 +1,4 @@ import copy -import json import time import contextlib import threading @@ -7,6 +6,8 @@ import queue import multiprocessing as mp from datetime import datetime +import rapidjson + import cryptoconditions as cc from cryptoconditions.exceptions import ParsingError @@ -109,8 +110,7 @@ def serialize(data): str: JSON formatted string """ - return json.dumps(data, skipkeys=False, ensure_ascii=False, - separators=(',', ':'), sort_keys=True) + return rapidjson.dumps(data, skipkeys=False, ensure_ascii=False, sort_keys=True) def deserialize(data): @@ -123,7 +123,7 @@ def deserialize(data): dict: dict resulting from the serialization of a JSON formatted string. """ - return json.loads(data, encoding="utf-8") + return rapidjson.loads(data) def timestamp(): @@ -275,7 +275,7 @@ def create_tx(current_owners, new_owners, inputs, operation, payload=None): conditions.append({ 'new_owners': new_owners, 'condition': { - 'details': json.loads(condition.serialize_json()), + 'details': rapidjson.loads(condition.serialize_json()), 'uri': condition.condition.serialize_uri() }, 'cid': fulfillment['fid'] @@ -493,7 +493,7 @@ def get_fulfillment_message(transaction, fulfillment, serialized=False): # there is no previous transaction so we need to create one on the fly else: current_owner = transaction['transaction']['fulfillments'][0]['current_owners'][0] - condition = json.loads(cc.Ed25519Fulfillment(public_key=current_owner).serialize_json()) + condition = rapidjson.loads(cc.Ed25519Fulfillment(public_key=current_owner).serialize_json()) fulfillment_message['condition'] = {'condition': {'details': condition}} if serialized: return serialize(fulfillment_message) diff --git a/speed-tests/speed_tests.py b/speed-tests/speed_tests.py index b6a6b016..5af7fe5f 100644 --- a/speed-tests/speed_tests.py +++ b/speed-tests/speed_tests.py @@ -1,3 +1,7 @@ +import json +import time + +import rapidjson from line_profiler import LineProfiler import bigchaindb @@ -21,5 +25,71 @@ def speedtest_validate_transaction(): profiler.print_stats() +def speedtest_serialize_block_json(): + # create a block + b = bigchaindb.Bigchain() + tx = b.create_transaction(b.me, b.me, None, 'CREATE') + tx_signed = b.sign_transaction(tx, b.me_private) + block = b.create_block([tx_signed] * 1000) + + time_start = time.time() + for _ in range(1000): + _ = json.dumps(block, skipkeys=False, ensure_ascii=False, sort_keys=True) + time_elapsed = time.time() - time_start + + print('speedtest_serialize_block_json: {} s'.format(time_elapsed)) + + +def speedtest_serialize_block_rapidjson(): + # create a block + b = bigchaindb.Bigchain() + tx = b.create_transaction(b.me, b.me, None, 'CREATE') + tx_signed = b.sign_transaction(tx, b.me_private) + block = b.create_block([tx_signed] * 1000) + + time_start = time.time() + for _ in range(1000): + _ = rapidjson.dumps(block, skipkeys=False, ensure_ascii=False, sort_keys=True) + time_elapsed = time.time() - time_start + + print('speedtest_serialize_block_rapidjson: {} s'.format(time_elapsed)) + + +def speedtest_deserialize_block_json(): + # create a block + b = bigchaindb.Bigchain() + tx = b.create_transaction(b.me, b.me, None, 'CREATE') + tx_signed = b.sign_transaction(tx, b.me_private) + block = b.create_block([tx_signed] * 1000) + block_serialized = json.dumps(block, skipkeys=False, ensure_ascii=False, sort_keys=True) + + time_start = time.time() + for _ in range(1000): + _ = json.loads(block_serialized) + time_elapsed = time.time() - time_start + + print('speedtest_deserialize_block_json: {} s'.format(time_elapsed)) + + +def speedtest_deserialize_block_rapidjson(): + # create a block + b = bigchaindb.Bigchain() + tx = b.create_transaction(b.me, b.me, None, 'CREATE') + tx_signed = b.sign_transaction(tx, b.me_private) + block = b.create_block([tx_signed] * 1000) + block_serialized = rapidjson.dumps(block, skipkeys=False, ensure_ascii=False, sort_keys=True) + + time_start = time.time() + for _ in range(1000): + _ = rapidjson.loads(block_serialized) + time_elapsed = time.time() - time_start + + print('speedtest_deserialize_block_rapidjson: {} s'.format(time_elapsed)) + + if __name__ == '__main__': speedtest_validate_transaction() + speedtest_serialize_block_json() + speedtest_serialize_block_rapidjson() + speedtest_deserialize_block_json() + speedtest_deserialize_block_rapidjson()