Чтобы выкидывать, нужно на уровне компилятора уметь доказывать, что заданная функция при вызове с одними и теми же аргументами гарантированно возвращает один и тот же результат. Ну или хотя бы уметь помечать такие функции а-ля
Ну и доказать ещё, что аргументы не будут меняться — вдруг у меня другой тред по ходу цикла тайком переписывает указатель. Всё это абсурдные сценарии, конечно, но с точки зрения компиляции оптимизации не должны влиять на результат выполнения ну вообще никак, даже если в коде написана полнейшая дичь.
В целом, если прям интересно, то, наверное, могу поискать, но сразу скажу, что там всё максимально тривиально. Тут проблема в конкретно нашем сценарии, когда регулярно выделяется относительно большой кусок памяти. Если за входной параметр взять килобайт, то разница будет мизерной, а tcmalloc даже окажется не самым быстрым.
Так дело не только и не столько в этом. Рейт лимит не избавляет от вызовов логгера, а приводить к потере производительности они могут и без реальной записи сообщения куда-либо.
Tcmalloc? У вас там треды? Тогда надо про треды пейсать. А иначе, если топик про c++, то давайте вспомним c++17 std::pmr::polymorphic_allocator
Лучше поздно, чем никогда.
Я думаю, компилятор просто не вдаётся в анализ кода настолько, чтобы гарантировать отсуствие сайд-эффектов при вызове функции.
Ну то есть технически можно написать же и вот так:
Чтобы выкидывать, нужно на уровне компилятора уметь доказывать, что заданная функция при вызове с одними и теми же аргументами гарантированно возвращает один и тот же результат. Ну или хотя бы уметь помечать такие функции а-ля
Ну и доказать ещё, что аргументы не будут меняться — вдруг у меня другой тред по ходу цикла тайком переписывает указатель.
Всё это абсурдные сценарии, конечно, но с точки зрения компиляции оптимизации не должны влиять на результат выполнения ну вообще никак, даже если в коде написана полнейшая дичь.
В целом, если прям интересно, то, наверное, могу поискать, но сразу скажу, что там всё максимально тривиально.
Тут проблема в конкретно нашем сценарии, когда регулярно выделяется относительно большой кусок памяти. Если за входной параметр взять килобайт, то разница будет мизерной, а tcmalloc даже окажется не самым быстрым.
Так дело не только и не столько в этом. Рейт лимит не избавляет от вызовов логгера, а приводить к потере производительности они могут и без реальной записи сообщения куда-либо.
Так вспомнили же.
Не слышали, но будем иметь в виду, спасибо.
Мне кажется, @redfox0 прав. Плюс сходил в исходники glibc (https://elixir.bootlin.com/glibc/glibc-2.40.9000/source/sysdeps/x86_64/multiarch), и там уже есть векторизированные вручную варианты этих функций.
Да, так и есть, это эквивалентные конструкции.