Идёт загрузка страницы...

htp://aptem.net.ru






На главную страничку учебника Visual Basic

Оптимизация скорости

Существует 3 типа скорости:

  1. Реальная скорость программы - это скорость, с которой работает её код.
  2. Скорость работы интерфейса с той точки зрения, с которой её оценивает пользователь, выражается видимых признаках работы программы, т.е. в том, насколько быстро элементы окна приложения реагируют на действия пользователя.
  3. Субъективная скорость определяется впечатлением о скорости работы программы, которое возникает у пользователя. Многие знают, как может раздражать медленно реагирующая программа, и как приятно работать с программой, которая не заставляет себя ждать.

Мы с вами рассмотрим первый тип. Ниже я привёл данные для сравнения скорости выполнения некоторых операций. Я думаю эти данные пригодятся программистам на Visual Basic. Для сравнения времени на выполнение некоторой операции я использовал API функцию Windows - GetTickCount. Она возвращает количество милисекунд (1/1000 секунды), прошедших с момента запуска Windows. Разность показаний до выполнения некоторого кода и после и будет являться временем, которое ушло на выполнение этого кода. При вычислении времени брались средние значения. Общая схема тестирования была такова: записывались 2 куска кода, затем один из них закомментировывался и вычислялась скорость работы другого куска. Затем наоборот.

Всё тестировалось на: Visual Basic 5 Ent. Ed. и машине Pentium 225 MMX с 81 RAM.

Объявление API функции:

Private Declare Function GetTickCount Lib "kernel32" () As Long

1. Возведение в степень

Dim ms As Long
Dim c As Long
Dim temp As Long
ms = GetTickCount
'================
For c = 1 To 1000000
temp = 2 ^ 8 ' 4106 мс
temp = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 ' 427 мс
Next c
'================
Form1.Caption = (GetTickCount - ms)

2. Функции Mid и Mid$

Dim ms As Long
Dim
c As Long
Dim
temp As String
ms = GetTickCount
'================
For c = 1 To 100000
temp = Mid("Stroka", 2, 2) ' 736 мс
temp = Mid$("Stroka", 2, 2) ' 325 мс
Next c
'================
Form1.Caption = (GetTickCount - ms)

3. Функции Left и Left$

Dim ms As Long
Dim
c As Long
Dim
temp As String
ms = GetTickCount
'================
For c = 1 To 100000
temp = Left("Stroka", 3) ' 550 мс
temp = Left$("Stroka", 3) ' 211 мс
Next c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: используйте функции со знаком $. Функции без оного возвращают тип Variant, поэтому и работают медленнее.

4. Сравнение быстроты доступа к свойству и к переменной

Dim ms As Long
Dim
c As Long
Dim
temp As String
Dim
tCapt As String
ms = GetTickCount
tCapt = Form1.Caption
'================
For c = 1 To 100000
temp = Form1.Caption ' 3640 мс
temp = tCapt ' 183 мс !!!
Next c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: Когда вам нужно добраться к свойству в цикле, и которое не изменяется, то воспользуйтесь переменной! Присвойте ей значение до цикла.

5. Сравнение скорости Variant и Long перемынных

Dim ms As Long
Dim
c As Long
Dim
temp As Variant
ms = GetTickCount
'================
For c = 1 To 1000000
c = c ' 379 мс
Next c

For temp = 1 To 1000000
temp = temp ' 539 мс
Next temp
'================
Form1.Caption = (GetTickCount - ms)

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

6. Сравнение скорости работы строк фикс. длины и строк произв. длины

Dim ms As Long
Dim
c As Long
Dim
temp1 As String * 10
Dim temp2 As String
ms = GetTickCount
'================
For c = 1 To 1000000
temp1 = "String1" & temp1
temp1 = "String2" ' 5400 мс
Next c

For c = 1 To 1000000
temp2 = "String1" & temp2
temp2 = "String2" ' 4039 мс
Next c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: Строковые переменные фикс. длины медленнее, чем произвольной.

7. ="" и len(...)=0

Dim ms As Long
Dim
c As Long
Dim
temp1 As String
ms = GetTickCount
'================
For c = 1 To 1000000
If temp1 = "" Then
c = c ' 900 мс
End If

If
Len(temp1) = 0 Then
c = c ' 740 мс
End If
Next
c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: Для проверки строк на вшивость (""), используйте функцию Len.

8. Move и изменение Left,Top,Width и Height

Dim ms As Long
Dim
c As Long
ms = GetTickCount
'================
For c = 1 To 10000
Form1.Move 0, 0, 1000, 1000 ' 2545 мс

Form1.Left = 0
Form1.Top = 0
Form1.Width = 1000
Form1.Height = 1000 ' 3048 мс
Next c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: Для изменения положения или размеров формы используйте метод Move, он работает быстрее, тем более при изменении отдельных свойств форма будет проскальзывать по экрану.

9. Сравнение метода PaintPicture и API ф-ции BitBlt

Dim ms As Long
Dim
c As Long
ms = GetTickCount
'================
For c = 1 To 8000

Form1.PaintPicture Picture1, 0, 0, 100, 100, _
0, 0, 100, 100, vbSrcCopy ' 9102 мс

BitBlt Form1.hdc, 0, 0, 100, 100, _
Picture1.hdc, 0, 0, vbSrcCopy ' 6303 мс

Next c
'================
Form1.Caption = (GetTickCount - ms)

Вывод: API функции работают быстрее. И это факт. Так что там, где нужна скорость, на помощь приходят API функции.

Примечание: Вообще-то здесь сравнение PaintPicture и BitBlt не совсем удачно, т.к. аналогом функции PaintPicture является API StretchBlt. Но скорость её работы в данном случае такая же, как и у BitBlt.

10. Visual Basic 5 vs Borland C++ Builder 4!

Недавно я решил испробовать BC++4 на скорость, сравнив его с VB5. Результаты меня просто ошеломили! Мой брат, программирующий на BC++4 уже подумывает о переходе на VB5! Вот какие результаты я получил:

1. Скорость API функции SetPixel на заполнение формы (800x600) чёрными точками.

Код на Borland C++ 4 Builder:

WindowState = wsMaximized;
int a = GetTickCount();
for(int z = 0; z < 3; z++)
for(int y = 0; y < 600; y++)
for(int x = 0; x < 800; x++)
SetPixel(Canvas->Handle, x, y, 0);
Caption = IntToStr( GetTickCount() - a );

Код на Visual Basic 5:

Form1.WindowState = vbMaximized
Dim a, z, x, y As Long
a = GetTickCount
For z = 1 To 3
For y = 0 To 600
For x = 0 To 800
SetPixel Form1.hdc, x, y, 0
Next x
Next y
Next z
Form1.Caption = GetTickCount - a

2. Скорость вычисления синуса числа. (в VB Double, в BC++ float).

Код на Borland C++ 4 Builder:

int a = GetTickCount();
float b;
for(int x = 0; x < 1000000; x++)
b = sin(x);
Caption = IntToStr( GetTickCount() - a );

Код на Visual Basic 5:

Dim a, c As Long
c = GetTickCount
Dim b As Double
For a = 0 To 1000000
b = Sin(a)
Next a
Form1.Caption = (GetTickCount - c)

Таблица с результатами:

№ Теста
Время выполнения кода в Visual Basic
Время выполнения кода в Borland C++ Builder 4
1
12380! мс
12790 мс
2
1440! мс
1806 мс

На главную страничку учебника Visual Basic