Всякий раз, когда кто-то спрашивает о том, насколько быстрыми структурами управления на любом языке вы знаете, он пытается оптимизировать не то, что нужно.Если вы обнаружите, что меняете все свои i++
на ++i
или меняете все свои switch
на if...else
для повышения скорости, вы оптимизируете микро.А микрооптимизации почти никогда не дают вам желаемой скорости.Вместо этого, подумайте немного больше о том, что вы действительно пытаетесь сделать, и придумайте лучший способ сделать это.
Я не уверен, действительно ли опубликованный вами код действительно то, что вы намереваетесь делать, или это так.просто цикл, урезанный до того, что, по вашему мнению, вызывает проблему.Если это первое, то вы пытаетесь найти наибольшее значение числа, которое меньше другого числа.Если это действительно то, что вам нужно, тогда вам не нужен цикл:
// assuming v1, parmIn and parmIn2 are integers,
// and you want the largest number (v1) that is
// smaller than parmIn but is a multiple of parmIn2.
// AGAIN, assuming INTEGER MATH:
v1 = (parmIn/parmIn2)*parmIn2;
EDIT : я только что понял, что код, который был изначально написан, дает наименьшее число, которое являетсякратный parmIn2, который больше, чем parmIn.Итак, правильный код:
v1 = ((parmIn/parmIn2)*parmIn2)+parmIn2;
Если это не то, что вы действительно хотите, тогда мой совет остается прежним: подумайте немного о том, что вы действительно пытаетесь сделать (или спросите в Stackoverflow) вместо того, чтобы пытатьсячтобы узнать погоду while
или for
быстрее.Конечно, вы не всегда найдете математическое решение проблемы.В этом случае существуют другие стратегии для уменьшения количества циклов.Вот одна из них, основанная на вашей текущей проблеме: продолжайте удваивать инкрементатор до тех пор, пока он не станет слишком большим, а затем уменьшите его, пока он не станет правильным:
int v1=0;
int incrementer=parmIn2;
// keep doubling the incrementer to
// speed up the loop:
while(v1 < parmIn) {
v1+=incrementer;
incrementer=incrementer*2;
}
// now v1 is too big, back off
// and resume normal loop:
v1-=incrementer;
while(v1 < parmIn) {
v1+=parmIn2;
}
Вот еще одна альтернатива, которая ускоряет цикл:
// First count at 100x speed
while(v1 < parmIn) {
v1+=parmIn2*100;
}
// back off and count at 50x speed
v1-=parmIn2*100;
while(v1 < parmIn) {
v1+=parmIn2*50;
}
// back off and count at 10x speed
v1-=parmIn2*50;
while(v1 < parmIn) {
v1+=parmIn2*10;
}
// back off and count at normal speed
v1-=parmIn2*10;
while(v1 < parmIn) {
v1+=parmIn2;
}
По моему опыту, особенно в графическом программировании, где у вас есть миллионы пикселей или полигонов для обработки, ускорение кода обычно включает добавление еще большего кода , что переводит в большее количество инструкций процессора вместо того, чтобы пытаться найтинаименьшее количество инструкций, возможных для поставленной задачи.Хитрость заключается в том, чтобы избежать обработки того, что вам не нужно.