‹ фон›
Я нахожусь в том месте, где мне действительно нужно оптимизировать код C++. Я пишу библиотеку для молекулярного моделирования, и мне нужно добавить новую функцию. Я уже пытался добавить эту функцию в прошлом, но тогда я использовал виртуальные функции, вызываемые во вложенных циклах. У меня были плохие предчувствия по этому поводу, и первая реализация показала, что это была плохая идея. Однако это было нормально для тестирования концепции.
< /задний план>
Теперь мне нужно, чтобы эта функция была максимально быстрой (ну, без ассемблерного кода или вычислений GPU, это все еще должно быть C++ и более читаемым, чем менее). Теперь я знаю немного больше о шаблонах и политиках классов (из отличной книги Александреску), и я думаю, что генерация кода во время компиляции может быть решением.
Однако мне нужно протестировать дизайн, прежде чем выполнять огромную работу по внедрению его в библиотеку. Вопрос в том, как лучше всего проверить эффективность этой новой функции.
Очевидно, мне нужно включить оптимизацию, потому что без этого g++ (и, возможно, другие компиляторы) сохраняли бы некоторые ненужные операции в объектном коде. Мне также нужно интенсивно использовать новую функцию в тесте, потому что дельта в 1e-3 секунды может иметь значение между хорошим и плохим дизайном (эта функция будет вызываться миллион раз в реальной программе).
Проблема в том, что g++ иногда слишком умен при оптимизации и может удалить весь цикл, если посчитает, что результат вычисления никогда не используется. Я уже видел это однажды, когда смотрел на выходной ассемблерный код.
Если я добавлю некоторую печать в stdout, компилятор будет вынужден выполнять вычисления в цикле, но я, вероятно, в основном буду тестировать реализацию iostream.
Итак, как я могу провести правильный тест небольшой функции, извлеченной из библиотеки? Связанный с этим вопрос: правильно ли проводить такие in vitro тесты на небольшом устройстве или мне нужен весь контекст?
Спасибо за советы!
Кажется, существует несколько стратегий, от специфичных для компилятора опций, позволяющих точную настройку, до более общих решений, которые должны работать с каждым компилятором, таким как volatile
или extern
.
Думаю попробовать все это. Большое спасибо за все ваши ответы!