Ускорение импорта OBJ в Блендере за счёт ускорения парсинга

Поменяли входные и выходные типы, что на больших сценах может сэкономить секунды.

Ускорение импорта OBJ в Блендере за счёт ускорения парсинга

Сам фикс будет в 3.2. Про проблему Арас хорошо расписал.

Всё дело в том, что в старой реализации использовался StringRef, который в регистр не влезал. А к методу много обращений при парсинге. После переделки на больших сценах новая реализация может сэкономить секунды.

Было

StringRef drop_whitespace(StringRef str) { while (!str.is_empty() && is_whitespace(str[0])) str = str.drop_prefix(1); return str; }

Стало

const char *drop_whitespace(const char *p, const char *end) { while (p < end && is_whitespace(*p)) ++p; return p; }

Проблема проявляется на Винде из-за Calling convention на значениях, не влезающих в 64 бита.

5252
7 комментариев
Комментарий удалён модератором

Комментарий недоступен

5
Ответить

Очень интересный случай, спасибо, было любопытно.

Хочу однако заметить, что прочитав заметку по-русски, я почти ничего не понял. Слова "регистр не влезал" и "может сэкономить секунды" для меня прозвучали обыденно. Уловить, какая реальность стоит за ними, я смог, только прочитав по ссылке английский текст Араc. Там чётко сказано - "регистры CPU", дана табличка по производительности, где разница в секундах видна наглядно. Также стало яснее про какие типы идет речь, потому что посмотрев два раза на функцию, я так и не понял, в чем там прикол. А из статьи - стало ясно.

Это просто замечание, что заметка немножко узко написана, не популяризаторски.

А ещё важный момент, имхо, что речь про связку Intel+Windows, те самые Calling convention.

3
Ответить