xref: /freebsd-src/contrib/libucl/tests/test_speed.c (revision 6cec9cad762b6476313fb1f8e931a1647822db6b)
1c99fb5f9SBaptiste Daroussin /* Copyright (c) 2013, Vsevolod Stakhov
2c99fb5f9SBaptiste Daroussin  * All rights reserved.
3c99fb5f9SBaptiste Daroussin  *
4c99fb5f9SBaptiste Daroussin  * Redistribution and use in source and binary forms, with or without
5c99fb5f9SBaptiste Daroussin  * modification, are permitted provided that the following conditions are met:
6c99fb5f9SBaptiste Daroussin  *       * Redistributions of source code must retain the above copyright
7c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer.
8c99fb5f9SBaptiste Daroussin  *       * Redistributions in binary form must reproduce the above copyright
9c99fb5f9SBaptiste Daroussin  *         notice, this list of conditions and the following disclaimer in the
10c99fb5f9SBaptiste Daroussin  *         documentation and/or other materials provided with the distribution.
11c99fb5f9SBaptiste Daroussin  *
12c99fb5f9SBaptiste Daroussin  * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
13c99fb5f9SBaptiste Daroussin  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14c99fb5f9SBaptiste Daroussin  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15c99fb5f9SBaptiste Daroussin  * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
16c99fb5f9SBaptiste Daroussin  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17c99fb5f9SBaptiste Daroussin  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18c99fb5f9SBaptiste Daroussin  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19c99fb5f9SBaptiste Daroussin  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20c99fb5f9SBaptiste Daroussin  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21c99fb5f9SBaptiste Daroussin  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22c99fb5f9SBaptiste Daroussin  */
23c99fb5f9SBaptiste Daroussin 
24c99fb5f9SBaptiste Daroussin #include <sys/types.h>
25c99fb5f9SBaptiste Daroussin #include <sys/mman.h>
26c99fb5f9SBaptiste Daroussin #include <sys/stat.h>
27c99fb5f9SBaptiste Daroussin #include <sys/time.h>
28c99fb5f9SBaptiste Daroussin #include <stdio.h>
29c99fb5f9SBaptiste Daroussin #include <errno.h>
30c99fb5f9SBaptiste Daroussin #include <unistd.h>
31c99fb5f9SBaptiste Daroussin #include <fcntl.h>
32c99fb5f9SBaptiste Daroussin #include <time.h>
33c99fb5f9SBaptiste Daroussin 
34c99fb5f9SBaptiste Daroussin #ifdef __APPLE__
35*97bd480fSBaptiste Daroussin #ifdef HAVE_MACH_MACH_TIME_H
36c99fb5f9SBaptiste Daroussin #include <mach/mach_time.h>
37c99fb5f9SBaptiste Daroussin #endif
38*97bd480fSBaptiste Daroussin #endif
39c99fb5f9SBaptiste Daroussin 
40c99fb5f9SBaptiste Daroussin #include "ucl.h"
41c99fb5f9SBaptiste Daroussin 
42c99fb5f9SBaptiste Daroussin static double
get_ticks(void)43c99fb5f9SBaptiste Daroussin get_ticks (void)
44c99fb5f9SBaptiste Daroussin {
45c99fb5f9SBaptiste Daroussin 	double res;
46c99fb5f9SBaptiste Daroussin 
47c99fb5f9SBaptiste Daroussin #ifdef __APPLE__
48c99fb5f9SBaptiste Daroussin 	res = mach_absolute_time () / 1000000000.;
49c99fb5f9SBaptiste Daroussin #else
50c99fb5f9SBaptiste Daroussin 	struct timespec ts;
51c99fb5f9SBaptiste Daroussin 	clock_gettime (CLOCK_MONOTONIC, &ts);
52c99fb5f9SBaptiste Daroussin 
53c99fb5f9SBaptiste Daroussin 	res = (double)ts.tv_sec + ts.tv_nsec / 1000000000.;
54c99fb5f9SBaptiste Daroussin #endif
55c99fb5f9SBaptiste Daroussin 
56c99fb5f9SBaptiste Daroussin 	return res;
57c99fb5f9SBaptiste Daroussin }
58c99fb5f9SBaptiste Daroussin 
59c99fb5f9SBaptiste Daroussin int
main(int argc,char ** argv)60c99fb5f9SBaptiste Daroussin main (int argc, char **argv)
61c99fb5f9SBaptiste Daroussin {
62c99fb5f9SBaptiste Daroussin 	void *map;
63c99fb5f9SBaptiste Daroussin 	struct ucl_parser *parser;
64c99fb5f9SBaptiste Daroussin 	ucl_object_t *obj;
65c99fb5f9SBaptiste Daroussin 	int fin;
66c99fb5f9SBaptiste Daroussin 	unsigned char *emitted;
67c99fb5f9SBaptiste Daroussin 	struct stat st;
68c99fb5f9SBaptiste Daroussin 	const char *fname_in = NULL;
69c99fb5f9SBaptiste Daroussin 	int ret = 0;
70c99fb5f9SBaptiste Daroussin 	double start, end, seconds;
71c99fb5f9SBaptiste Daroussin 
72c99fb5f9SBaptiste Daroussin 	switch (argc) {
73c99fb5f9SBaptiste Daroussin 	case 2:
74c99fb5f9SBaptiste Daroussin 		fname_in = argv[1];
75c99fb5f9SBaptiste Daroussin 		break;
76c99fb5f9SBaptiste Daroussin 	}
77c99fb5f9SBaptiste Daroussin 
78c99fb5f9SBaptiste Daroussin 	fin = open (fname_in, O_RDONLY);
79c99fb5f9SBaptiste Daroussin 	if (fin == -1) {
80c99fb5f9SBaptiste Daroussin 		perror ("open failed");
81c99fb5f9SBaptiste Daroussin 		exit (EXIT_FAILURE);
82c99fb5f9SBaptiste Daroussin 	}
83c99fb5f9SBaptiste Daroussin 	parser = ucl_parser_new (UCL_PARSER_ZEROCOPY);
84c99fb5f9SBaptiste Daroussin 
85c99fb5f9SBaptiste Daroussin 	(void)fstat (fin, &st);
86c99fb5f9SBaptiste Daroussin 	map = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fin, 0);
87c99fb5f9SBaptiste Daroussin 	if (map == MAP_FAILED) {
88c99fb5f9SBaptiste Daroussin 		perror ("mmap failed");
89c99fb5f9SBaptiste Daroussin 		exit (EXIT_FAILURE);
90c99fb5f9SBaptiste Daroussin 	}
91c99fb5f9SBaptiste Daroussin 
92c99fb5f9SBaptiste Daroussin 	close (fin);
93c99fb5f9SBaptiste Daroussin 
94c99fb5f9SBaptiste Daroussin 	start = get_ticks ();
95c99fb5f9SBaptiste Daroussin 	ucl_parser_add_chunk (parser, map, st.st_size);
96c99fb5f9SBaptiste Daroussin 
97c99fb5f9SBaptiste Daroussin 	obj = ucl_parser_get_object (parser);
98c99fb5f9SBaptiste Daroussin 	end = get_ticks ();
99c99fb5f9SBaptiste Daroussin 
100c99fb5f9SBaptiste Daroussin 	seconds = end - start;
101c99fb5f9SBaptiste Daroussin 	printf ("ucl: parsed input in %.4f seconds\n", seconds);
102c99fb5f9SBaptiste Daroussin 	if (ucl_parser_get_error(parser)) {
103c99fb5f9SBaptiste Daroussin 		printf ("Error occurred: %s\n", ucl_parser_get_error(parser));
104c99fb5f9SBaptiste Daroussin 		ret = 1;
105c99fb5f9SBaptiste Daroussin 		goto err;
106c99fb5f9SBaptiste Daroussin 	}
107c99fb5f9SBaptiste Daroussin 
108c99fb5f9SBaptiste Daroussin 	start = get_ticks ();
109c99fb5f9SBaptiste Daroussin 	emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
110c99fb5f9SBaptiste Daroussin 	end = get_ticks ();
111c99fb5f9SBaptiste Daroussin 
112c99fb5f9SBaptiste Daroussin 	seconds = end - start;
113c99fb5f9SBaptiste Daroussin 	printf ("ucl: emitted config in %.4f seconds\n", seconds);
114c99fb5f9SBaptiste Daroussin 
115c99fb5f9SBaptiste Daroussin 	free (emitted);
116c99fb5f9SBaptiste Daroussin 
117c99fb5f9SBaptiste Daroussin 	start = get_ticks ();
118c99fb5f9SBaptiste Daroussin 	emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
119c99fb5f9SBaptiste Daroussin 	end = get_ticks ();
120c99fb5f9SBaptiste Daroussin 
121c99fb5f9SBaptiste Daroussin 	seconds = end - start;
122c99fb5f9SBaptiste Daroussin 	printf ("ucl: emitted json in %.4f seconds\n", seconds);
123c99fb5f9SBaptiste Daroussin 
124c99fb5f9SBaptiste Daroussin 	free (emitted);
125c99fb5f9SBaptiste Daroussin 
126c99fb5f9SBaptiste Daroussin 	start = get_ticks ();
127c99fb5f9SBaptiste Daroussin 	emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT);
128c99fb5f9SBaptiste Daroussin 	end = get_ticks ();
129c99fb5f9SBaptiste Daroussin 
130c99fb5f9SBaptiste Daroussin 	seconds = end - start;
131c99fb5f9SBaptiste Daroussin 	printf ("ucl: emitted compact json in %.4f seconds\n", seconds);
132c99fb5f9SBaptiste Daroussin 
133c99fb5f9SBaptiste Daroussin 	free (emitted);
134c99fb5f9SBaptiste Daroussin 
135c99fb5f9SBaptiste Daroussin 	start = get_ticks ();
136c99fb5f9SBaptiste Daroussin 	emitted = ucl_object_emit (obj, UCL_EMIT_YAML);
137c99fb5f9SBaptiste Daroussin 	end = get_ticks ();
138c99fb5f9SBaptiste Daroussin 
139c99fb5f9SBaptiste Daroussin 	seconds = end - start;
140c99fb5f9SBaptiste Daroussin 	printf ("ucl: emitted yaml in %.4f seconds\n", seconds);
141c99fb5f9SBaptiste Daroussin 
142c99fb5f9SBaptiste Daroussin 	free (emitted);
143c99fb5f9SBaptiste Daroussin 
144c99fb5f9SBaptiste Daroussin 	ucl_parser_free (parser);
145c99fb5f9SBaptiste Daroussin 	ucl_object_unref (obj);
146c99fb5f9SBaptiste Daroussin 
147c99fb5f9SBaptiste Daroussin err:
148c99fb5f9SBaptiste Daroussin 	munmap (map, st.st_size);
149c99fb5f9SBaptiste Daroussin 
150c99fb5f9SBaptiste Daroussin 	return ret;
151c99fb5f9SBaptiste Daroussin }
152