Gdybym zdefiniować funkcjęJavaScriptCore zagnieżdżone "call" problem wydajność
inc = function(x) { return x + 1 }
i zrobić zagnieżdżone wywołanie nim
inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))
spowoduje wartości 22
. Gdybym przeglądu zagnieżdżonego wyrażenia zamiast skorzystać z call
, przekazując null
dla this
, jak
inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))))))))))))))))))
to będzie również produkować wartość 22
.
lecz, JavaScriptCore ta druga forma wydaje się zużywają O (2^n) pamięci, gdzie n oznacza liczbę połączeń zagnieżdżone. Nie jest tak w przypadku, gdy próbuję tego skryptu JavaScript w przeglądarce Firefox lub Chrome, więc wydaje się być odizolowany od JavaScriptCore.
Mam bardzo mało JavaScriptu (prawie brak). Nie mam wyczucia kompromisów, jakie mogą przynieść różne implementacje JavaScriptu, ani tego, czy jest sensowny, aby przykładowy kod był drogi w niektórych implementacjach (zapewniając ogólne wsparcie dla zamknięć lub niektórych takich), a jednocześnie sprawny w innych.
Moje pytanie brzmi: czy ten kod jest z natury problematyczny? Czy powinien zostać przepisany, aby mieć inną strukturę? A może kod jest w porządku - JavaScriptCore ma po prostu błąd?
Zrobiłem trochę eksperymentowania gdzie refaktoringu kilka połączeń wewnętrznych do tymczasowych będzie „truncate” pamięć podwojenie zachowanie
var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))));
var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp1)))))));
inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, temp2)))))));
Na pewno zadzwonię do tego błędu. – Pointy
Dzięki @Pointy. Złożyłem rdar z Apple. –
Przeniesiono aplikację rdar do WebKit: https://bugs.webkit.org/show_bug.cgi?id=139847 –