Обсуждение модуля:TemplateDataDoc
Последнее сообщение: 1 год назад от D6194c-1cc в теме «Кеширование»
Кеширование
править@D6194c-1cc, у вас есть какие-то причины считать, что запись значения в локальную переменную даёт прирост производительности? Насколько я вижу по данным анализатора, разница между версиями на уровне статистической погрешности (и не в пользу нового варианта). — putnik 13:41, 17 мая 2023 (UTC)
- Даже если было кеширование, вызывается меньше на одну функцию, хуже ничего не стало. Хорошим тоном является именно занесение результатов работы в переменную для последующего использования. Если кеширование реализовано через хеш-массив, то обращение к хешу – это вычисление хеша по строке, а затем разрешение коллизий и сравнивание строк. Если кешируется на уровне объекта, к методу которого обращаемся, то это всё равно лишний вызов функции (по факту просто ничего не изменилось, лишь слегка улучшилась читабельность кода). Если детали реализации неизвестны, то предполагается худший вариант. Какой смысл в открытии темы? D6194c-1cc (обс.) 14:15, 17 мая 2023 (UTC)
- Или есть предположение, что заведение новой локальной переменной (а она, скорее всего, помещается тоже в хеш на уровне функции) дороже вызова функции? Значения же хранятся по ссылке, насколько помню, не копируются. D6194c-1cc (обс.) 14:40, 17 мая 2023 (UTC)
- Судя по недавнему опыту с загрузкой элементов Викиданных — работа данными (как минимум, с таблицами) в Lua очень неэффективна как по ресурсам, так и по памяти. Сильно проще получить данные дважды, тем более, что внутри функций обычно и так всё кешируется. По ссылке, насколько помню, хранятся только таблицы, всё остальное всё равно копируется. — putnik 14:47, 17 мая 2023 (UTC)
- По недавнему опыту работы с Викиданными я сделал вывод, что обрабатывать Викиданные нужно в одном месте, поскольку повторное обращение к элементу может промахнуться мимо кеша. То есть сначала получить всё возможное из каждого элемента, потом обрабатывать. Банальное одно обращение к тому же элементу дальше по коду создаёт промах кеша и приводит к срабатываниям лимитов. Теоретически, даже иерархический обход элементов, насколько понимаю, может привести к сбросу кеша роительского элемента при большой вложенности дочерних. Но языка Lua это никак не касается (переменные vs методы). D6194c-1cc (обс.) 14:51, 17 мая 2023 (UTC)
- На самом деле логичным было бы предположить, что строки тоже передаются по ссылке, но если вот этот ответ верен: [1] (в приведённой документации явно этого вроде не сказано), то второй вызов функции будет создавать вторую копию контента. Поэтому локальная переменная будет выступать в роли кеша в таком случае. D6194c-1cc (обс.) 14:57, 17 мая 2023 (UTC)
- Выяснил, что в Lua строки неизменяемые ([2]), а это косвенно означает, что они тоже передаются по ссылке, а не копируются (их просто нет никакого смысла копировать). D6194c-1cc (обс.) 07:10, 19 мая 2023 (UTC)
- Судя по недавнему опыту с загрузкой элементов Викиданных — работа данными (как минимум, с таблицами) в Lua очень неэффективна как по ресурсам, так и по памяти. Сильно проще получить данные дважды, тем более, что внутри функций обычно и так всё кешируется. По ссылке, насколько помню, хранятся только таблицы, всё остальное всё равно копируется. — putnik 14:47, 17 мая 2023 (UTC)
- Или есть предположение, что заведение новой локальной переменной (а она, скорее всего, помещается тоже в хеш на уровне функции) дороже вызова функции? Значения же хранятся по ссылке, насколько помню, не копируются. D6194c-1cc (обс.) 14:40, 17 мая 2023 (UTC)
- А по документации, да, косвенно фраза "The page will be recorded as a transclusion" указывает на кеширование. D6194c-1cc (обс.) 14:31, 17 мая 2023 (UTC)