wordreference/libjson/_internal/TestSuite/Benchmark/main.cpp

311 lines
7 KiB
C++

/**
*
* This test suite should get run before releasing a new version of libjson, once all
* unit tests have passed. This asserts that the Options are in the default configuration,
* this prevents me from accidentally releasing libjson using options that I had been testing
* with. It also performs a speed benchmark, so I can keep track of how libjson is performing
*
*/
#include <iostream>
#include <string>
#include <ctime>
#include "../../libjson.h"
using namespace std;
#ifndef JSON_LIBRARY
#error, JSON_LIBRARY not on
#endif
#ifdef JSON_STRICT
#error, JSON_STRICT on
#endif
#ifdef JSON_DEBUG
#error, JSON_DEBUG on
#endif
#ifdef JSON_ISO_STRICT
#error, JSON_ISO_STRICT on
#endif
#ifndef JSON_SAFE
#error, JSON_SAFE not on
#endif
#ifndef JSON_CASTABLE
#error, JSON_CASTABLE not on
#endif
#ifdef JSON_STDERROR
#error, JSON_STDERROR on
#endif
#ifdef JSON_PREPARSE
#error, JSON_PREPARSE on
#endif
#ifdef JSON_LESS_MEMORY
#error, JSON_LESS_MEMORY on
#endif
#ifdef JSON_UNICODE
#error, JSON_UNICODE on
#endif
#ifndef JSON_REF_COUNT
#error, JSON_REF_COUNT not on
#endif
#ifndef JSON_BINARY
#error, JSON_BINARY not on
#endif
#ifndef JSON_EXPOSE_BASE64
#error, JSON_EXPOSE_BASE64 not on
#endif
#ifndef JSON_ITERATORS
#error, JSON_ITERATORS not on
#endif
#ifndef JSON_STREAM
#error, JSON_STREAM not on
#endif
#ifdef JSON_MEMORY_CALLBACKS
#error, JSON_MEMORY_CALLBACKS on
#endif
#ifdef JSON_MEMORY_MANAGE
#error, JSON_MEMORY_MANAGE on
#endif
#ifdef JSON_MUTEX_CALLBACKS
#error, JSON_MUTEX_CALLBACKS on
#endif
#ifdef JSON_MUTEX_MANAGE
#error, JSON_MUTEX_MANAGE on
#endif
#ifdef JSON_NO_C_CONSTS
#error, JSON_NO_C_CONSTS on
#endif
#ifdef JSON_OCTAL
#error, JSON_OCTAL on
#endif
#if (JSON_READ_PRIORITY != HIGH)
#error JSON_READ_PRIORITY not high
#endif
#if (JSON_WRITE_PRIORITY != MED)
#error JSON_WRITE_PRIORITY not med
#endif
#ifdef JSON_NEWLINE
#error, JSON_NEWLINE on
#endif
#ifdef JSON_INDENT
#error, JSON_INDENT on
#endif
#ifndef JSON_ESCAPE_WRITES
#error, JSON_ESCAPE_WRITES not on
#endif
#ifndef JSON_COMMENTS
#error, JSON_COMMENTS not on
#endif
#ifdef JSON_WRITE_BASH_COMMENTS
#error, JSON_WRITE_BASH_COMMENTS on
#endif
#ifdef JSON_WRITE_SINGLE_LINE_COMMENTS
#error, JSON_WRITE_SINGLE_LINE_COMMENTS on
#endif
#ifdef JSON_ARRAY_ON_ONE_LINE
#error, JSON_ARRAY_ON_ONE_LINE on
#endif
#ifndef JSON_VALIDATE
#error, JSON_VALIDATE not on
#endif
#ifndef JSON_CASE_INSENSITIVE_FUNCTIONS
#error, JSON_CASE_INSENSITIVE_FUNCTIONS not on
#endif
#ifdef JSON_INDEX_TYPE
#error, JSON_INDEX_TYPE on
#endif
#ifdef JSON_BOOL_TYPE
#error, JSON_BOOL_TYPE on
#endif
#ifdef JSON_INT_TYPE
#error, JSON_INT_TYPE on
#endif
#ifdef JSON_STRING_HEADER
#error, JSON_STRING_HEADER on
#endif
#ifdef JSON_NO_EXCEPTIONS
#error, JSON_NO_EXCEPTIONS on
#endif
#ifndef JSON_DEPRECATED_FUNCTIONS
#error, JSON_DEPRECATED_FUNCTIONS not on
#endif
#if (JSON_SECURITY_MAX_NEST_LEVEL != 128)
#error JSON_SECURITY_MAX_NEST_LEVEL not 128
#endif
#if (JSON_SECURITY_MAX_STRING_LENGTH != 33554432)
#error JSON_SECURITY_MAX_STRING_LENGTH not 33554432
#endif
#if (JSON_SECURITY_MAX_STREAM_OBJECTS != 128)
#error JSON_SECURITY_MAX_STREAM_OBJECTS not 128
#endif
#ifdef JSON_MEMORY_POOL
#error JSON_MEMORY_POOL is on
#endif
#ifdef JSON_UNIT_TEST
#error, JSON_UNIT_TEST on
#endif
#define IT_COUNT 50000
static string makeBigFormatted(){
string json = "{\n";
for(unsigned int i = 0; i < IT_COUNT; ++i){
json += "\t//This is an object\r\n\t{\n\t\t\"name\" : 14.783,\n\t\t/* This is a multilen commenet */\n\t\t\"another\" : \"I am a stirng\"\n\t},";
json += "\n\n\t//This is an array\r\n\t[4, 16, true, false, 78.98],\n";
}
json += "\t\"number\" : null\n}";
return json;
}
static string makeBig(){
string json = "{";
for(unsigned int i = 0; i < IT_COUNT; ++i){
json += "{\"name\":14.783,\"another\":\"I am a stirng\"},";
json += "[4, 16, true, false, 78.98],";
}
json += "\"number\":null}";
return json;
}
int main (int argc, char * const argv[]) {
JSONNODE * node;
string mystr = makeBigFormatted();
clock_t start = clock();
for(unsigned int i = 0; i < 100; ++i){
node = json_parse(mystr.c_str());
for (unsigned int j = 0; j < IT_COUNT; ++j){
JSONNODE * meh = json_at(node, j * 2);
json_as_float(json_get(meh, "name"));
char * str = json_as_string(json_get(meh, "another"));
json_free(str);
meh = json_at(node, j * 2 + 1);
json_as_int(json_at(meh, 0));
json_as_int(json_at(meh, 1));
json_as_bool(json_at(meh, 2));
json_as_bool(json_at(meh, 3));
json_as_int(json_at(meh, 4));
}
json_delete(node);
}
cout << "Reading: " << clock() - start << endl;
mystr = makeBig();
start = clock();
for(unsigned int i = 0; i < 100; ++i){
node = json_parse(mystr.c_str());
for (unsigned int j = 0; j < IT_COUNT; ++j){
JSONNODE * meh = json_at(node, j * 2);
json_as_float(json_get(meh, "name"));
char * str = json_as_string(json_get(meh, "another"));
json_free(str);
meh = json_at(node, j * 2 + 1);
json_as_int(json_at(meh, 0));
json_as_int(json_at(meh, 1));
json_as_bool(json_at(meh, 2));
json_as_bool(json_at(meh, 3));
json_as_int(json_at(meh, 4));
}
json_delete(node);
}
cout << "Reading Unformatted: " << clock() - start << endl;
start = clock();
for(unsigned int i = 0; i < 100; ++i){
node = json_new(JSON_NODE);
for (unsigned int j = 0; j < IT_COUNT; ++j){
JSONNODE * meh = json_new(JSON_NODE);
json_push_back(meh, json_new_f("name", 14.783));
json_push_back(meh, json_new_a("another", "I am a string"));
json_push_back(node, meh);
meh = json_new(JSON_ARRAY);
json_push_back(meh, json_new_i(NULL, 14));
json_push_back(meh, json_new_i("", 1));
json_push_back(meh, json_new_b(NULL, true));
json_push_back(meh, json_new_b("", false));
json_push_back(meh, json_new_f(NULL, 14.3243));
json_push_back(node, meh);
}
json_delete(node);
}
cout << "Building: " << clock() - start << endl;
node = json_new(JSON_NODE);
for (unsigned int j = 0; j < IT_COUNT; ++j){
JSONNODE * meh = json_new(JSON_NODE);
json_push_back(meh, json_new_f("name", 14.783));
json_push_back(meh, json_new_a("another", "I am a string"));
json_push_back(node, meh);
meh = json_new(JSON_ARRAY);
json_push_back(meh, json_new_i(NULL, 14));
json_push_back(meh, json_new_i("", 1));
json_push_back(meh, json_new_b(NULL, true));
json_push_back(meh, json_new_b("", false));
json_push_back(meh, json_new_f(NULL, 14.3243));
json_push_back(node, meh);
}
start = clock();
for(unsigned int i = 0; i < 100; ++i){
char * str = json_write_formatted(node);
json_free(str);
}
cout << "Writing: " << clock() - start << endl;
start = clock();
for(unsigned int i = 0; i < 100; ++i){
char * str = json_write(node);
json_free(str);
}
cout << "Writing Unformatted: " << clock() - start << endl;
json_delete(node);
return 0;
}