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