Обсуждение модуля: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)Ответить
  • А по документации, да, косвенно фраза "The page will be recorded as a transclusion" указывает на кеширование. D6194c-1cc (обс.) 14:31, 17 мая 2023 (UTC)Ответить