Size: a a a

2021 February 15

VG

Vladislav Grubov in pro.lua
Да
источник

S

Snusmumriken in pro.lua
Vladislav Grubov
Можно называть как хочешь. Но на твой паттерн есть крутая оптимизация в луа: можно представить массив таблиц с одинаковым множеством ключей как хешмап массивов. Будет в разы меньше табличек, меньше нагрузка на gc
Это называется "паралельные массивы". Оно занимает меньше памяти, но требует куда больше усилий на удаление/вставку структур, потому что надо сдвинуть все значения во всех массивах после вставляемого (table.insert и table.removeмедленные, а тут оно умножается на количество полей). Комфорт использования — близок к нулевому. Расширяемость новыми полями тоже страдает, если какие-то поля пусты — образуются дырки, от которых ничего хорошего.
Такую штуку можно делать только если у тебя совершенно конкретная цель.
источник

a

anton in pro.lua
Snusmumriken
Это называется "паралельные массивы". Оно занимает меньше памяти, но требует куда больше усилий на удаление/вставку структур, потому что надо сдвинуть все значения во всех массивах после вставляемого (table.insert и table.removeмедленные, а тут оно умножается на количество полей). Комфорт использования — близок к нулевому. Расширяемость новыми полями тоже страдает, если какие-то поля пусты — образуются дырки, от которых ничего хорошего.
Такую штуку можно делать только если у тебя совершенно конкретная цель.
я начал обдумывать это всё, может это можно в какой-нибудь объект завернуть, чтоб он делал всю грязную работу?
источник

S

Snusmumriken in pro.lua
Можно, но всё равно медленно.
источник

S

Snusmumriken in pro.lua
Плюс размер строковых ключей в луа у однотипных объектов не имеет значения.
источник

S

Snusmumriken in pro.lua
Десять тысяч объектов
{
 longlongkey1 = "foo",
 longlongkey2 = "bar",
}

Будут иметь объём только собственных значений "foo" и "bar", плюс пары указателей на строки   "longlongkey1" и   "longlongkey2". Луа использует строковый буфер, так что экономия памяти на параллельных массивах минимальна.
Да, одинаковые строки (в т.ч. строковые ключи) существуют в памяти только в единственном экземпляре (и собираются мусорщиком, когда на них заканчиваются ссылки), а по луа-коду гуляют указатели на них.

Лайфхак: у луа очень, очень быстрое сравнение строк: просто проверка указателей на одинаковость ))
источник

S

Snusmumriken in pro.lua
По этим же причинам, кстати, нельзя менять отдельные части строки, типа str[2] = "f".
источник

a

anton in pro.lua
ясно, спасибо, теперь я знаю об этом явлении с разных сторон
источник

a

anton in pro.lua
получается 10000 таких объектов будут  занимать места на 160 кбайт больше, чем параллельные массивы, т.е. 8 x 2 x 10000 ?
источник

S

Snusmumriken in pro.lua
Примерно так, да. Ещё чуть-чуть на саму табличку, она тоже занимает маленький кусочек памяти.
источник

a

anton in pro.lua
о, значит 240 кб
источник

S

Snusmumriken in pro.lua
Карочи, делай пока как "удобно". Как "круто" — будешь делать когда тебе действительно приспичит.
источник

a

anton in pro.lua
да, согласен. если не смерджат, заставят переделывать, тогда переделаю
источник

S

Snusmumriken in pro.lua
В любом случае, на любые извращения обязательно идут дополнительные расходы, за крайне редким исключением.
источник
2021 February 16

А

Александр in pro.lua
источник

А

Александр in pro.lua
лол
источник

S

Snusmumriken in pro.lua
Нормально
источник

AY

Arslan Yulbirdin in pro.lua
> Лайфхак: у луа очень, очень быстрое сравнение строк: просто проверка указателей на одинаковость ))
То есть перед тем как создать строку, луа сверяет ее содержимое с другими и возвращает ссылку?
источник

S

Snusmumriken in pro.lua
Луа хеширует содержимое и сравнивает со списком хешей->указателей на другие строки. Да.
источник

AY

Arslan Yulbirdin in pro.lua
TString **p = G(L)->strcache[i];
 for (j = 0; j < STRCACHE_M; j++) {
   if (strcmp(str, getstr(p[j])) == 0)  /* hit? */
     return p[j];  /* that is it */
 }

Мдээ... И стоит оно того?
источник