10 REM БЕНЧМАРК
20 PRINT "НАЧАЛО"
30 K=0
40 Dim M(5)
50 K=K+l
60 A=K/2*3+4-5
70 G0SUB 140
80 For L=1 To 5
90 M(L)=A
100 Next L
110 If K<90000000 THEN 50
120 PRINT "КОНЕЦ"
130 End
140 Return
Тест скорости компиляторов
этом сообщении от Залетина Виталия есть ссылка на страничку, где тестируются на скорость несколько компиляторов Бейсика. При этом используется такой вот бенчмарк:
Код был подогнан под разные версии компиляторов. Меня интересовали те, которые были у меня: VB6 (5.12 секунд у автора) и QB4.5 (56.13 секунд у автора). Вот так выглядел код для VB (в форме):
, а вот так для QB
Интересно, что в коде для VB автор объявил переменные как Long и Integer, а в QB - оставил Variant
Я решил потестить этот код на своем компьютере, который послабее компьютера автора статьи. (Athlon 1200MHz) Подредактил для пущей скорости код. Для VB получилось такое (в модуле):
При запуске исходника через VB клавишей F5 получилось 12 с лишком секунд. Скомпилированное приложение (Native-code, Speed Optimize, Additional optimize -> Все галочки) справилось за 6 секунд.
Код для QB получился таким:
Интерпретированный вариант был выполнен за ~24 секунды, приложение (в полном экране) - ~10 сек (у автора - 56!).
Интересно узнать результат на Ваших компьютерах, а также результат выполнения данного (в смысле сконвертированного) кода другими компиляторами: C, C++, Delphi и т. д.
ЗЫ. Кто не может откомпилировать приведенный выше код, во вложении архивы с exe'шниками.
В
Код:
Код был подогнан под разные версии компиляторов. Меня интересовали те, которые были у меня: VB6 (5.12 секунд у автора) и QB4.5 (56.13 секунд у автора). Вот так выглядел код для VB (в форме):
Код:
Rem БЕНЧМАРК
Dim K As Long, L As Long, A As Long
Dim M(5) As Long
Private Sub Command1_Click()
Print "Start"
start = Timer
K = 0
50 K = K + L
A = K / 2 * 3 + 4 - 5
GoSub 140
For L = 1 To 5
M(L) = A
Next L
If K < 90000000 Then GoTo 50
finis = Timer - start
Print "End - " + Str$(finis)
Exit Sub
140 Return
End Sub
Dim K As Long, L As Long, A As Long
Dim M(5) As Long
Private Sub Command1_Click()
Print "Start"
start = Timer
K = 0
50 K = K + L
A = K / 2 * 3 + 4 - 5
GoSub 140
For L = 1 To 5
M(L) = A
Next L
If K < 90000000 Then GoTo 50
finis = Timer - start
Print "End - " + Str$(finis)
Exit Sub
140 Return
End Sub
, а вот так для QB
Код:
REM БЕНЧМАРК
PRINT "НАЧАЛО"
start = TIMER
K = 0
DIM M(5)
t50:
K = K + L
A = K / 2 * 3 + 4 - 5
GOSUB g140
FOR L = 1 TO 5
M(L) = A
NEXT L
IF K < 90000000 THEN GOTO t50
finis = TIMER - start
PRINT "КОНЕЦ - " + STR$(finis)
INPUT ; q
END
g140:
RETURN
PRINT "НАЧАЛО"
start = TIMER
K = 0
DIM M(5)
t50:
K = K + L
A = K / 2 * 3 + 4 - 5
GOSUB g140
FOR L = 1 TO 5
M(L) = A
NEXT L
IF K < 90000000 THEN GOTO t50
finis = TIMER - start
PRINT "КОНЕЦ - " + STR$(finis)
INPUT ; q
END
g140:
RETURN
Интересно, что в коде для VB автор объявил переменные как Long и Integer, а в QB - оставил Variant
Я решил потестить этот код на своем компьютере, который послабее компьютера автора статьи. (Athlon 1200MHz) Подредактил для пущей скорости код. Для VB получилось такое (в модуле):
Код:
Option Explicit
Sub Main()
Dim K As Long, L As Long, A As Long, TiMe As Long, M(5) As Long
MsgBox "Эта программа проверит быстроту VB. Нажмите OK и подождите"
TiMe = Timer
50 K = K + L
A = K / 2 * 3 + 4 - 5
GoSub 140
For L = 1 To 5
M(L) = A
Next
If K < 90000000 Then GoTo 50
MsgBox "Код выполнен за " + Str(Timer - TiMe) + " секунд!"
End
140 Return
End Sub
Sub Main()
Dim K As Long, L As Long, A As Long, TiMe As Long, M(5) As Long
MsgBox "Эта программа проверит быстроту VB. Нажмите OK и подождите"
TiMe = Timer
50 K = K + L
A = K / 2 * 3 + 4 - 5
GoSub 140
For L = 1 To 5
M(L) = A
Next
If K < 90000000 Then GoTo 50
MsgBox "Код выполнен за " + Str(Timer - TiMe) + " секунд!"
End
140 Return
End Sub
При запуске исходника через VB клавишей F5 получилось 12 с лишком секунд. Скомпилированное приложение (Native-code, Speed Optimize, Additional optimize -> Все галочки) справилось за 6 секунд.
Код для QB получился таким:
Код:
DIM M(5) AS LONG
PRINT "Эта программа проверит скорость QuickBasic. Выполнение кода..."
TIME& = TIMER
50 K& = K& + L%
A& = K& / 2 * 3 + 4 - 5
GOSUB 140
FOR L% = 1 TO 5
M&(L%) = A&
NEXT L%
IF K& < 90000000 GOTO 50
PRINT "Код выполнен за" + STR$(TIMER - TIME&) + " cекунд!"
BEEP
SLEEP
END
140 RETURN
PRINT "Эта программа проверит скорость QuickBasic. Выполнение кода..."
TIME& = TIMER
50 K& = K& + L%
A& = K& / 2 * 3 + 4 - 5
GOSUB 140
FOR L% = 1 TO 5
M&(L%) = A&
NEXT L%
IF K& < 90000000 GOTO 50
PRINT "Код выполнен за" + STR$(TIMER - TIME&) + " cекунд!"
BEEP
SLEEP
END
140 RETURN
Интерпретированный вариант был выполнен за ~24 секунды, приложение (в полном экране) - ~10 сек (у автора - 56!).
Интересно узнать результат на Ваших компьютерах, а также результат выполнения данного (в смысле сконвертированного) кода другими компиляторами: C, C++, Delphi и т. д.
ЗЫ. Кто не может откомпилировать приведенный выше код, во вложении архивы с exe'шниками.
Цитата: AxXxB
Хоть меряться кое-чем и неправильно, мимо теста компиляторов пройти не могу. ;)
Цитата: AxXxB
Я решил потестить этот код на своем компьютере, который послабее компьютера автора статьи. (Athlon 1200MHz)
Athlon 64 3000+, 2 ГГц:
- QB - 3.13 c.
- VB - 4.06 с.
Цитата: AxXxB
Интересно узнать результат на Ваших компьютерах, а также результат выполнения данного (в смысле сконвертированного) кода другими компиляторами: C, C++, Delphi и т. д.
Код:
program DelphiTest;
uses
{$IFDEF Release}
HeapMM,
{$ENDIF}
Windows;
procedure EmptyProc;
begin
end;
procedure MsgBox(Time: Cardinal); // совместимость с Windows.GetTickCount
var
T: string;
begin
Str(Time/1000:0:2, T);
MessageBox(0, Pointer('Код выполнился за ' + T + ' секунд'), nil, MB_ICONINFORMATION);
end;
var
K, L, A: Integer;
Time: Cardinal; // совместимость с Windows.GetTickCount
M: array[1..5] of Integer;
begin
{$IFDEF Release}
UseErrorMessageBox;
{$ENDIF}
Time := GetTickCount;
repeat
Inc(K, Length(M)); // L в Delphi в данной точке не определена
// A := K div 2 * 3 + 4 - 5;
A := Trunc(K / 2 * 3 + 4 - 5);
EmptyProc;
for L := 1 to 5 do
M[L] := A;
until K >= 90000000;
MsgBox(GetTickCount - Time);
end.
uses
{$IFDEF Release}
HeapMM,
{$ENDIF}
Windows;
procedure EmptyProc;
begin
end;
procedure MsgBox(Time: Cardinal); // совместимость с Windows.GetTickCount
var
T: string;
begin
Str(Time/1000:0:2, T);
MessageBox(0, Pointer('Код выполнился за ' + T + ' секунд'), nil, MB_ICONINFORMATION);
end;
var
K, L, A: Integer;
Time: Cardinal; // совместимость с Windows.GetTickCount
M: array[1..5] of Integer;
begin
{$IFDEF Release}
UseErrorMessageBox;
{$ENDIF}
Time := GetTickCount;
repeat
Inc(K, Length(M)); // L в Delphi в данной точке не определена
// A := K div 2 * 3 + 4 - 5;
A := Trunc(K / 2 * 3 + 4 - 5);
EmptyProc;
for L := 1 to 5 do
M[L] := A;
until K >= 90000000;
MsgBox(GetTickCount - Time);
end.
На условные директивы не обращайте внимания - они только для уменьшения объёма exe-шника (используются модули Единой среды/KOL) и на скорость теста влияния не оказывают.
У меня приведённый код выполняется в среднем за 0.78 с. Если закомментировать строчку с Trunc и раскомментировать с целочисленным делением, скорость возрастает до 0.32 с. От комментариев воздержусь ;)
Цитата: AxXxB
ЗЫ. Кто не может откомпилировать приведенный выше код, во вложении архивы с exe'шниками.
То же для Дельфи.
Цитата: Freeman
Athlon 64 3000+, 2 ГГц:
- QB - 3.13 c.
- VB - 4.06 с.
А вот это интересно. QB оказался быстрее, чем VB :). В чистом досе он был бы еще быстрее. Все, перехожу на QuickBasic
Цитата: Freeman
У меня приведённый код выполняется в среднем за 0.78 с. Если закомментировать строчку с Trunc и раскомментировать с целочисленным делением, скорость возрастает до 0.32 с. От комментариев воздержусь ;)
~0.70 секунд. Интересно, насколько быстрым окажется C (или C++).
QB - 16.28125 сек.
VB - 14.89 сек.
Delphi - 1.14 сек.
комп очень нагружен был. пробовал потом на чистой винде показания были лучше
QB ~ 13 сек
VB ~ 10 сек
Delphi - 0.98 сек. - точно помню.
РСДН был интересный набор тестов. Любопытно получилось.
Я попробую протестировать дома на VB.NET, C#, Delphi w32 и Delphi.NET, ка сделаю - выложу. :)
На
Я попробую протестировать дома на VB.NET, C#, Delphi w32 и Delphi.NET, ка сделаю - выложу. :)
Цитата: AxXxB
Интересно, насколько быстрым окажется C (или C++).
Debug: 1.046 сек.
Relise: 34 мсек.
(Pentium 4 3.00GHz)
Код:
[SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2] Proc([/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] _tmain([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] argc, _TCHAR* argv[])[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]long[/COLOR][/SIZE][SIZE=2] K = 0, L = 0, A = 0, M[5];[/SIZE]
[SIZE=2]DWORD TiMe;[/SIZE]
[SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][SIZE=2] szBuff[255] = [/SIZE][SIZE=2][COLOR=#800000]""[/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]MessageBox(NULL, [/SIZE][SIZE=2][COLOR=#800000]"Эта программа проверит быстроту C++. Нажмите OK и подождите"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#800000]"Test"[/COLOR][/SIZE][SIZE=2], NULL);[/SIZE]
[SIZE=2]TiMe = GetTickCount();[/SIZE]
[SIZE=2]start:[/SIZE]
[SIZE=2]K = K + L;[/SIZE]
[SIZE=2]A = K / 2 * 3 + 4 - 5;[/SIZE]
[SIZE=2]Proc();[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]( ; L < 5; L++) M[L] = A; [/SIZE]
[SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][SIZE=2] (K < 90000000) [/SIZE][SIZE=2][COLOR=#0000ff]goto[/COLOR][/SIZE][SIZE=2] start;[/SIZE]
[SIZE=2]sprintf(szBuff, [/SIZE][SIZE=2][COLOR=#800000]"Код выполнен за %d милисекунд!"[/COLOR][/SIZE][SIZE=2],(GetTickCount() - TiMe));[/SIZE]
[SIZE=2]MessageBox(NULL, szBuff, [/SIZE][SIZE=2][COLOR=#800000]"Test"[/COLOR][/SIZE][SIZE=2], NULL);[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] 0;[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] _tmain([/SIZE][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][SIZE=2] argc, _TCHAR* argv[])[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000ff]long[/COLOR][/SIZE][SIZE=2] K = 0, L = 0, A = 0, M[5];[/SIZE]
[SIZE=2]DWORD TiMe;[/SIZE]
[SIZE=2][COLOR=#0000ff]char[/COLOR][/SIZE][SIZE=2] szBuff[255] = [/SIZE][SIZE=2][COLOR=#800000]""[/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]MessageBox(NULL, [/SIZE][SIZE=2][COLOR=#800000]"Эта программа проверит быстроту C++. Нажмите OK и подождите"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#800000]"Test"[/COLOR][/SIZE][SIZE=2], NULL);[/SIZE]
[SIZE=2]TiMe = GetTickCount();[/SIZE]
[SIZE=2]start:[/SIZE]
[SIZE=2]K = K + L;[/SIZE]
[SIZE=2]A = K / 2 * 3 + 4 - 5;[/SIZE]
[SIZE=2]Proc();[/SIZE]
[SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][SIZE=2]( ; L < 5; L++) M[L] = A; [/SIZE]
[SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][SIZE=2] (K < 90000000) [/SIZE][SIZE=2][COLOR=#0000ff]goto[/COLOR][/SIZE][SIZE=2] start;[/SIZE]
[SIZE=2]sprintf(szBuff, [/SIZE][SIZE=2][COLOR=#800000]"Код выполнен за %d милисекунд!"[/COLOR][/SIZE][SIZE=2],(GetTickCount() - TiMe));[/SIZE]
[SIZE=2]MessageBox(NULL, szBuff, [/SIZE][SIZE=2][COLOR=#800000]"Test"[/COLOR][/SIZE][SIZE=2], NULL);[/SIZE]
[SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][SIZE=2] 0;[/SIZE]
[SIZE=2]}[/SIZE]