1 /*
2  * Copyright 2010-2019 Branimir Karadzic. All rights reserved.
3  * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
4  */
5 
6 #include <bx/timer.h>
7 #include <bx/handlealloc.h>
8 #include <bx/maputil.h>
9 
10 #include <tinystl/allocator.h>
11 #include <tinystl/unordered_map.h>
12 
13 #include <unordered_map>
14 
15 #include <stdio.h>
16 #include <assert.h>
17 
main()18 int main()
19 {
20 	const uint32_t numElements   = 4<<10;
21 	const uint32_t numIterations = 16;
22 
23 	//
24 	{
25 		int64_t elapsed = -bx::getHPCounter();
26 
27 		for (uint32_t ii = 0; ii < numIterations; ++ii)
28 		{
29 			typedef tinystl::unordered_map<uint64_t, uint16_t> TinyStlUnorderedMap;
30 			TinyStlUnorderedMap map;
31 //			map.reserve(numElements);
32 			for (uint32_t jj = 0; jj < numElements; ++jj)
33 			{
34 				tinystl::pair<TinyStlUnorderedMap::iterator, bool> ok = map.insert(tinystl::make_pair(uint64_t(jj), uint16_t(jj) ) );
35 				assert(ok.second); BX_UNUSED(ok);
36 			}
37 
38 			for (uint32_t jj = 0; jj < numElements; ++jj)
39 			{
40 				bool ok = bx::mapRemove(map, uint64_t(jj) );
41 				assert(ok); BX_UNUSED(ok);
42 			}
43 
44 			assert(map.size() == 0);
45 		}
46 
47 		elapsed += bx::getHPCounter();
48 		printf("      TinyStl: %15f\n", double(elapsed) );
49 	}
50 
51 	///
52 	{
53 		int64_t elapsed = -bx::getHPCounter();
54 
55 		for (uint32_t ii = 0; ii < numIterations; ++ii)
56 		{
57 			typedef std::unordered_map<uint64_t, uint16_t> StdUnorderedMap;
58 			StdUnorderedMap map;
59 			map.reserve(numElements);
60 			for (uint32_t jj = 0; jj < numElements; ++jj)
61 			{
62 				std::pair<StdUnorderedMap::iterator, bool> ok = map.insert(std::make_pair(uint64_t(jj), uint16_t(jj) ) );
63 				assert(ok.second); BX_UNUSED(ok);
64 			}
65 
66 			for (uint32_t jj = 0; jj < numElements; ++jj)
67 			{
68 				bool ok = bx::mapRemove(map, uint64_t(jj) );
69 				assert(ok); BX_UNUSED(ok);
70 			}
71 
72 			assert(map.size() == 0);
73 		}
74 
75 		elapsed += bx::getHPCounter();
76 		printf("          STL: %15f\n", double(elapsed) );
77 	}
78 
79 	///
80 	{
81 		int64_t elapsed = -bx::getHPCounter();
82 
83 		for (uint32_t ii = 0; ii < numIterations; ++ii)
84 		{
85 			typedef bx::HandleHashMapT<numElements+numElements/2, uint64_t> HandleHashMap;
86 			HandleHashMap map;
87 			for (uint32_t jj = 0; jj < numElements; ++jj)
88 			{
89 				bool ok = map.insert(jj, uint16_t(jj) );
90 				assert(ok); BX_UNUSED(ok);
91 			}
92 
93 			for (uint32_t jj = 0; jj < numElements; ++jj)
94 			{
95 				bool ok = map.removeByKey(uint64_t(jj) );
96 				assert(ok); BX_UNUSED(ok);
97 			}
98 
99 			assert(map.getNumElements() == 0);
100 		}
101 
102 		elapsed += bx::getHPCounter();
103 		printf("HandleHashMap: %15f\n", double(elapsed) );
104 	}
105 
106 	extern void simd_bench();
107 	simd_bench();
108 
109 	extern void math_bench();
110 	math_bench();
111 
112 	return bx::kExitSuccess;
113 }
114