81 <script> |
81 <script> |
82 /* var N = 1; */ |
82 /* var N = 1; */ |
83 /* var N = 1000*1000; */ |
83 /* var N = 1000*1000; */ |
84 var N = 1000*1000; |
84 var N = 1000*1000; |
85 |
85 |
86 function arrNew() { |
|
87 return [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; |
|
88 } |
|
89 function arrGet(brd, i, j) { |
|
90 return brd[i*4+j]; |
|
91 } |
|
92 function arrSet(brd, i, j, val) { |
|
93 brd[i*4+j] = val; |
|
94 } |
|
95 function arrPrint(brd) { |
86 function arrPrint(brd) { |
96 for (var i = 0; i < 4; i++) { |
87 for (var i = 0; i < 4; i++) { |
97 for (var j = 0; j < 4; j++) { |
88 for (var j = 0; j < 4; j++) { |
98 ui.set(i, j, brd[i*4+j]); |
89 ui.set(i, j, brd[i][j]); |
99 } |
90 } |
100 } |
91 } |
101 } |
92 } |
102 function arrRotLeft(from, to) { |
|
103 for (var i = 0; i < 4; i++) { |
|
104 for (var j = 0; j < 3; j++) { |
|
105 to[i*4+j+1] = from[i*4+j]; |
|
106 } |
|
107 to[i*4] = from[i*4+3]; |
|
108 } |
|
109 } |
|
110 function arrRotLeft_2(from, to) { |
|
111 to[1] = from[0]; to[2] = from[1]; to[3] = from[2]; to[0] = from[3]; |
|
112 to[4+1] = from[4+0]; to[4+2] = from[4+1]; to[4+3] = from[4+2]; to[4+0] = from[4+3]; |
|
113 to[8+1] = from[8+0]; to[8+2] = from[8+1]; to[8+3] = from[8+2]; to[8+0] = from[8+3]; |
|
114 to[12+1] = from[12+0]; to[12+2] = from[12+1]; to[12+3] = from[12+2]; to[12+0] = from[12+3]; |
|
115 } |
|
116 |
|
117 var L = arrNew(); |
|
118 L[2*4+3] = 5; |
|
119 for (var i = 0; i < 4; i++) { |
|
120 arrSet(L, i, 3-i, i+1); |
|
121 } |
|
122 var R = arrNew(); |
|
123 |
93 |
124 /* Example of plain performance calculation. */ |
94 /* Example of plain performance calculation. */ |
125 var tsFrom = new Date().getTime(); |
95 // var tsFrom = new Date().getTime(); |
126 for (var i = 0; i < N; i++) { |
96 // var i; |
127 arrRotLeft(L, R); |
97 // (function() { |
128 arrRotLeft(R, L); |
98 // var brd = new BoardArr(); |
129 } |
99 // for (i = 0; i < N; i++) { |
130 var tsTo = new Date().getTime(); |
100 // brd = brd.copy(); |
131 arrPrint(L); |
101 // } |
132 console.log("arrRotLeft: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
102 // })(); |
133 |
103 // var tsTo = new Date().getTime(); |
134 perf("arrRotLeft", function() { |
104 // console.log("BoardArr.prototype.copy|new: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
135 arrRotLeft(this.L, this.R); |
|
136 arrRotLeft(this.R, this.L); |
|
137 }, N, {L: L, R: R}); |
|
138 arrPrint(L); |
|
139 |
|
140 perf("arrRotLeft_2", function() { |
|
141 arrRotLeft_2(this.L, this.R); |
|
142 arrRotLeft_2(this.R, this.L); |
|
143 }, N, {L: L, R: R}); |
|
144 arrPrint(L); |
|
145 |
|
146 |
105 |
147 perf("BoardArr.prototype.copy|new", function() { |
106 perf("BoardArr.prototype.copy|new", function() { |
148 this.brd = this.brd.copy(); |
107 this.brd = this.brd.copy(); |
149 }, N, {brd: new BoardArr()}); |
108 }, N, {brd: new BoardArr()}); |
|
109 perf("BoardArr2d.prototype.copy|new", function() { |
|
110 this.brd = this.brd.copy(); |
|
111 }, N, {brd: new BoardArr2d()}); |
|
112 perf("BoardObj.prototype.copy|new", function() { |
|
113 this.brd = this.brd.copy(); |
|
114 }, N, {brd: new BoardObj()}); |
|
115 |
150 perf("BoardArr.prototype.copy|from-to", function() { |
116 perf("BoardArr.prototype.copy|from-to", function() { |
151 this.from.copy(this.to); |
117 this.from.copy(this.to); |
152 }, N, {from: new BoardArr(), to: new BoardArr()}); |
118 }, N, {from: new BoardArr(), to: new BoardArr()}); |
153 |
|
154 |
|
155 perf("BoardArr2d.prototype.copy|new", function() { |
|
156 this.brd = this.brd.copy(); |
|
157 }, N, {brd: new BoardArr2d()}); |
|
158 perf("BoardArr2d.prototype.copy|from-to", function() { |
119 perf("BoardArr2d.prototype.copy|from-to", function() { |
159 this.from.copy(this.to); |
120 this.from.copy(this.to); |
160 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
121 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
|
122 perf("BoardObj.prototype.copy|from-to", function() { |
|
123 this.from.copy(this.to); |
|
124 }, N, {from: new BoardObj(), to: new BoardObj()}); |
|
125 |
161 perf("BoardArr2d.prototype.shiftLeft_unrolled", function() { |
126 perf("BoardArr2d.prototype.shiftLeft_unrolled", function() { |
162 this.from.shiftLeft_unrolled(this.to); |
127 this.from.shiftLeft_unrolled(this.to); |
163 var swap = this.from; this.from = this.to, this.to = swap; |
128 var swap = this.from; this.from = this.to, this.to = swap; |
164 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
129 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
165 perf("BoardArr2d.prototype.shiftLeft_mostly_unrolled", function() { |
130 perf("BoardArr2d.prototype.shiftLeft_mostly_unrolled", function() { |
166 this.from.shiftLeft_mostly_unrolled(this.to); |
131 this.from.shiftLeft_mostly_unrolled(this.to); |
167 var swap = this.from; this.from = this.to, this.to = swap; |
132 var swap = this.from; this.from = this.to, this.to = swap; |
168 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
133 }, N, {from: new BoardArr2d(), to: new BoardArr2d()}); |
169 |
|
170 function arr2New() { |
|
171 return [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]; |
|
172 } |
|
173 function arr2Get(brd, i, j) { |
|
174 return brd[i][j]; |
|
175 } |
|
176 function arr2Set(brd, i, j, val) { |
|
177 brd[i][j] = val; |
|
178 } |
|
179 function arr2Print(brd) { |
|
180 for (var i = 0; i < 4; i++) { |
|
181 for (var j = 0; j < 4; j++) { |
|
182 ui.set(i, j, brd[i][j]); |
|
183 } |
|
184 } |
|
185 } |
|
186 function arr2RotLeft(from, to) { |
|
187 for (var i = 0; i < 4; i++) { |
|
188 for (var j = 0; j < 3; j++) { |
|
189 to[i][j+1] = from[i][j]; |
|
190 } |
|
191 to[i][0] = from[i][3]; |
|
192 } |
|
193 } |
|
194 function arr2RotLeft_2(from, to) { |
|
195 to[0][1] = from[0][0]; to[0][2] = from[0][1]; to[0][3] = from[0][2]; to[0][0] = from[0][3]; |
|
196 to[1][1] = from[1][0]; to[1][2] = from[1][1]; to[1][3] = from[1][2]; to[1][0] = from[1][3]; |
|
197 to[2][1] = from[2][0]; to[2][2] = from[2][1]; to[2][3] = from[2][2]; to[2][0] = from[2][3]; |
|
198 to[3][1] = from[3][0]; to[3][2] = from[3][1]; to[3][3] = from[3][2]; to[3][0] = from[3][3]; |
|
199 } |
|
200 function arr2ShiftRight(from, to) { |
|
201 for (var i = 0; i < 4; i++) { |
|
202 if (from[i][2] == from[i][3]) { |
|
203 to[i][3] = from[i][3] + 1; |
|
204 if (from[i][0] == from[i][1]) { |
|
205 to[i][2] = from[i][1] + 1; |
|
206 to[i][1] = 0; |
|
207 } else { |
|
208 to[i][2] = from[i][1]; |
|
209 to[i][1] = from[i][0]; |
|
210 } |
|
211 to[i][0] = 0; |
|
212 } else { |
|
213 to[i][3] = from[i][3]; |
|
214 if (from[i][1] == from[i][2]) { |
|
215 to[i][2] = from[i][2] + 1; |
|
216 to[i][1] = from[i][0]; |
|
217 to[i][0] = 0; |
|
218 } else { |
|
219 to[i][2] = from[i][2]; |
|
220 if (from[i][0] == from[i][1]) { |
|
221 to[i][1] = from[i][1] + 1; |
|
222 to[i][0] = 0; |
|
223 } else { |
|
224 to[i][1] = from[i][1]; |
|
225 to[i][0] = from[i][0]; |
|
226 } |
|
227 } |
|
228 } |
|
229 } |
|
230 } |
|
231 function arr2ShiftLeft(from, to) { |
|
232 for (var i = 3; i >= 0; i--) { |
|
233 if (from[i][0] == from[i][1]) { |
|
234 to[i][0] = from[i][0] + 1; |
|
235 if (from[i][2] == from[i][3]) { |
|
236 to[i][1] = from[i][2] + 1; |
|
237 to[i][2] = 0; |
|
238 } else { |
|
239 to[i][1] = from[i][2]; |
|
240 to[i][2] = from[i][3]; |
|
241 } |
|
242 to[i][3] = 0; |
|
243 } else { |
|
244 to[i][0] = from[i][0]; |
|
245 if (from[i][1] == from[i][2]) { |
|
246 to[i][1] = from[i][1] + 1; |
|
247 to[i][2] = from[i][3]; |
|
248 to[i][3] = 0; |
|
249 } else { |
|
250 to[i][1] = from[i][1]; |
|
251 if (from[i][2] == from[i][3]) { |
|
252 to[i][2] = from[i][2] + 1; |
|
253 to[i][3] = 0; |
|
254 } else { |
|
255 to[i][2] = from[i][2]; |
|
256 to[i][3] = from[i][3]; |
|
257 } |
|
258 } |
|
259 } |
|
260 } |
|
261 } |
|
262 function arr2ShiftUp(from, to) { |
|
263 for (var j = 3; j >= 0; j--) { |
|
264 if (from[0][j] == from[1][j]) { |
|
265 to[0][j] = from[0][j] + 1; |
|
266 if (from[2][j] == from[3][j]) { |
|
267 to[1][j] = from[2][j] + 1; |
|
268 to[2][j] = 0; |
|
269 } else { |
|
270 to[1][j] = from[2][j]; |
|
271 to[2][j] = from[3][j]; |
|
272 } |
|
273 to[3][j] = 0; |
|
274 } else { |
|
275 to[0][j] = from[0][j]; |
|
276 if (from[1][j] == from[2][j]) { |
|
277 to[1][j] = from[1][j] + 1; |
|
278 to[2][j] = from[3][j]; |
|
279 to[3][j] = 0; |
|
280 } else { |
|
281 to[1][j] = from[1][j]; |
|
282 if (from[2][j] == from[3][j]) { |
|
283 to[2][j] = from[2][j] + 1; |
|
284 to[3][j] = 0; |
|
285 } else { |
|
286 to[2][j] = from[2][j]; |
|
287 to[3][j] = from[3][j]; |
|
288 } |
|
289 } |
|
290 } |
|
291 } |
|
292 } |
|
293 function arr2ShiftDown(from, to) { |
|
294 for (var j = 0; j < 4; j++) { |
|
295 if (from[2][j] == from[3][j]) { |
|
296 to[3][j] = from[3][j] + 1; |
|
297 if (from[0][j] == from[1][j]) { |
|
298 to[2][j] = from[1][j] + 1; |
|
299 to[1][j] = 0; |
|
300 } else { |
|
301 to[2][j] = from[1][j]; |
|
302 to[1][j] = from[0][j]; |
|
303 } |
|
304 to[0][j] = 0; |
|
305 } else { |
|
306 to[3][j] = from[3][j]; |
|
307 if (from[1][j] == from[2][j]) { |
|
308 to[2][j] = from[2][j] + 1; |
|
309 to[1][j] = from[0][j]; |
|
310 to[0][j] = 0; |
|
311 } else { |
|
312 to[2][j] = from[2][j]; |
|
313 if (from[0][j] == from[1][j]) { |
|
314 to[1][j] = from[1][j] + 1; |
|
315 to[0][j] = 0; |
|
316 } else { |
|
317 to[1][j] = from[1][j]; |
|
318 to[0][j] = from[0][j]; |
|
319 } |
|
320 } |
|
321 } |
|
322 } |
|
323 } |
|
324 var L = arr2New(); |
|
325 L[2][3] = 5; |
|
326 for (var i = 0; i < 4; i++) { |
|
327 arr2Set(L, i, 3-i, i+1); |
|
328 } |
|
329 |
|
330 var R = arr2New(); |
|
331 var tsFrom = new Date().getTime(); |
|
332 for (var i = 0; i < N; i++) { |
|
333 arr2RotLeft(L, R); |
|
334 arr2RotLeft(R, L); |
|
335 } |
|
336 var tsTo = new Date().getTime(); |
|
337 /* arr2Print(L); */ |
|
338 console.log("arr2RotLeft: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
|
339 |
|
340 var tsFrom = new Date().getTime(); |
|
341 for (var i = 0; i < N; i++) { |
|
342 arr2RotLeft_2(L, R); |
|
343 arr2RotLeft_2(R, L); |
|
344 } |
|
345 var tsTo = new Date().getTime(); |
|
346 /* arr2Print(L); */ |
|
347 console.log("arr2RotLeft_2: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
|
348 |
|
349 |
|
350 var objMap = [["aa", "ab", "ac", "ad"], ["ba", "bb", "bc", "bd"], ["ca", "cb", "cc", "cd"], ["da", "db", "dc", "dd"]]; |
|
351 function objNew() { |
|
352 return { aa: 0, ab: 0, ac: 0, ad: 0, |
|
353 ba: 0, bb: 0, bc: 0, bd: 0, |
|
354 ca: 0, cb: 0, cc: 0, cd: 0, |
|
355 da: 0, db: 0, dc: 0, dd: 0 }; |
|
356 } |
|
357 function objGet(brd, i, j) { |
|
358 return brd[objMap[i][j]]; |
|
359 } |
|
360 function objSet(brd, i, j, val) { |
|
361 brd[objMap[i][j]] = val; |
|
362 } |
|
363 function objPrint(brd) { |
|
364 ui.set(0, 0, brd.aa); ui.set(0, 1, brd.ab); ui.set(0, 2, brd.ac); ui.set(0, 3, brd.ad); |
|
365 ui.set(1, 0, brd.ba); ui.set(1, 1, brd.bb); ui.set(1, 2, brd.bc); ui.set(1, 3, brd.bd); |
|
366 ui.set(2, 0, brd.ca); ui.set(2, 1, brd.cb); ui.set(2, 2, brd.cc); ui.set(2, 3, brd.cd); |
|
367 ui.set(3, 0, brd.da); ui.set(3, 1, brd.db); ui.set(3, 2, brd.dc); ui.set(3, 3, brd.dd); |
|
368 } |
|
369 function objRotLeft(from, to) { |
|
370 to.ab = from.aa; to.ac = from.ab; to.ad = from.ac; to.aa = from.ad; |
|
371 to.bb = from.ba; to.bc = from.bb; to.bd = from.bc; to.ba = from.bd; |
|
372 to.cb = from.ca; to.cc = from.cb; to.cd = from.cc; to.ca = from.cd; |
|
373 to.db = from.da; to.dc = from.db; to.dd = from.dc; to.da = from.dd; |
|
374 } |
|
375 function objRotLeft_2(from, to) { |
|
376 to["ab"] = from["aa"]; to["ac"] = from["ab"]; to["ad"] = from["ac"]; to["aa"] = from["ad"]; |
|
377 to["bb"] = from["ba"]; to["bc"] = from["bb"]; to["bd"] = from["bc"]; to["ba"] = from["bd"]; |
|
378 to["cb"] = from["ca"]; to["cc"] = from["cb"]; to["cd"] = from["cc"]; to["ca"] = from["cd"]; |
|
379 to["db"] = from["da"]; to["dc"] = from["db"]; to["dd"] = from["dc"]; to["da"] = from["dd"]; |
|
380 } |
|
381 var L = objNew(); |
|
382 L.cd = 5; |
|
383 for (var i = 0; i < 4; i++) { |
|
384 objSet(L, i, 3-i, i+1); |
|
385 } |
|
386 |
|
387 var R = objNew(); |
|
388 var tsFrom = new Date().getTime(); |
|
389 for (var i = 0; i < N; i++) { |
|
390 objRotLeft(L, R); |
|
391 objRotLeft(R, L); |
|
392 } |
|
393 var tsTo = new Date().getTime(); |
|
394 objPrint(L); |
|
395 console.log("objRotLeft: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
|
396 |
|
397 var tsFrom = new Date().getTime(); |
|
398 for (var i = 0; i < N; i++) { |
|
399 objRotLeft_2(L, R); |
|
400 objRotLeft_2(R, L); |
|
401 } |
|
402 var tsTo = new Date().getTime(); |
|
403 objPrint(L); |
|
404 console.log("objRotLeft_2: %f ms, %d u/s", tsTo-tsFrom, 2*i/(tsTo - tsFrom)*1000); |
|
405 </script> |
134 </script> |
406 |
135 |
407 <script> |
136 <script> |
408 /* console.log(Array.prototype.map.call(document.querySelectorAll("button"), function(x){return x;})); */ |
137 /* console.log(Array.prototype.map.call(document.querySelectorAll("button"), function(x){return x;})); */ |
409 Array.prototype.forEach.call(document.querySelectorAll("button"), function(btn) { |
138 Array.prototype.forEach.call(document.querySelectorAll("button"), function(btn) { |