В одной программе встретил такой фрагмент (почти вся программа в таком стиле написана): Код (Text): fast:=0; slow:=0; for i:=10 to 50 do fast:=fast+inpp[i]/40; for i:=75 to 85 do slow:=slow+inpp[i]/10; Вопрос: современные компиляторы превратят это в оптимальный код??? Или все-таки быстрее как меня в молодости учили: Код (Text): fast:=0; slow:=0; for i:=10 to 50 do fast:=fast+inpp[i]; fast:=fast/40; for i:=75 to 85 do slow:=slow+inpp[i]; slow:=slow/10;
Результат может отличаться, если числа в массиве большие, т.е. если при сложении может произойти переполнение.
Дельфи - точно оставит как есть, другие - не знаю. Но судя по бытующему мнению все или по кр.мере большинство известных компиляторов плохо оптимизируют (если не сказать вообще не оптимизируют FPU-код). Компилятор не только "не соображает" заменить деление умножением на обратную величину или вообще вынести деление или умножение за цикл, но еще и "боится" копить сумму в регистре и на каждой итерации сохраняет ее в память и на следующем шаге грузит заново Если кодишь на дельфи, то попробуй заменить цикл на fast:=Sum(inpp)*0.025 и посмотри во сколько раз будет быстрее. Sum это оптимизированная ассемблерная функция из Math.pas, которая копит параллельно 4 частичные суммы в регистрах FPU без промежуточных сохранений. Одно только такое распараллеливание дает увеличение скорости до 3-4 раз по сравнению с накоплением в одном регистре, не говоря уж о ненужных загрузках\выгрузках. Одним словом асм рулит, особенно на FPU-вычислениях PS: Кстати на современных компах циклы fast:=fast+inpp и fast:=fast+inpp*0.025 (по кр.мере если держать 0.025 в регистре) будут выполняться примерно за одно и то же время, т.к. throughput (темп) независимых fmul составляет 1-2 такта, а латентность зависимых fadd - 3-6 тактов в завис-ти от проца. По этой же причине и накопление частичных сумм рулит
Не надо путать компилятор и маткад. Оптимизатор делает как правило мелочи или те вещи которые тебе не доступны из-за высокого уровня языка. А вмешиваться в сам алгоритм он не обязан, каким-бы крутым он небыл...