Porównując this benchmark chromem 16 vs opera 11.6 stwierdzamy, żeDlaczego Function.prototype.bind jest wolny?
- w chromowaną rodzimej wiążą jest prawie 5 razy wolniej następnie emulowanego wersji wiążą
- w operze rodzimy wiążą jest prawie 4 razy szybciej wtedy emulowane wersja wiążą
Jeżeli emulowane wersja wiążą w tym przypadku jest
var emulatebind = function (f, context) {
return function() {
f.apply(context, arguments);
};
};
Czy istnieją dobre powody, dla których istnieje taka różnica, czy to tylko kwestia V8, która nie jest wystarczająco optymalna?
Uwaga: ten kod emulatebind
implementuje tylko podzbiór, ale to nie jest istotne. Jeśli masz w pełni funkcjonalne i zoptymalizowane emulowane wiązanie, nadal istnieje performance difference in the benchmark.
@RobW przedstawił emulowaną wersję binda, którą porównuję. – Raynos
Przypuszczam, że jest to spowodowane inną optymalizacją kodu. Być może otoki z natywnym wiązaniem nie pozwalają na pewne pewne optymalizacje. FF10 demonstruje podobne zachowanie. – kirilloid
Twoja Q. musi być _ "Dlaczego moja emulacja .bind() jest szybsza niż natywna w Chrome, FireFox i wolniejsza w Operze i IE?" _. I dlaczego uważasz, że musi być inaczej? Różna optymalizacja kodu. Emulacja powiązania nie pozwala na dodawanie parametrów, ale tylko kontekst, na przykład. –