5everin Ответов: 4

Простой вопрос о циклах if then (else).


Есть ли в этом какие-то преимущества или недостатки :

If colmod1 = new_colmod1 Then
        Else
            If colmod1 > new_colmod1 Then colmod1 -= 0.001
            If colmod1 < new_colmod1 Then colmod1 += 0.001
        End If


Вместо того, чтобы делать это? :

If colmod1 <> new_colmod1 Then
            If colmod1 > new_colmod1 Then colmod1 -= 0.001
            If colmod1 < new_colmod1 Then colmod1 += 0.001
        End If


Компилируется ли он до одного и того же кода? должен ли я избегать этого, потому что?


Что я уже пробовал:

N / A..просто для получения справочной информации и того, что мнения людей.

5everin

Пс.
В этом конкретном примере код выполняет множество таких тестов, которые в основном обнаруживают совпадение значений. Он ищет исключения в большом наборе данных.

4 Ответов

Рейтинг:
7

5everin

Я провел небольшое тестирование с помощью секундомера и 1 000 000 000 итераций условия, повторенных 10 раз для каждой версии.

И чтобы ответить на мой собственный вопрос:

"Хорошее "решение немного быстрее, чем" уродливое", когда условие всегда терпит неудачу. Разница составляет всего лишь около 1% или меньше, но она кажется довольно последовательной в течение нескольких запусков.

Я думаю, что все остальное гораздо дороже обрабатывать.

"Уродливая" форма кажется немного быстрее, когда условие всегда выполняется с небольшим большим запасом, возможно, 1-2%.

Однако как только оптимизация компилятора включена в VS. Разница, вдруг исчезает. Так что на самом деле нет никаких причин использовать его кроме фактора раздражения :)


Dave Kreskowiak

Да, вам уже говорили, что различия исчезнут, как только вы перейдете к сборке с включенной оптимизацией, то есть к сборке "Release".

Тестирование" отладочной " сборки немного бессмысленно.

Рейтинг:
30

OriginalGriff

Первый из них уродлив и труден для чтения: после завершения оптимизации не должно быть никакой разницы в производительности.


5everin

Спасибо, лучшая практика-это не совсем то, что мне нужно, хотя я понимаю, почему вы добавили ее в ответ.

Рейтинг:
21

CPallini

Они (визуальные) в основном одинаковы. Вы можете выбрать первую форму только для того, чтобы расстроить Грифф.


OriginalGriff

: смех: +5

Рейтинг:
2

Dave Kreskowiak

Лучший вопрос. Почему вы тестируете, чтобы увидеть, является ли значение "больше", а затем в следующем операторе тестируете, чтобы увидеть, является ли значение "меньше"?

Если значение не равно, вам нужен только один другой оператор if, чтобы получить два результата.

If colmod1 <> new_colmod1 Then
    If colmod1 > new_colmod1 Then 
        colmod1 -= 0.001
    Else
        colmod1 += 0.001
    End If
End If


5everin

меньше типизации для примера :)

Dave Kreskowiak

Кроме того, менее читаемый и менее производительный оператор if не является быстрой операцией.

Richard Deeming

Код внутри If блок изменяет одну из тестируемых переменных, поэтому теоретически возможно, что код выполнит оба блока. :)

Напр.:
colmod1 = 42
new_colmod1 = 41.9991

Dave Kreskowiak

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