Ламерский вопрос про скорость сравнения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Ламерский вопрос про скорость сравнения

Сообщение Yurich » 04.03.2006 (Сб) 11:16

Что будет проходить быстрее?
Sub ....
Dim a as Single, b as Single, c as Single, d as Single
' вариант1
If a<>b Then Exit Sub
IF c<>d Then Exit Sub
' вариант2
If a<>b Or c<>d then Exit Sub
end Sub
Для 4-х переменных разница в скорости, конечно, будет мизерная (или=0), а если подобных сранений десяток и более?
Я не стал проводить замеры, полагаясь на ваш великий опыт.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.03.2006 (Сб) 11:19

второй вроде бы. Потому что вместо jmp как в первом там будет or...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Amed » 04.03.2006 (Сб) 11:32

form.autoredraw=true

Код: Выделить всё
Option Explicit
Private t1 As Long, t2 As Long
Private i As Long
Private Const n As Long = 100000000

Private Sub Form_Load()
Me.Print chkA
Me.Print chkB
End Sub

Function chkA() As Long
t1 = Timer()
Dim a As Single, b As Single, c As Single, d As Single

For i = 1 To n
    If a <> b Then
        If c <> d Then a = 1
    End If
Next i

t2 = Timer()

chkA = t2 - t1
End Function

Function chkB() As Long
t1 = Timer()
Dim a As Single, b As Single, c As Single, d As Single

For i = 1 To n
    If a <> b Or c <> d Then a = 1
Next i

t2 = Timer()

chkB = t2 - t1
End Function


У меня, соответственно, 9 и 14.

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

Сообщение GSerg » 04.03.2006 (Сб) 11:39

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

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 04.03.2006 (Сб) 12:07

Я так понял, что скорость будет определяться количеством JMP-ов. Каждый "Or" увеличит их число на 1. Верно?
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

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

Сообщение GSerg » 04.03.2006 (Сб) 12:12

Скорость будет определяться... короче, short circuit в VB нет и разложение условия на разные If'ы даёт прирост скорости, да.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Amed » 04.03.2006 (Сб) 12:14

Причем реальный прирост, как видим, в полтора раза, вот.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 04.03.2006 (Сб) 12:16

Ребята, СЕНКС!
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2006 (Сб) 14:22

Amed писал(а):form.autoredraw=true

Код: Выделить всё
Option Explicit
Private t1 As Long, t2 As Long
Private i As Long
Private Const n As Long = 100000000

Private Sub Form_Load()
Me.Print chkA
Me.Print chkB
End Sub

Function chkA() As Long
t1 = Timer()
Dim a As Single, b As Single, c As Single, d As Single

For i = 1 To n
    If a <> b Then
        If c <> d Then a = 1
    End If
Next i

t2 = Timer()

chkA = t2 - t1
End Function

Function chkB() As Long
t1 = Timer()
Dim a As Single, b As Single, c As Single, d As Single

For i = 1 To n
    If a <> b Or c <> d Then a = 1
Next i

t2 = Timer()

chkB = t2 - t1
End Function


У меня, соответственно, 9 и 14.

Судью на мыло :!: :!:

Никто даже не заметил, что это
Код: Выделить всё
    If a <> b Then
        If c <> d Then a = 1
    End If


-- это совсем даже не
Код: Выделить всё
    If a <> b Or c <> d Then a = 1


, а на самом деле:
Код: Выделить всё
    If a <> b And c <> d Then a = 1
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2006 (Сб) 14:31

Теперь, внимание: настоящие результаты

Код: Выделить всё
34:       If a <> b Then
00401B33 D9 45 E8             fld         dword ptr [a]
00401B36 D8 5D E4             fcomp       dword ptr [b]
00401B39 DF E0                fnstsw      ax
00401B3B F6 C4 40             test        ah,40h
00401B3E 75 10                jne         Form1::chkA+80h (00401b50)
35:           If c <> d Then a = 1
00401B40 D9 45 E0             fld         dword ptr [c]
00401B43 D8 5D D8             fcomp       dword ptr [d]
00401B46 DF E0                fnstsw      ax
00401B48 F6 C4 40             test        ah,40h
00401B4B 75 03                jne         Form1::chkA+80h (00401b50)
00401B4D 89 4D E8             mov         dword ptr [a],ecx
34:       If a <> b Then
00401B50 8B 46 3C             mov         eax,dword ptr [esi+3Ch]
00401B53 83 C0 01             add         eax,1
00401B56 70 46                jo          $L43+27h (00401b9e)
00401B58 3D 00 75 2B 7D       cmp         eax,7D2B7500h
00401B5D 89 46 3C             mov         dword ptr [esi+3Ch],eax
00401B60 7E D1                jle         Form1::chkA+63h (00401b33)
36:       End If


Код: Выделить всё
49:       If a <> b And c <> d Then a = 1
00401C13 D9 45 E8             fld         dword ptr [a]
00401C16 D8 5D E4             fcomp       dword ptr [b]
00401C19 DF E0                fnstsw      ax
00401C1B F6 C4 40             test        ah,40h
00401C1E 75 10                jne         Form1::chkB+80h (00401c30)
00401C20 D9 45 E0             fld         dword ptr [c]
00401C23 D8 5D DC             fcomp       dword ptr [d]
00401C26 DF E0                fnstsw      ax
00401C28 F6 C4 40             test        ah,40h
00401C2B 75 03                jne         Form1::chkB+80h (00401c30)
00401C2D 89 4D E8             mov         dword ptr [a],ecx
00401C30 8B 46 3C             mov         eax,dword ptr [esi+3Ch]
00401C33 83 C0 01             add         eax,1
00401C36 70 46                jo          $L66+27h (00401c7e)
00401C38 3D 00 75 2B 7D       cmp         eax,7D2B7500h
00401C3D 89 46 3C             mov         dword ptr [esi+3Ch],eax
00401C40 7E D1                jle         Form1::chkB+63h (00401c13)


Убедитесь, что код совпадает байт-в-байт.

Short circuit в VB есть начиная с VB5.

Прироста от разворачивания кода нет ни на йоту.
Изображение

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

Сообщение GSerg » 04.03.2006 (Сб) 14:35

Код: Выделить всё
If MsgBox("Click OK", vbOK) = vbOK Or MsgBox("Click OK", vbOK) = vbOK Then MsgBox "Сколько было боксов?"
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Ennor » 04.03.2006 (Сб) 15:22

Код: Выделить всё
If Not (Conn Is Nothing) And ((Conn.State And adStateOpen) > 0) Then


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

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

Сейчас этот форум просматривают: Google-бот и гости: 38

    TopList