Comments 51
типичная проблема алгоритмов O(n^2): начальные данные слишком маленькие, чтобы обнаружить проблему на старте, через какое-то время объем данных вырастает, чтобы все начало тормозить, и не очень понятно из-за чего: "раньше работало же".
Очень классная статья, спасибо за перевод! Не думал, что так просто (относительно) можно исправлять такие вещи без перекомпилирования/патчинга бинарника.
Посмотрел исходники glibc (не знаю насколько свежие) — всё именно так и есть: https://code.woboq.org/userspace/glibc/libio/strops.c.html#41
Не совсем strlen, но тоже последовательное сканирование строки в поисках завершающего нулевого символа.
Если кому интересно зачем так сделано — там поленились писать отдельную ветку для разбора нуль-терминированной строки, и вместо этого превращают переданную строку в буфер для как-бы-файла (FILE*
). На этом этапе и требуется размер строки.
Избежать квадратичного алгоритма можно было бы или передав размер строки в аналог sscanf, или явно открыв строку как файл и используя fscanf. Вот только стандартная библиотека не даёт сделать ни того, ни другого...
Но ведь sscanf для нуль-терминированных строк — очень широко применяемый юз-кейс, можно было и оптимизировать эту ветку.
Подозреваю, что чаще всего sscanf
используют, чтобы разобрать строку полностью. А здесь им много раз читали по одному числу.
Я был бы все-таки за то, чтобы иметь какой-нибудь snscanf
, который бы читал не больше n символов.
Вообще они могли бы использовать какой-нибудь готовый проверенный сообществом JSON-парсер, а не велосипедить свой. JSON на 10 Мб, в общем-то, не что-то сверхъестественное.
Чуть ли не копипасты примитивных парсеров со stackoverflow. Ощущение, что просто условный мидл которого попросили прикрутить фичу, не хочет связываться со сложными либами и берет самую простую из инета, которую может найти.
Это не исключение. Прям стабильно натыкаюсь на такое.
А там загрузки по сколько минут занимают?
Еще в онлайн режиме она дико тормозит на пс4 ( не про )
Зачем? Игра отживает свое.
А что если использовать вместо json какой-то бинарный формат данных?
В данном случае проблема не в JSON, а в зачем-то написанном самодельном неэффективном парсере, при том что готовых горы, в том числе под лицензиями, допускающими беспроблемное использование в закрытом софте.
Есть простой способ «выгнать всех» из сессии: запускаем виндовый Монитор ресурсов, находим процесс GTA5, ПКМ — «Приостановить процесс», ждем когда когда в миганиях лапочки на LAN (я гляжу на свой роутер) возникнут перебои (или просто считаем до 10) — «Возобновить процесс», вуаля, все вышли, ты один в сессии (для остальных в сессии это ты вышел).
Подобным способом ускоряю загрузку в сессию: при загрузке игры наблюдаю за индикатором LAN, как начался интенсивный сетевой обмен (идет «синхронизация» с сессией), замораживаю-размораживаю процесс GTA5 и попадаю в пустую сессию.
У меня на php сотнимегабайтные XML(1c)/YML/Excel от поставщиков на десятки тысяч товаров парсятся не более чем за 10 секунд, через практически ручной построчный разбор, используя XMLReader, вместе с групповой вставкой в базу (которая ещё ведёт лог изменений через триггеры).
Какие нафиг 1м50с (и тем более 6мин) на парсинг 10мб? Тем более на С.
Все просто, у вас O(n) алгоритм, а в GTA — внезапный O(n^2). Ну не думал разработчик, что sscanf будет по всей строке пробегаться каждый раз. А со вторым примером — кого-то явно не спрашивали на собеседовании про хеш таблицы.
Дело ведь не в том, что спрашивали, а чего нет. Все допускают ошибки и пишут порой неоптимизированный код, удивляет только то, что никто этого не заметил и не пофиксил
На самом деле, для разных данных хэш в общем-то имеет право совпадать. Но тем не менее, стандартные хэш-таблицы позволяют искать дубликаты за почти константное время (для этого правда надо иметь хорошую хэш-функцию, но ведь взять готовую тоже вполне можно)
Ну вот, правильная обработка коллизий — это основа хэш таблицы. Если тупо пробегать по ней всей каждый раз, то смысл вообще хэши считать? Просто разработчик не знал про такую структуру данных и нагородил что-то свое. А ревью у них или нет, или оно попало к такому же.
Спасибо за статью. Читалось как детектив. А убийца как обычно дворецкий.
Но если честно, после таких статей становится непонятно почему самолёты падают так редко...
Почему не указано что это перевод?
https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/
Как я сократил время загрузки GTA Online на 70%