Это быстрее сделать разделение по партиям или только один раз? - PullRequest
1 голос
/ 02 мая 2019

Предположим, у меня есть числа: 1, 2, 4, 7, 12 и 18 (выбраны случайным образом). При вычислении среднего значения это сделать быстрее:

mean=0
loop through [1, 2, 4, 7, 12, 18]
   for each item:
     increase mean by (item/total number of items)

или

mean=0
loop through [1, 2, 4, 7, 12, 18]
   for each item:
     increase mean by (item)
divide mean by 3

или это не имеет значения для скорости алгоритма? Это чисто теоретический вопрос (игнорирование конкретного выбранного компилятора и т. Д.)

1 Ответ

1 голос
/ 02 мая 2019

В какой-то степени это зависит от того, насколько умен ваш компилятор - некоторые будут выполнять много оптимизаций, другие - не так много.Уровень оптимизации часто можно настроить так, чтобы вы могли изменять степень, в которой компилятор преобразует код.

В пределе оптимизации компилятор может распознать ваш код, вычисляет постоянное значение и предварительно вычислить его во время компиляциии поместите результат в выходную переменную.Это абсолютно возможно.

Другая возможность заключается в том, что компилятор распознает цикл за фиксированным диапазоном, поэтому он удаляет цикл и расширяет суммирование.

В пределе отсутствия оптимизации вашПервый фрагмент выполняет 6 операций деления, а второй - только одну.Поскольку другие количества операций одинаковы для каждого из фрагментов, первый фрагмент не может быть быстрее и, вероятно, медленнее по сравнению со вторым фрагментом.

Возможно, будет полезно узнать об оптимизации в компиляторе вашего языка илиинтерпретировать и экспериментировать с различными уровнями оптимизации, чтобы увидеть, как изменяется производительность каждого фрагмента.Вам, вероятно, понадобятся большие входные выборки, чтобы получить полезные измерения времени.

...