Это больше подсказка, чтобы найти дыры в самом алгоритме ...
Чтобы добиться максимальной производительности, упростите все внутри самого внутреннего цикла за счет всего остального.
Одним из примеров простоты является классическая анимация прыгающего мяча. Вы можете реализовать гравитацию, посмотрев определение в своей книге по физике и вставив числа, или вы можете сделать это следующим образом и сохранить драгоценные циклы часов:
initialize:
float y = 0; // y coordinate
float yi = 0; // incremental variable
loop:
y += yi;
yi += 0.001;
if (y > 10)
yi = -yi;
Но теперь давайте предположим, что вы должны делать это с вложенными циклами в симуляции N-тела, где каждая частица притягивается к каждой другой частице. Это может быть чрезвычайно трудоемкой задачей, когда вы имеете дело с тысячами частиц.
Конечно, вы должны использовать тот же подход, что и упростить все внутри самого внутреннего цикла. Но более того, на самом простом уровне вы также должны разумно использовать типы данных. Например, математические операции быстрее при работе с целыми числами, чем переменные с плавающей точкой. Кроме того, сложение быстрее, чем умножение, а умножение быстрее, чем деление.
Итак, учитывая все это, вы сможете упростить самый внутренний цикл, используя в основном сложение и умножение целых чисел. И тогда любое уменьшение, которое вам может понадобиться, может быть сделано впоследствии. Для примера y и yi, если yi - это целое число, которое вы изменяете во внутреннем цикле, вы можете уменьшить его после цикла следующим образом:
y += yi * 0.01;
Это очень простые низкоуровневые советы по производительности, но это все, о чем я стараюсь помнить, когда работаю с интенсивными процессорами. Конечно, если вы затем возьмете эти идеи и примените их к параллельной обработке на графическом процессоре, тогда вы сможете поднять свой алгоритм на совершенно новый уровень. =)