Оптимизация кода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Оптимизация кода

Сообщение D'alex » 01.02.2005 (Вт) 22:39

Всем привет!
Прошу помочь в таком вопросе:
Какая функция будет работать быстрее всех перечисленных?
Код: Выделить всё
Public Function CreateD3DVector(x As Single, y As Single, z As Single) As D3DVECTOR
   With CreateD3DVector
        .x= x: .y = y: .z = z
    End With
End Function

Код: Выделить всё
Public Function CreateD3DVector(x As Single, y As Single, z As Single) As D3DVECTOR
   With CreateD3DVector
        .x= x
        .y = y
        .z = z
    End With
End Function

Код: Выделить всё
Public Function CreateD3DVector(x As Single, y As Single, z As Single) As D3DVECTOR
   CreateD3DVector .x = x: CreateD3DVector.y = y: CreateD3DVector.z = z
End Function

Код: Выделить всё
Public Function CreateD3DVector(x As Single, y As Single, z As Single) As D3DVECTOR
    CreateD3DVector.x = x
    CreateD3DVector.y = y
    CreateD3DVector.z = z
End Function



Если возможно то поясните пожалуйста...
Заранее спасибо!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 22:43

Коды 1 и 2 эквивалентны, коды 3 и 4 эквивалентны.

Быстрее всего работает 1 (или 2), т.к. With...End With работает быстрее именно в таких смысловых конструкциях...

Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 01.02.2005 (Вт) 22:45

Amed писал(а):Коды 1 и 2 эквивалентны, коды 3 и 4 эквивалентны.
Быстрее всего работает 1 (или 2)...


Amed, можно спросить почему (1 или 2)? :? Я не догоняю...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 22:49

Код 1 работает совсем так же, как и код 2. Просто редактор vbCrLf в окно кода не вписал, считай.

А код с With...End With работает в данном случае быстрее, имхо...

Александр80
Bonachón
Bonachón
 
Сообщения: 659
Зарегистрирован: 20.03.2004 (Сб) 23:50
Откуда: г.Москва

Сообщение Александр80 » 01.02.2005 (Вт) 22:50

Спасибо! :-) Понял... :lol:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.02.2005 (Вт) 23:01

Подвержу слова Amed'а кодом :)
Код: Выделить всё
Option Explicit

Private Type Type1
X As Long
Y As Long
Z As Long
End Type

Private Sub Form_Load()
Dim T1 As Type1, T!, I&
T = Timer
For I = 1 To 100000
With T1
.X = I - 1
.Y = I
.Z = I + 1
End With
Next
Debug.Print Timer - T
For I = 1 To 100000
T1.X = I - 1
T1.Y = I
T1.Z = I + 1
Next
Debug.Print Timer - T
End Sub
Код: Выделить всё
Immediate:
0,03125
0,0625
Второй способ ровно в 2 раза медленнее :roll:
ЗЫ причем всегда :roll:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 01.02.2005 (Вт) 23:11

Ух ты! Молодец, A.A.Z.! Всё максимально наглядно! ;)
У меня как-то всё время руки не доходили проверить :D

Интересно, почему всегда именно в 2 раза медленнее? :roll:

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 02.02.2005 (Ср) 0:33

Всем спасибо!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.02.2005 (Ср) 9:09

A.A.Z. писал(а):Подвержу слова Amed'а кодом :)
Код: Выделить всё
Debug.Print Timer - T
....
Debug.Print Timer - T
End Sub
Код: Выделить всё
Immediate:
0,03125
0,0625
Второй способ ровно в 2 раза медленнее :roll:
ЗЫ причем всегда :roll:


Вообще-то данный тест показывает что скорость выполнения обоими способами одна и та-же! Значение переменной T задается ведь один раз - в самом начале теста! Посмотрите внимательней - тогда станет понятно что данный тест, в данном случае, не показывает превосходства в скорости того или иного способа. Он показывает их равенство!
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.02.2005 (Ср) 9:16

Гы :)

А если сделать всё правильно, да ещё и интервал увеличить хотя бы до 10 млн, то получится, что второй способ на треть быстрее :)
Впрочем, в откомпилированном варианте отличия стираются...

Надо дизасмить :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.02.2005 (Ср) 9:29

Ух ты :)

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

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 02.02.2005 (Ср) 10:36

Вспоминается известная история про сравнение компиляторов :)

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 02.02.2005 (Ср) 10:47

Народ, а что будет быстрее в данном случае:
i/2 или
i*0.5 ? :roll:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.02.2005 (Ср) 11:22

Умножение быстрее, чем деление.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.02.2005 (Ср) 11:24

Компилятор, вообще-то, в данном случае должен соптимизировать - то бишь должно быть одинаково. И даже машинный код может получиться одинаковым...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.02.2005 (Ср) 12:04

Не-а, запросто может не получиться одинаковый код. Обратите внимание, деление производится на целое число, а умножение - на дробное :). Если только компилятор не настолько умен, что понимает, что /2 <=> *.5 ...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.02.2005 (Ср) 12:15

Это смотреть надо - я 100% гарантии не даю.

Просто помню как какую-то программу делал (на каком языке уже не помню!) дык в данной ситуации компилятор так и сработал...

Точнее тогда в данной ситуации (умножение на 0.5) множимое просто сдвигалось вправо на разряд (множимое было целым числом).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 11

    TopList  
cron