OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBenchmark.h" | 8 #include "SkBenchmark.h" |
9 #include "SkRandom.h" | 9 #include "SkRandom.h" |
10 | 10 |
11 #include "SkChunkAlloc.h" | 11 #include "SkChunkAlloc.h" |
12 #include "SkDeque.h" | 12 #include "SkDeque.h" |
13 #include "SkTArray.h" | 13 #include "SkTArray.h" |
14 #include "SkTDArray.h" | 14 #include "SkTDArray.h" |
15 #include <vector> | |
16 | 15 |
17 // This file has several benchmarks using various data structures to do stack-li
ke things: | 16 // This file has several benchmarks using various data structures to do stack-li
ke things: |
18 // - push | 17 // - push |
19 // - push, immediately pop | 18 // - push, immediately pop |
20 // - push many, pop all of them | 19 // - push many, pop all of them |
21 // - serial access | 20 // - serial access |
22 // - random access | 21 // - random access |
23 // When a data structure doesn't suppport an operation efficiently, we leave tha
t combination out. | 22 // When a data structure doesn't suppport an operation efficiently, we leave tha
t combination out. |
24 // Where possible we hint to the data structure to allocate in 4K pages. | 23 // Where possible we hint to the data structure to allocate in 4K pages. |
25 // | 24 // |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 BENCH(TDArray_Serial) { | 71 BENCH(TDArray_Serial) { |
73 SkTDArray<int> s; | 72 SkTDArray<int> s; |
74 for (int i = 0; i < K; i++) s.push(i); | 73 for (int i = 0; i < K; i++) s.push(i); |
75 | 74 |
76 volatile int junk = 0; | 75 volatile int junk = 0; |
77 for (int j = 0; j < loops; j++) { | 76 for (int j = 0; j < loops; j++) { |
78 for (int i = 0; i < s.count(); i++) junk += s[i]; | 77 for (int i = 0; i < s.count(); i++) junk += s[i]; |
79 } | 78 } |
80 } | 79 } |
81 | 80 |
82 BENCH(vector_Serial) { | |
83 std::vector<int> s; | |
84 for (int i = 0; i < K; i++) s.push_back(i); | |
85 | |
86 volatile int junk = 0; | |
87 for (int j = 0; j < loops; j++) { | |
88 for (size_t i = 0; i < s.size(); i++) junk += s[i]; | |
89 } | |
90 } | |
91 | |
92 // Add K items, then randomly access them many times. | 81 // Add K items, then randomly access them many times. |
93 | 82 |
94 BENCH(TArray_RandomAccess) { | 83 BENCH(TArray_RandomAccess) { |
95 SkTArray<int, true> s; | 84 SkTArray<int, true> s; |
96 for (int i = 0; i < K; i++) s.push_back(i); | 85 for (int i = 0; i < K; i++) s.push_back(i); |
97 | 86 |
98 SkRandom rand; | 87 SkRandom rand; |
99 volatile int junk = 0; | 88 volatile int junk = 0; |
100 for (int i = 0; i < K*loops; i++) { | 89 for (int i = 0; i < K*loops; i++) { |
101 junk += s[rand.nextULessThan(K)]; | 90 junk += s[rand.nextULessThan(K)]; |
102 } | 91 } |
103 } | 92 } |
104 | 93 |
105 BENCH(TDArray_RandomAccess) { | 94 BENCH(TDArray_RandomAccess) { |
106 SkTDArray<int> s; | 95 SkTDArray<int> s; |
107 for (int i = 0; i < K; i++) s.push(i); | 96 for (int i = 0; i < K; i++) s.push(i); |
108 | 97 |
109 SkRandom rand; | 98 SkRandom rand; |
110 volatile int junk = 0; | 99 volatile int junk = 0; |
111 for (int i = 0; i < K*loops; i++) { | |
112 junk += s[rand.nextULessThan(K)]; | |
113 } | |
114 } | |
115 | |
116 BENCH(vector_RandomAccess) { | |
117 std::vector<int> s; | |
118 for (int i = 0; i < K; i++) s.push_back(i); | |
119 | |
120 SkRandom rand; | |
121 volatile int junk = 0; | |
122 for (int i = 0; i < K*loops; i++) { | 100 for (int i = 0; i < K*loops; i++) { |
123 junk += s[rand.nextULessThan(K)]; | 101 junk += s[rand.nextULessThan(K)]; |
124 } | 102 } |
125 } | 103 } |
126 | 104 |
127 // Push many times. | 105 // Push many times. |
128 | 106 |
129 BENCH(ChunkAlloc_Push) { | 107 BENCH(ChunkAlloc_Push) { |
130 SkChunkAlloc s(4096); | 108 SkChunkAlloc s(4096); |
131 for (int i = 0; i < K*loops; i++) s.allocThrow(sizeof(int)); | 109 for (int i = 0; i < K*loops; i++) s.allocThrow(sizeof(int)); |
132 } | 110 } |
133 | 111 |
134 BENCH(Deque_Push) { | 112 BENCH(Deque_Push) { |
135 SkDeque s(sizeof(int), 1024); | 113 SkDeque s(sizeof(int), 1024); |
136 for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i; | 114 for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i; |
137 } | 115 } |
138 | 116 |
139 BENCH(TArray_Push) { | 117 BENCH(TArray_Push) { |
140 SkTArray<int, true> s; | 118 SkTArray<int, true> s; |
141 for (int i = 0; i < K*loops; i++) s.push_back(i); | 119 for (int i = 0; i < K*loops; i++) s.push_back(i); |
142 } | 120 } |
143 | 121 |
144 BENCH(TDArray_Push) { | 122 BENCH(TDArray_Push) { |
145 SkTDArray<int> s; | 123 SkTDArray<int> s; |
146 for (int i = 0; i < K*loops; i++) s.push(i); | 124 for (int i = 0; i < K*loops; i++) s.push(i); |
147 } | 125 } |
148 | 126 |
149 BENCH(vector_Push) { | |
150 std::vector<int> s; | |
151 for (int i = 0; i < K*loops; i++) s.push_back(i); | |
152 } | |
153 | |
154 // Push then immediately pop many times. | 127 // Push then immediately pop many times. |
155 | 128 |
156 BENCH(ChunkAlloc_PushPop) { | 129 BENCH(ChunkAlloc_PushPop) { |
157 SkChunkAlloc s(4096); | 130 SkChunkAlloc s(4096); |
158 for (int i = 0; i < K*loops; i++) { | 131 for (int i = 0; i < K*loops; i++) { |
159 void* p = s.allocThrow(sizeof(int)); | 132 void* p = s.allocThrow(sizeof(int)); |
160 s.unalloc(p); | 133 s.unalloc(p); |
161 } | 134 } |
162 } | 135 } |
163 | 136 |
(...skipping 14 matching lines...) Expand all Loading... |
178 } | 151 } |
179 | 152 |
180 BENCH(TDArray_PushPop) { | 153 BENCH(TDArray_PushPop) { |
181 SkTDArray<int> s; | 154 SkTDArray<int> s; |
182 for (int i = 0; i < K*loops; i++) { | 155 for (int i = 0; i < K*loops; i++) { |
183 s.push(i); | 156 s.push(i); |
184 s.pop(); | 157 s.pop(); |
185 } | 158 } |
186 } | 159 } |
187 | 160 |
188 BENCH(vector_PushPop) { | |
189 std::vector<int> s; | |
190 for (int i = 0; i < K*loops; i++) { | |
191 s.push_back(i); | |
192 s.pop_back(); | |
193 } | |
194 } | |
195 | |
196 // Push many items, then pop them all. | 161 // Push many items, then pop them all. |
197 | 162 |
198 BENCH(Deque_PushAllPopAll) { | 163 BENCH(Deque_PushAllPopAll) { |
199 SkDeque s(sizeof(int), 1024); | 164 SkDeque s(sizeof(int), 1024); |
200 for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i; | 165 for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i; |
201 for (int i = 0; i < K*loops; i++) s.pop_back(); | 166 for (int i = 0; i < K*loops; i++) s.pop_back(); |
202 } | 167 } |
203 | 168 |
204 BENCH(TArray_PushAllPopAll) { | 169 BENCH(TArray_PushAllPopAll) { |
205 SkTArray<int, true> s; | 170 SkTArray<int, true> s; |
206 for (int i = 0; i < K*loops; i++) s.push_back(i); | 171 for (int i = 0; i < K*loops; i++) s.push_back(i); |
207 for (int i = 0; i < K*loops; i++) s.pop_back(); | 172 for (int i = 0; i < K*loops; i++) s.pop_back(); |
208 } | 173 } |
209 | 174 |
210 BENCH(TDArray_PushAllPopAll) { | 175 BENCH(TDArray_PushAllPopAll) { |
211 SkTDArray<int> s; | 176 SkTDArray<int> s; |
212 for (int i = 0; i < K*loops; i++) s.push(i); | 177 for (int i = 0; i < K*loops; i++) s.push(i); |
213 for (int i = 0; i < K*loops; i++) s.pop(); | 178 for (int i = 0; i < K*loops; i++) s.pop(); |
214 } | 179 } |
215 | |
216 BENCH(vector_PushAllPopAll) { | |
217 std::vector<int> s; | |
218 for (int i = 0; i < K*loops; i++) s.push_back(i); | |
219 for (int i = 0; i < K*loops; i++) s.pop_back(); | |
220 } | |
OLD | NEW |