JavaScriptCore вложенный "вызов" проблема производительности
если я определяю функцию
inc = function(x) { return x + 1 }
и сделать вложенный вызов его
inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))
это приведет к значению 22
. Если я пересмотрю вложенное выражение, чтобы вместо этого использовать call
, проходящей в null
на this
, а
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)))))))))))))))))))))
это также приведет к значению 22
.
но, на JavaScriptCore эта вторая форма, кажется, потребляет O(2^n) памяти, где n is количество вложенных вызовов. Это не так, если я попробую этот JavaScript в Firefox или Chrome, поэтому он, похоже, изолирован от JavaScriptCore.
у меня очень мало опыта JavaScript (почти нет). У меня нет ощущения компромиссов, которые могут сделать различные реализации JavaScript, а также разумно ли, чтобы пример кода был дорогим в некоторых реализациях (обеспечивая общую поддержку замыканий или некоторых таких), в то время как эффективный в других.
мой вопрос: Является ли этот код по своей сути проблематичным? Следует ли его переписать, чтобы структурировать по-другому? Или код в порядке-у JavaScriptCore просто есть ошибка?
я провел некоторые эксперименты, где рефакторинг нескольких внутренних вызовов к временным будет "усекать" поведение удвоения памяти
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)))))));
1 ответ:
основываясь на комментариях по этому вопросу, консенсус заключается в том, что нет фундаментальной проблемы с написанным кодом, но вместо этого это ошибка в JavaScriptCore.
на авиабилет подано, Он был подтвержден как воспроизводимый и был импортирован в радарную систему Apple.