LINUX.ORG.RU

Как можно закешировать

 , ,


0

2

Задумался я, как можно кэшировать в JS. Допустим, хотим закешировать многократный вызов некоторой функции, которая вызывается несколько раз с одним и тем же аргументом. Как это сделать? С примитивами, все понятно, а как с объектами? Логично было бы предположить, что в кеше надо сохранять ссылку на объект. Но ведь при вторичном вызове объект уже может изменится. Мы получим неактуальный результат. А между тем, в js почти все есть объекты. Да и с примитивами не все так просто, ибо примитив, вызванный в объектном контексте, тоже становится объектом. То есть, кэширование в js вообще невозможно.

Но тогда как же это делают оптимизаторы? Ведь нам втирают, что в js-движках кэширование, таки, есть.



Последнее исправление: J-yes-sir (всего исправлений: 1)

Еще немного и ты дойдешь до чистоты

Stil ★★★★★
()

Я нубас конечно, но ИМХО js кэширование не поддерживает, за исключением может некоторых функций, которые могут быть предоставлены тем или иным браузером(движком).

vyusfire
()

То есть, кэширование в js вообще невозможно.

мывсеумрем!!!!!!!!!!!!!!!111!!!!111111111

Vit ★★★★★
()
Ответ на: комментарий от J-yes-sir

Смотря что называть «закешировать многократный вызов некоторой функции». v8 обнаружив многократный вызов (например в цикле), попытается представить функцию в нативном максимально быстром коде. Естественно, если природа аргументов меняется, то придется деоптимизировать код, так как всякие там смещения в объекте поползут и т.п. Возможно будет создан вариант, который будет поддерживать несколько типов аргументов оптимально. Если не повезет, то может и отказаться от оптимизации.

io ★★
()
Ответ на: комментарий от io

например в цикле

Естественно, если природа аргументов меняется

Да не, с циклом, как раз, проблем тут не должно быть, JS однопоточен, поэтому изменить что-то можно только изнутри цикла. Пока цикл выполняется, никакой код из вне не изменит состояние переменных. Только и проку тут мало, в такой оптимизации, вменяемые программисты все равно лишние вычисления за цикл выносят, это так, на дурачка только расчитано.

J-yes-sir
() автор топика
Ответ на: комментарий от J-yes-sir

Даже если в цикле миллион раз вызывается некоторая функция, которой просто передается очередной элемент массива, то этот элемент может быть чем угодно. И для каждого вида элемента (число, строка, разнотипные объекты с разнообразными сеттерами/геттерами) нативный код должен быть либо абсолютно тупым и содержать сплошные вызовы generic-функций, либо оптимизироваться по популярным. Это не на дурачка.

http://thibaultlaurens.github.io/javascript/2013/04/29/how-the-v8-engine-works/ и ссылки.

Хотя и не без проблем:http://bahmutov.calepin.co/detecting-function-optimizations-in-v8.html, http://www.cs.cmu.edu/~ishafer/pubs/optimization-isr13.pdf

io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.