Skip to content

Commit da34f9a

Browse files
committed
Add Google Benchmark for calling conventions
- disable it on ubuntu 18.04 tests, which fail for [really can't figure out why]
1 parent 1f76737 commit da34f9a

File tree

9 files changed

+137
-23
lines changed

9 files changed

+137
-23
lines changed

.appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ environment:
2323
build_script:
2424
- mkdir build
2525
- cd build
26-
- ps: cmake -DSIMDJSON_BUILD_STATIC="$env:SIMDJSON_BUILD_STATIC" -DSIMDJSON_ENABLE_THREADS="$env:THREADS" -DCMAKE_BUILD_TYPE=Release -DCMAKE_GENERATOR_PLATFORM=x64 ..
26+
- ps: cmake -DSIMDJSON_BUILD_STATIC="$env:SIMDJSON_BUILD_STATIC" -DSIMDJSON_ENABLE_THREADS="$env:THREADS" -DCMAKE_BUILD_TYPE=Release -DCMAKE_GENERATOR_PLATFORM=x64 -DSIMDJSON_GOOGLE_BENCHMARKS=OFF ..
2727
- cmake --build .
2828
- ctest --verbose --output-on-failure
2929

.drone.yml

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,13 @@ steps:
126126
environment:
127127
CC: clang
128128
CXX: clang++
129+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=OFF -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
129130
commands:
130131
- apt-get update -qq
131132
- apt-get install -y clang make cmake
132133
- $CC --version
133134
- mkdir build && cd build
134-
- cmake -DSIMDJSON_BUILD_STATIC=OFF $CMAKE_FLAGS ..
135+
- cmake $CMAKE_FLAGS ..
135136
- make -j
136137
- ctest --output-on-failure
137138
---
@@ -148,12 +149,13 @@ steps:
148149
environment:
149150
CC: clang
150151
CXX: clang++
152+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
151153
commands:
152154
- apt-get update -qq
153155
- apt-get install -y clang make cmake
154156
- $CC --version
155157
- mkdir build && cd build
156-
- cmake -DSIMDJSON_BUILD_STATIC=ON $CMAKE_FLAGS ..
158+
- cmake $CMAKE_FLAGS ..
157159
- make -j
158160
- ctest --output-on-failure
159161
---
@@ -170,12 +172,13 @@ steps:
170172
environment:
171173
CC: gcc
172174
CXX: g++
175+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=ON
173176
commands:
174177
- apt-get update -qq
175178
- apt-get install -y cmake
176179
- $CC --version
177180
- mkdir build && cd build
178-
- cmake -DSIMDJSON_BUILD_STATIC=ON $CMAKE_FLAGS ..
181+
- cmake $CMAKE_FLAGS ..
179182
- make -j
180183
- ctest --output-on-failure
181184
---
@@ -192,12 +195,13 @@ steps:
192195
environment:
193196
CC: gcc
194197
CXX: g++
198+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=OFF
195199
commands:
196200
- apt-get update -qq
197201
- apt-get install -y cmake
198202
- $CC --version
199203
- mkdir build && cd build
200-
- cmake -DSIMDJSON_BUILD_STATIC=OFF $CMAKE_FLAGS ..
204+
- cmake $CMAKE_FLAGS ..
201205
- make -j
202206
- ctest --output-on-failure
203207
---
@@ -214,12 +218,13 @@ steps:
214218
environment:
215219
CC: clang
216220
CXX: clang++
221+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=OFF -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
217222
commands:
218223
- apt-get update -qq
219224
- apt-get install -y clang make cmake
220225
- $CC --version
221226
- mkdir build && cd build
222-
- cmake -DSIMDJSON_BUILD_STATIC=OFF $CMAKE_FLAGS ..
227+
- cmake $CMAKE_FLAGS ..
223228
- make -j
224229
- ctest --output-on-failure
225230
---
@@ -236,12 +241,13 @@ steps:
236241
environment:
237242
CC: gcc
238243
CXX: g++
244+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=OFF
239245
commands:
240246
- apt-get update -qq
241247
- apt-get install -y cmake
242248
- $CC --version
243249
- mkdir build && cd build
244-
- cmake -DSIMDJSON_BUILD_STATIC=OFF $CMAKE_FLAGS ..
250+
- cmake $CMAKE_FLAGS ..
245251
- make -j
246252
- ctest --output-on-failure
247253
---
@@ -258,12 +264,13 @@ steps:
258264
environment:
259265
CC: clang
260266
CXX: clang++
267+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
261268
commands:
262269
- apt-get update -qq
263270
- apt-get install -y clang make cmake
264271
- $CC --version
265272
- mkdir build && cd build
266-
- cmake -DSIMDJSON_BUILD_STATIC=ON $CMAKE_FLAGS ..
273+
- cmake $CMAKE_FLAGS ..
267274
- make -j
268275
- ctest --output-on-failure
269276
---
@@ -280,12 +287,13 @@ steps:
280287
environment:
281288
CC: gcc
282289
CXX: g++
290+
CMAKE_FLAGS: -DSIMDJSON_BUILD_STATIC=ON
283291
commands:
284292
- apt-get update -qq
285293
- apt-get install -y cmake
286294
- $CC --version
287295
- mkdir build && cd build
288-
- cmake -DSIMDJSON_BUILD_STATIC=ON $CMAKE_FLAGS ..
296+
- cmake $CMAKE_FLAGS ..
289297
- make -j
290298
- ctest --output-on-failure
291299

@@ -303,12 +311,13 @@ steps:
303311
environment:
304312
CC: clang
305313
CXX: clang++
314+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
306315
commands:
307316
- apt-get update -qq
308317
- apt-get install -y clang make cmake
309318
- $CC --version
310319
- mkdir build && cd build
311-
- cmake -DSIMDJSON_SANITIZE=ON $CMAKE_FLAGS ..
320+
- cmake $CMAKE_FLAGS ..
312321
- make -j
313322
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure
314323
---
@@ -325,12 +334,13 @@ steps:
325334
environment:
326335
CC: gcc
327336
CXX: g++
337+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
328338
commands:
329339
- apt-get update -qq
330340
- apt-get install -y cmake
331341
- $CC --version
332342
- mkdir build && cd build
333-
- cmake -DSIMDJSON_SANITIZE=ON $CMAKE_FLAGS ..
343+
- cmake $CMAKE_FLAGS ..
334344
- make -j
335345
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure
336346

@@ -348,12 +358,13 @@ steps:
348358
environment:
349359
CC: clang
350360
CXX: clang++
361+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
351362
commands:
352363
- apt-get update -y
353364
- apt-get install -y make $CC g++ cmake
354365
- $CC --version
355366
- mkdir build && cd build
356-
- cmake -DSIMDJSON_SANITIZE=ON $CMAKE_FLAGS ..
367+
- cmake $CMAKE_FLAGS ..
357368
- make -j
358369
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure
359370
---
@@ -370,12 +381,13 @@ steps:
370381
environment:
371382
CC: gcc
372383
CXX: g++
384+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
373385
commands:
374386
- apt-get update -qq
375387
- apt-get install -y cmake
376388
- $CC --version
377389
- mkdir build && cd build
378-
- cmake -DSIMDJSON_SANITIZE=ON $CMAKE_FLAGS ..
390+
- cmake $CMAKE_FLAGS ..
379391
- make -j
380392
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure
381393

@@ -393,12 +405,13 @@ steps:
393405
environment:
394406
CC: clang
395407
CXX: clang++
408+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_DISABLE_AVX=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
396409
commands:
397410
- apt-get update -qq
398411
- apt-get install -y clang make cmake
399412
- $CC --version
400413
- mkdir build && cd build
401-
- cmake -DSIMDJSON_SANITIZE=ON -DSIMDJSON_DISABLE_AVX=ON $CMAKE_FLAGS ..
414+
- cmake $CMAKE_FLAGS ..
402415
- make -j
403416
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure
404417
---
@@ -415,11 +428,12 @@ steps:
415428
environment:
416429
CC: gcc
417430
CXX: g++
431+
CMAKE_FLAGS: -DSIMDJSON_SANITIZE=ON -DSIMDJSON_DISABLE_AVX=ON -DSIMDJSON_GOOGLE_BENCHMARKS=OFF
418432
commands:
419433
- apt-get update -qq
420434
- apt-get install -y cmake
421435
- $CC --version
422436
- mkdir build && cd build
423-
- cmake -DSIMDJSON_SANITIZE=ON -DSIMDJSON_DISABLE_AVX=ON $CMAKE_FLAGS ..
437+
- cmake $CMAKE_FLAGS ..
424438
- make -j
425439
- ASAN_OPTIONS="detect_leaks=0" ctest --output-on-failure

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ objs
5757
/allparsingcompetition
5858
/basictests
5959
/benchfeatures
60+
/benchmark/bench_parse_call
61+
/benchmark/get_corpus_benchmark
6062
/benchmark/parse
6163
/benchmark/parse_stream
6264
/benchmark/perfdiff
@@ -67,7 +69,9 @@ objs
6769
/corpus.zip
6870
/distinctuseridcompetition
6971
/fuzz/fuzz_dump
72+
/fuzz/fuzz_dump_raw_tape
7073
/fuzz/fuzz_parser
74+
/fuzz/fuzz_print_json
7175
/get_corpus_benchmark
7276
/json2json
7377
/jsoncheck

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,9 @@
2828
[submodule "dependencies/json"]
2929
path = dependencies/json
3030
url = https://github.com/nlohmann/json.git
31+
[submodule "dependencies/benchmark"]
32+
path = dependencies/benchmark
33+
url = https://github.com/google/benchmark.git
34+
[submodule "dependencies/googletest"]
35+
path = dependencies/googletest
36+
url = https://github.com/google/googletest.git

CMakeLists.txt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
22

33
if (NOT CMAKE_BUILD_TYPE)
4-
message(STATUS "No build type selected, default to Release")
5-
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
4+
message(STATUS "No build type selected, default to Release")
5+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
66
endif()
77

88
project(simdjson
@@ -15,7 +15,7 @@ project(simdjson
1515
#include(CheckIPOSupported)
1616
#check_ipo_supported(RESULT ltoresult)
1717
#if(ltoresult)
18-
#set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
18+
# set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
1919
#endif()
2020

2121
# usage: cmake -DSIMDJSON_DISABLE_AVX=on ..
@@ -37,9 +37,9 @@ set(SIMDJSON_LIB_VERSION "0.2.1" CACHE STRING "simdjson library version")
3737
set(SIMDJSON_LIB_SOVERSION "0" CACHE STRING "simdjson library soversion")
3838

3939
if(NOT MSVC)
40-
option(SIMDJSON_BUILD_STATIC "Build a static library" OFF) # turning it on disables the production of a dynamic library
40+
option(SIMDJSON_BUILD_STATIC "Build a static library" OFF) # turning it on disables the production of a dynamic library
4141
else()
42-
option(SIMDJSON_BUILD_STATIC "Build a static library" ON) # turning it on disables the production of a dynamic library
42+
option(SIMDJSON_BUILD_STATIC "Build a static library" ON) # turning it on disables the production of a dynamic library
4343
endif()
4444
option(SIMDJSON_SANITIZE "Sanitize addresses" OFF)
4545

@@ -49,7 +49,6 @@ find_package(CTargets)
4949
find_package(Options)
5050

5151
option(SIMDJSON_ENABLE_THREADS "enable threaded operation" ON)
52-
5352
install(DIRECTORY include/${SIMDJSON_LIB_NAME} DESTINATION include)
5453
set (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonchecker/")
5554
set (BENCHMARK_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/jsonexamples/")
@@ -62,10 +61,28 @@ add_subdirectory(tools)
6261
add_subdirectory(tests)
6362
add_subdirectory(benchmark)
6463

64+
option(SIMDJSON_GOOGLE_BENCHMARKS "compile the Google Benchmark benchmarks" OFF)
65+
if (SIMDJSON_GOOGLE_BENCHMARKS)
66+
set(BENCHMARK_ENABLE_GTEST_TESTS OFF)
67+
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/googletest/CMakeLists.txt)
68+
# message(STATUS "Unable to find ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/googletest/CMakeLists.txt")
69+
execute_process(COMMAND git submodule update --init -- ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/googletest
70+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
71+
endif()
72+
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/benchmark/CMakeLists.txt)
73+
# message(STATUS "Unable to find ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/benchmark/CMakeLists.txt")
74+
execute_process(COMMAND git submodule update --init -- ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/benchmark
75+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
76+
endif()
77+
78+
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/dependencies/googletest)
79+
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/dependencies/benchmark)
80+
endif()
81+
6582
# for fuzzing, read the comments in the fuzz/CMakeLists.txt file
6683
option(ENABLE_FUZZING "enable building the fuzzers" ON)
6784
if(ENABLE_FUZZING)
68-
add_subdirectory(fuzz)
85+
add_subdirectory(fuzz)
6986
endif()
7087

7188
set(CPACK_PACKAGE_VENDOR "Daniel Lemire")

benchmark/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,10 @@ add_cpp_benchmark(parse)
88
add_cpp_benchmark(statisticalmodel)
99
add_cpp_benchmark(parse_stream)
1010
add_cpp_benchmark(get_corpus_benchmark)
11-
1211
add_executable(perfdiff perfdiff.cpp)
12+
13+
# Google Benchmarks
14+
if (SIMDJSON_GOOGLE_BENCHMARKS)
15+
add_cpp_benchmark(bench_parse_call bench_parse_call.cpp)
16+
target_link_libraries(bench_parse_call benchmark::benchmark)
17+
endif()

benchmark/bench_parse_call.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <benchmark/benchmark.h>
2+
#include "simdjson/document.h"
3+
#include "simdjson/jsonparser.h"
4+
using namespace simdjson;
5+
using namespace benchmark;
6+
using namespace std;
7+
8+
const padded_string EMPTY_ARRAY("[]", 2);
9+
10+
static void json_parse(State& state) {
11+
document::parser parser;
12+
if (!parser.allocate_capacity(EMPTY_ARRAY.length())) { return; }
13+
for (auto _ : state) {
14+
auto error = simdjson::json_parse(EMPTY_ARRAY, parser);
15+
if (error) { return; }
16+
}
17+
}
18+
BENCHMARK(json_parse);
19+
static void parser_parse_error_code(State& state) {
20+
document::parser parser;
21+
if (!parser.allocate_capacity(EMPTY_ARRAY.length())) { return; }
22+
for (auto _ : state) {
23+
auto [doc, error] = parser.parse(EMPTY_ARRAY);
24+
if (error) { return; }
25+
}
26+
}
27+
BENCHMARK(parser_parse_error_code);
28+
static void parser_parse_exception(State& state) {
29+
document::parser parser;
30+
if (!parser.allocate_capacity(EMPTY_ARRAY.length())) { return; }
31+
for (auto _ : state) {
32+
try {
33+
UNUSED document &doc = parser.parse(EMPTY_ARRAY);
34+
} catch(invalid_json &j) {
35+
return;
36+
}
37+
}
38+
}
39+
BENCHMARK(parser_parse_exception);
40+
41+
static void build_parsed_json(State& state) {
42+
for (auto _ : state) {
43+
document::parser parser = simdjson::build_parsed_json(EMPTY_ARRAY);
44+
if (!parser.valid) { return; }
45+
}
46+
}
47+
BENCHMARK(build_parsed_json);
48+
static void document_parse_error_code(State& state) {
49+
for (auto _ : state) {
50+
auto [doc, error] = document::parse(EMPTY_ARRAY);
51+
if (error) { return; }
52+
}
53+
}
54+
BENCHMARK(document_parse_error_code);
55+
static void document_parse_exception(State& state) {
56+
for (auto _ : state) {
57+
try {
58+
UNUSED document doc = document::parse(EMPTY_ARRAY);
59+
} catch(invalid_json &j) {
60+
return;
61+
}
62+
}
63+
}
64+
BENCHMARK(document_parse_exception);
65+
66+
BENCHMARK_MAIN();

dependencies/benchmark

Submodule benchmark added at 8982e1e

0 commit comments

Comments
 (0)