Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * test_json_parser_perf.c
4 : : * Performance test program for both flavors of the JSON parser
5 : : *
6 : : * Copyright (c) 2024, PostgreSQL Global Development Group
7 : : *
8 : : * IDENTIFICATION
9 : : * src/test/modules/test_json_parser/test_json_parser_perf.c
10 : : *
11 : : * This program tests either the standard (recursive descent) JSON parser
12 : : * or the incremental (table driven) parser, but without breaking the input
13 : : * into chunks in the latter case. Thus it can be used to compare the pure
14 : : * parsing speed of the two parsers. If the "-i" option is used, then the
15 : : * table driven parser is used. Otherwise, the recursive descent parser is
16 : : * used.
17 : : *
18 : : * The remaining arguments are the number of parsing iterations to be done
19 : : * and the file containing the JSON input.
20 : : *
21 : : *-------------------------------------------------------------------------
22 : : */
23 : :
24 : : #include "postgres_fe.h"
25 : : #include "common/jsonapi.h"
26 : : #include "lib/stringinfo.h"
27 : : #include "mb/pg_wchar.h"
28 : : #include <stdio.h>
29 : : #include <string.h>
30 : :
31 : : #define BUFSIZE 6000
32 : :
33 : : int
35 andrew@dunslane.net 34 :GNC 2 : main(int argc, char **argv)
35 : : {
36 : : char buff[BUFSIZE];
37 : : FILE *json_file;
38 : : JsonParseErrorType result;
39 : : JsonLexContext *lex;
40 : : StringInfoData json;
41 : : int n_read;
42 : : int iter;
43 : 2 : int use_inc = 0;
44 : :
45 : 2 : initStringInfo(&json);
46 : :
47 [ + + ]: 2 : if (strcmp(argv[1], "-i") == 0)
48 : : {
49 : 1 : use_inc = 1;
50 : 1 : argv++;
51 : : }
52 : :
53 : 2 : sscanf(argv[1], "%d", &iter);
54 : :
55 : 2 : json_file = fopen(argv[2], "r");
56 [ - + ]: 2 : while ((n_read = fread(buff, 1, 6000, json_file)) > 0)
57 : : {
35 andrew@dunslane.net 58 :UNC 0 : appendBinaryStringInfo(&json, buff, n_read);
59 : : }
35 andrew@dunslane.net 60 :GNC 2 : fclose(json_file);
61 [ + - ]: 2 : for (int i = 0; i < iter; i++)
62 : : {
63 [ + + ]: 2 : if (use_inc)
64 : : {
65 : 1 : lex = makeJsonLexContextIncremental(NULL, PG_UTF8, false);
66 : 1 : result = pg_parse_json_incremental(lex, &nullSemAction,
67 : : json.data, json.len,
68 : : true);
69 : 1 : freeJsonLexContext(lex);
70 : : }
71 : : else
72 : : {
73 : 1 : lex = makeJsonLexContextCstringLen(NULL, json.data, json.len,
74 : : PG_UTF8, false);
75 : 1 : result = pg_parse_json(lex, &nullSemAction);
76 : 1 : freeJsonLexContext(lex);
77 : : }
78 [ + - ]: 2 : if (result != JSON_SUCCESS)
79 : : {
80 : 2 : fprintf(stderr,
81 : : "unexpected result %d (expecting %d) on parse\n",
82 : : result, JSON_SUCCESS);
83 : 2 : exit(1);
84 : : }
85 : : }
35 andrew@dunslane.net 86 :UNC 0 : exit(0);
87 : : }
|