есть ли разница во времени выполнения следующего: - PullRequest
0 голосов
/ 16 июля 2009

Есть ли разница во времени выполнения следующих двух фрагментов?

SNIPPET 1:

for ( Object obj : collection ) {
    step1( obj );
    step2( obj );
    step3( obj );
}

СНиПЕТ 2:

for ( Object obj : collection ) {
    step1( obj );
}

for ( Object obj : collection ) {
    step2( obj );
}

for ( Object obj : collection ) {
    step3( obj );
}

Ответы [ 6 ]

1 голос
/ 16 июля 2009

Конечно. Первый фрагмент выполняет итерацию по коллекции только один раз, а второй - 3 раза. Второй фрагмент также нарушает принцип СУХОГО.

0 голосов
/ 16 июля 2009

Вы спрашиваете конкретно о производительности?

В этом случае ответ зависит от того, насколько быстрым является итератор коллекции : если Next() дорогая операция для этого конкретного итератора, то вы платите эту стоимость N раз в первой версии и 3N раз в последнем. Это несущественно, если ваша коллекция является векторной, но более серьезной, если ваша коллекция является, скажем, интерфейсом для некоторой медленной операции ввода-вывода файла.

0 голосов
/ 16 июля 2009

Есть ли разница? Конечно.

Есть ли разница, которая имеет значение? Все зависит.

Если StepN() занимает несколько наносекунд, тогда да. В противном случае, вероятно, нет.

0 голосов
/ 16 июля 2009

Если один из ваших вызовов методов вызовет исключение, скажем, шаг1 в середине итерации, тогда вторая версия остановится раньше, чем первая. Но если step3 создает исключение для первого элемента, тогда первая версия работает быстрее. Таким образом, две версии не эквивалентны семантически.

0 голосов
/ 16 июля 2009

Итерации сделаны 3 раза.

Также вы будете вызывать step1 (obj) n раз, затем step2 (obj) n раз, затем step3 (obj) n раз.

0 голосов
/ 16 июля 2009

Если вы спрашиваете о каком-либо языке, SNIPPET 1 должен быть быстрее.

...