File: from_benchmark.cpp

package info (click to toggle)
simdjson 4.2.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 27,936 kB
  • sloc: cpp: 171,612; ansic: 19,122; sh: 1,126; python: 842; makefile: 47; ruby: 25; javascript: 13
file content (132 lines) | stat: -rw-r--r-- 4,690 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// We are going to assume C++20.

#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <simdjson.h>
#include <string>

#include "benchmark_helpers.h"
#include "car_helpers.h"

using namespace simdjson;

void run_benchmarks() {
  printf("Running benchmarks on tiny input...\n");
  simdjson::padded_string json =
      R"({ "make": "Toyota", "model": "Camry",  "year": 2018, "tire_pressure": [ 40.1, 39.9 ] })"_padded;
  volatile size_t dummy = 0;
  ondemand::parser parser;

  // Classic On-Demand
  pretty_print("simdjson classic", json.size(),
               bench([&json, &dummy, &parser]() {
                 ondemand::document doc = parser.iterate(json);
                 Car car = doc.get<Car>();
                 dummy = dummy + car.year;
               }));

  // Benchmark simdjson::from() without parser
  pretty_print("simdjson::from<Car>() (no parser)", json.size(),
               bench([&json, &dummy]() {
                 Car car = simdjson::from(json);
                 dummy = dummy + car.year;
               }));

  // Benchmark simdjson::from() with parser
  pretty_print("simdjson::from<Car>() (with parser)", json.size(),
               bench([&json, &dummy, &parser]() {
                 Car car = simdjson::from(parser, json);
                 dummy = dummy + car.year;
               }));
}

void run_array_benchmarks() {
  printf("Running benchmarks on large array...\n");
  size_t N = 1'000'000;
  simdjson::padded_string json = generate_car_json_array(N);
  volatile size_t dummy = 0;
  ondemand::parser parser;

  // Classic On-Demand
  pretty_print_array("simdjson classic", json.size(), N,
                     bench([&json, &dummy, &parser]() {
                       dummy = 0;
                       ondemand::document doc = parser.iterate(json);
                       ondemand::array array = doc.get_array();
                       for (auto value : array) {
                         Car car = value.get<Car>();
                         dummy = dummy + car.year;
                       }
                     }));

  // from with array
  pretty_print_array("simdjson::from(json).array()", json.size(), N,
                     bench([&json, &dummy, &parser]() {
                       dummy = 0;

                       for (auto value : simdjson::from(json).array()) {
                         Car car = value.get<Car>();
                         dummy = dummy + car.year;
                       }
                     }));
#if SIMDJSON_SUPPORTS_RANGES_FROM
  // Benchmark simdjson::from() without parser (EXPERIMENTAL)
  pretty_print_array("simdjson::from<Car>() (experimental, no parser)",
                     json.size(), N, bench([&json, &dummy]() {
                       dummy = 0;
                       for (Car car :
                            simdjson::from(json) | simdjson::as<Car>()) {
                         dummy = dummy + car.year;
                       }
                     }));

  // Benchmark simdjson::from() with parser (EXPERIMENTAL)
  pretty_print_array("simdjson::from<Car>() (experimental, with parser)",
                     json.size(), N, bench([&json, &dummy, &parser]() {
                       dummy = 0;
                       for (Car car : simdjson::from(parser, json) |
                                          simdjson::as<Car>()) {
                         dummy = dummy + car.year;
                       }
                     }));
#endif // SIMDJSON_SUPPORTS_RANGES_FROM
}

void run_stream_benchmarks() {
  printf("Running stream benchmarks...\n");
  simdjson::padded_string json = generate_car_json_stream(1'000'000);
  volatile size_t dummy = 0;
  ondemand::parser parser;

  // Classic On-Demand
  pretty_print("simdjson classic", json.size(),
               bench([&json, &dummy, &parser]() {
                 ondemand::document_stream stream = parser.iterate_many(json);
                 for (auto doc : stream) {
                   Car car = doc.get<Car>();
                   dummy = dummy + car.year;
                 }
               }));
  // from_many
  pretty_print("simdjson with thread local", json.size(),
               bench([&json, &dummy, &parser]() {
                 ondemand::document_stream stream =
                     ondemand::parser::get_parser().iterate_many(json);
                 for (auto doc : stream) {
                   Car car = doc.get<Car>();
                   dummy = dummy + car.year;
                 }
               }));
}

int main() {
  for (size_t trial = 0; trial < 3; trial++) {
    printf("Trial %zu:\n", trial + 1);
    run_array_benchmarks();
    run_stream_benchmarks();
    run_benchmarks();
    printf("\n");
  }
  return EXIT_SUCCESS;
}