- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Tue, 29 Oct 2013 03:07:16 -0400
- To: Allen Wirfs-Brock <allen@wirfs-brock.com>
- CC: Domenic Denicola <domenic@domenicdenicola.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>, es-discuss <es-discuss@mozilla.org>
On 10/28/13 8:50 PM, Allen Wirfs-Brock wrote: > So what's so onerous about returning a fresh array from the getter each time it was called. If it was implemented in Es6, it would just be: > return Array.from(internal_compy); Implementing this is pretty easy, for sure. The questions are: 1) What the object-identity expectations of callers are. 2) Whether this can cause nasty O(N^2) behavior when people loop over the property's value in a naive way. Mostly an issue if the list can be long, so not a problem for the gamepad API but could be a problem for other use cases. > Proxies aren't cheap. Unless these arrays tend to be quite large, I wouldn't be surprised if the overhead of using a Proxy for this useless ended up being higher than the cost of making fresh arrays. Maybe. Measuring in Firefox [1] a get on a proxy seems to be in the ~100ns range for me, while duplicating a small array (3 entries) via slice.call() seems to be about 300ns (mostly the call overhead). Duplicating an array with ~100 entries takes closer to 2000ns, just to see the scaling here. -Boris [1] Testcase: <!DOCTYPE html> <body> <pre><script> var count = 4000000; var arr = [1, 2, 3]; var slice = Array.prototype.slice; var proxy = new Proxy(arr, {}); var sideEffect; var i; var start = new Date; for (i = 0; i < count; ++i) { } var stop = new Date; document.writeln("Empty loop: " + (stop - start) / count * 1e6 + "ns"); var start = new Date; for (var i = 0; i < count; ++i) { sideEffect = arr[0]; } var stop = new Date; document.writeln("Normal array get: " + (stop - start) / count * 1e6 + "ns"); var start = new Date; for (var i = 0; i < count; ++i) { sideEffect = proxy[0]; } var stop = new Date; document.writeln("Proxy get: " + (stop - start) / count * 1e6 + "ns"); var start = new Date; for (var i = 0; i < count; ++i) { sideEffect = slice.call(arr); } var stop = new Date; document.writeln("Array creation, length " + arr.length +": " + (stop - start) / count * 1e6 + "ns"); arr = arr.concat(arr); arr = arr.concat(arr); arr = arr.concat(arr); arr = arr.concat(arr); arr = arr.concat(arr); var start = new Date; for (var i = 0; i < count; ++i) { sideEffect = slice.call(arr); } var stop = new Date; document.writeln("Array creation, length " + arr.length +": " + (stop - start) / count * 1e6 + "ns"); </script>
Received on Tuesday, 29 October 2013 07:07:50 UTC