Le 14/06/2013 02:37, Mark S. Miller a écrit :
Other things being equal, or even close, I am always in favor of specs
being more deterministic.
Even with this pinned down, we should still allow implementations to
switch among different algorithms based on the size of the array, the
cache hierarchy, or whatever. Because of getters/setters and proxies,
the differences between stable algorithms is still observable.
Maybe there is something that can be made more deterministic about sort.
var a = ["yes", "no", "maybe", "I don't know", "can you repeat the
question?"];
var pa = new Proxy(a, {
get: function(target, name){
console.log('get', name);
return target[name];
},
set: function(target, name, value){
console.log('set', name);
return target[name] = value;
}
})
pa.sort()
In Firefox, I see:
"get" "sort"
"get" "length"
"get" "0"
"get" "1"
"get" "2"
"get" "3"
"get" "4"
"set" "0"
"set" "1"
"set" "2"
"set" "3"
"set" "4"
Forgetting about the 2 first "get", the behavior exposed here is:
1) [[Get]] all elements in order once
2) sort them internally (without touching the array!)
3) a serie of at most "a.length" [[Put]] calls
And this particular behavior might be standardizable without a loss
(even with a gain), because:
1) a sort algorithm only needs all the array values once at least once
(serie of [[Get]]s) and should probably avoiding touching the array
again since getter or get traps may be costly and return inconsistent
values (so [[Get]] the values at most once)
2) the sorting algorithms is on the values, not on the array (though
with membranes, if the comparator function touches more than the object
identity, it can be observable, but that's not the problem of the sort
algorithm)
3) No sort algorithm requires to rearrange more elements than the number
there is in the array.
In absolute terms, as you say, the sequence of [[Put]] may make the
stable algorithm observable, but I don't think that's a problem.
Standardizing the above behavior has some impact on memory (copying all
values out of the array for the sort algorithm) in theory. In practice,
the [[Get]] and [[Put]] sequences are only observable if there is a
getter or setter on the array or the array is a proxy, so the
implementation is free to choose its memory behavior when there is no
proxy nor getter/setter.
When there is a getter/setter or proxy, the reduction of number of
[[Get]]/[[Put]] calls may be worth the additional memory.
David
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss