В статье все так красиво написно(как и в других статьях про PVS-Studio)… берем инструмент запускаем на boost(или любом другом проекте), и получаем 5-10 мест с ошибками/опечатками… но это наверняка не правда.
Последний раз когда я брал в руки этот инструмент(было давно), это выглядело примерно так:
Ставим PVS-Studio, запускам студию с большим проектом… все висит… ждем, запускаем анализ… много ждем… получает 100500 сообщений… счастье не наступило… :(… (кстати после этого я студию переставлял — PVS-Studio и студия что то не поделили ...)
А не могли бы вы сделать видео вместо статьи?
По типу: тут мы ставим PVS-Studio, тут запускаем анализ на очень большом проекте X, вот все быстро отработало, вот мы отключили ложные срабатывания, а вот наши ошибки… profit!!!
С каждой такой новостью лишний раз убеждаюсь, что у этой страны только один выход — революция. Если это случится, то это будет страшно… но иначе никак.
Я сам занимался данной проблемой некоторое время назад и хотелось бы поделиться своими замечаниями.
Процессор очень хитрое устройство, поэтому если писать что то такое:
ull t1 = rdtsc();
for (int i = 0; i < inner_len; i += VEC_LEN) {
записать синус angles[i] в sines[i]
}
ull t = rdtsc() - t1;
то может получиться так, что процессор поменяет инструкции местами(так как они не зависят), поэтому rdtcs() может вызваться не там где нужно и результат будет не верным.
Мое решение следующие(GCC only). Я не стал приводить весь код, только основное:
Вначале необходимо вызвать инструкцию cpuid для того, чтобы процессор не менял порядок исполнения инструкций. Затем, вызывая инструкцию rdtsc, происходит запись количества тактов процессора в регистры edx и eax.
Инструкция rdtscp читает значение количества тактов процессора и сохраняет их в регистры edx и eax, гарантируя при этом, что весь код, который находится до этой инструкции, будет выполнен. После данной инструкции, также стоит вызвать инструкцию cpuid, что бы предотвратить внеочередное исполнение инструкций.
Следует заметить, что на «замеряемое» время это ни как не повлияет, т.к. инструкция cpuid следует за инструкцией rdtscp(которая появилась только в процессорах начиная с Intel Core i7)
Подробности можно посмотреть тут: Gabriele Paoloni. How to Benchmark Code Execution Times on Intel IA-32 and IA-64 Instruction Set Architectures, September 2010
Текст нормально будет отображаться, а вот большие таблицы скорее всего не влезут.
Для таблиц два варианта: либо уменьшаем шрифт, либо переделываем таблицу — разбиваем на N таблиц, уменьшаем количество столбцов и так далее. Универсального решения не существует. Это всего лишь способ начать копать в нужном направлении.
Все верно, компилятор(VS2010) не сообразит(на счет других не знаю). Пробовал включать sse2, оптимизацию по скорости, float point model(FAST). Код изменился незначительно(функция MathCalculations):
БЫЛО:
-Werror -Wall -Wextra -pedantic -Weffc++ -Wconversion -Wsign-conversion -Wold-style-cast -Wunreachable-code -Woverloaded-virtual -Wctor-dtor-privacy -Wnon-virtual-dtor -Wenum-compare
Последний раз когда я брал в руки этот инструмент(было давно), это выглядело примерно так:
Ставим PVS-Studio, запускам студию с большим проектом… все висит… ждем, запускаем анализ… много ждем… получает 100500 сообщений… счастье не наступило… :(… (кстати после этого я студию переставлял — PVS-Studio и студия что то не поделили ...)
А не могли бы вы сделать видео вместо статьи?
По типу: тут мы ставим PVS-Studio, тут запускаем анализ на очень большом проекте X, вот все быстро отработало, вот мы отключили ложные срабатывания, а вот наши ошибки… profit!!!
Видеорегистраторы еще можно использовать?
А можно воспользоваться уже готовым решением libgmp
Процессор очень хитрое устройство, поэтому если писать что то такое:
то может получиться так, что процессор поменяет инструкции местами(так как они не зависят), поэтому rdtcs() может вызваться не там где нужно и результат будет не верным.
Мое решение следующие(GCC only). Я не стал приводить весь код, только основное:
Рассмотрим подробнее, как устроен данный код.
Вначале необходимо вызвать инструкцию cpuid для того, чтобы процессор не менял порядок исполнения инструкций. Затем, вызывая инструкцию rdtsc, происходит запись количества тактов процессора в регистры edx и eax.
Инструкция rdtscp читает значение количества тактов процессора и сохраняет их в регистры edx и eax, гарантируя при этом, что весь код, который находится до этой инструкции, будет выполнен. После данной инструкции, также стоит вызвать инструкцию cpuid, что бы предотвратить внеочередное исполнение инструкций.
Следует заметить, что на «замеряемое» время это ни как не повлияет, т.к. инструкция cpuid следует за инструкцией rdtscp(которая появилась только в процессорах начиная с Intel Core i7)
Подробности можно посмотреть тут: Gabriele Paoloni. How to Benchmark Code Execution Times on Intel IA-32 and IA-64 Instruction Set Architectures, September 2010
Для таблиц два варианта: либо уменьшаем шрифт, либо переделываем таблицу — разбиваем на N таблиц, уменьшаем количество столбцов и так далее. Универсального решения не существует. Это всего лишь способ начать копать в нужном направлении.
БЫЛО:
СТАЛО:
Полагаю, что оптимизация не получилось из-за того, что компилятор боится переставить операции местами, так как это повлияет на результат.
Вы уверены, что компилятор ее сам не привел к виду res = a*a*A + b*B + C? Компиляторы нынче умные… да и случай простой. Может asm покажите?