В статье [ссылка] было заявлено, что производительность Haskell кода превзошла код на С++. Что сразу вызвало интерес, т.к. и то и другое может генерироваться LLVM компилятором, значит либо Наskell может давать больше хинтов компилятору, либо что-то не так с С++ реализацией. Далее мы разберём, как череда случайностей в действиях автора привела к неправильным выводам, которые описываются таблицей ниже (под катом).
Рубрика «clang» - 3
Сравнивали Haskell и C++, а сравнили jump и cmov
2020-02-28 в 19:20, admin, рубрики: c++, clang, gcc, haskell, бенчмарки, ПрограммированиеО некоторых проблемах микрооптимизаций
2020-01-03 в 14:25, admin, рубрики: c++, clang, gcc, godbolt, quick-bench, Компиляторы, микрооптимизации, ПрограммированиеПредыстория
Как-то раз у меня с коллегой завязался разговор по поводу улучшения инструментария для работы с битовыми флагами в перечислениях C++. На тот момент у нас уже была функция IsEnumFlagSet, принимающая на вход первым аргументом тестируемую переменную, вторым — набор флагов для проверки. Чем же она лучше старого доброго побитового И?
if (IsEnumFlagSet(state, flag))
{
}
// vs
if (state & flag)
{
}
Clang-format тормозит работу программы
2019-12-12 в 17:34, admin, рубрики: c++, clang, Блог компании PVS-Studio, детектив, Компиляторы, оптимизация, оптимизация кодаСегодня мы будем измерять производительность разных реализаций функции toupper, ведь именно этим и занимаются по вторникам.
Вообще-то мне нет никакого дела до функции toupper, просто я недавно писал другой пост и мне нужен был какой-то общий сюжетный стержень, а toupper кажется вполне интересным и безобидным кандидатом в бенчмарки. Я старался выбрать что-то максимально простое, что не увело бы меня в сторону, но так уж получилось, что в этом тесте я столкнулся со странной проблемой.
Читать полностью »
Как LLVM оптимизирует функцию
2019-11-18 в 20:44, admin, рубрики: C, c++, clang, LLVM, open source, Компиляторы, компиляция, ПрограммированиеОптимизирующий AOT-компилятор обычно структурирован так:
- фронтенд, преобразующий исходный код в промежуточное представление
- конвейер машинно-независимой оптимизации (IR): последовательность проходов, которые переписывают IR для устранения неэффективных участков и структур, которые не могут быть непосредственно преобразованы в машинный код. Иногда эту часть называют middle-end.
- Машинно-зависимый бэкенд для генерации ассемблерного кода или машинного кода.
В некоторых компиляторах формат IR остаётся неизменным на протяжении всего процесса оптимизации, в других его формат или семантика меняется. В LLVM формат и семантика фиксированы, и, следовательно, возможно запускать проходы в любой последовательности без риска неверной компиляции или аварийного завершения работы компилятора.
Читать полностью »
Инкремент элементов вектора
2019-11-13 в 8:57, admin, рубрики: c++, clang, gcc, Блог компании PVS-Studio, Компиляторы, оптимизация, оптимизирующий компиляторВ каком случае инкремент элементов вектора std::vector будет быстрее – если они имеют тип uint8_t или uint32_t?
Чтобы не рассуждать отвлечённо, рассмотрим две конкретные реализации:
void vector8_inc(std::vector<uint8_t>& v)
{
for (size_t i = 0; i < v.size(); i++)
{
v[i]++;
}
}
void vector32_inc(std::vector<uint32_t>& v)
{
for (size_t i = 0; i < v.size(); i++)
{
v[i]++;
}
}
Gradle + LLVM
2019-10-02 в 16:20, admin, рубрики: c++, clang, gcc, gradle, linux, LLVM, Visual Studio, windows, Разработка под Linux, разработка под windows, С++Этот небольшой пост может оказаться полезен тем, кто хотел бы быстро начать работать с LLVM, не заморачиваясь с закачкой исходников и просторойкой фреймворка. Кто не хотел бы ковыряться в малопонятных скриптах CMake-а чтобы добиться ожидаемого результата, ну и наконец, просто для ленивых :)
Я расскажу, как сделать это изящно, буквально парой строк в билд-скрипте Gradle-а.
Читать полностью »
Опасность использования multi-character-констант
2019-06-26 в 8:59, admin, рубрики: c++, clang, gcc, pvs-studio, visual c++, Visual Studio, Блог компании PVS-Studio, разработка под windows
Во время анализа кода, PVS-Studio выполняет анализ потока данных и оперирует значениями переменных. Значения берутся из констант или выводятся из условных выражений. Мы называем их виртуальными значениями. Недавно мы улучшали их для работы с multi-character-константами и это стало поводом для создания нового диагностического правила.
Введение
Multi-character-литерал является implementation-defined, поэтому различные компиляторы могут кодировать эти литералы по-разному. К примеру, GCC и Clang задают значение, основываясь на порядке символов в литерале, тогда как MSVC перемещает их в зависимости от типа символа (обычный или escape).
Читать полностью »
Компиляция C в WebAssembly без Emscripten
2019-06-05 в 5:54, admin, рубрики: C, clang, Emscripten, libc, LLVM, malloc, wasm, wasm-ld, WAT, webassembly, бамп-аллокатор, КомпиляторыКомпилятор — часть Emscripten. А что, если удалить все свистелки и оставить только его?
Emscripten необходим для компиляции C/C++ в WebAssembly. Но это гораздо больше, чем просто компилятор. Цель Emscripten в том, чтобы полностью заменить ваш компилятор C/C++ и запустить в вебе код, который изначально не предназначен для Сети. Для этого Emscripten эмулирует всю операционную систему POSIX. Если программа использует fopen(), то Emscripten предоставит эмуляцию файловой системы. Если используется OpenGL, то Emscripten предоставит С-совместимый контекст GL, поддерживаемый WebGL. Это немалая работа, и немало кода, который придётся внедрить в итоговый пакет. Но можно ли просто… удалить его?
Читать полностью »
Находим баги в LLVM 8 с помощью анализатора PVS-Studio
2019-04-29 в 13:52, admin, рубрики: bugs, c++, clang, compiler, devops, LLVM, open source, pvs-studio, баги, Блог компании PVS-Studio, качество кода, Компиляторы, статический анализ кода
Прошло более двух лет с момента последней проверки кода проекта LLVM с помощью нашего анализатора PVS-Studio. Давайте убедимся, что анализатор PVS-Studio по-прежнему является лидирующим инструментом по выявлению ошибок и потенциальных уязвимостей. Для этого проверим и найдём новые ошибки в релизе LLVM 8.0.0.
Читать полностью »
Finding Bugs in LLVM 8 with PVS-Studio
2019-04-29 в 13:43, admin, рубрики: bugs, c++, clang, compiler, devops, LLVM, open source, pvs-studio, Блог компании PVS-Studio, Компиляторы
It's been two years since we last checked the code of the LLVM project with PVS-Studio, so let's see if PVS-Studio is still the leader among tools for detecting bugs and security weaknesses. We'll do that by scanning the LLVM 8.0.0 release for new bugs.
Читать полностью »