2014-12-19 8 views
52

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))))))); 
+13

Na pewno zadzwonię do tego błędu. – Pointy

+0

Dzięki @Pointy. Złożyłem rdar z Apple. –

+0

Przeniesiono aplikację rdar do WebKit: https://bugs.webkit.org/show_bug.cgi?id=139847 –

Odpowiedz

12

oparciu o komentarze w tej kwestii, konsensus jest, że nie ma zasadniczej problem z kodem jak napisano, ale zamiast tego jest to błąd w JavaScriptCore.

Dla ticket filed, zostało potwierdzone jako odtwarzalne i zostało zaimportowane do systemu radarowego Apple.

+0

Zastanawiasz się, kiedy inc (x) normalnie desugar wewnętrznie do inc.call (okno, x). Czy null musi coś z tym zrobić. – jsHero

+0

@jsHero Próbowałem testu obejmującego 'inc.call (window, inc.call (window, inc.call (window, ...') i to wykazywał ten sam problem –

+0

Dzięki Mike.Nie rozumiem, dlaczego ten problem jest zamknięty niektórzy programiści Apple powinni prawdopodobnie odpowiedzieć z powodu tego błędu. Zawsze jest to świetne find @mike. – jsHero