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>

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to