Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Тест скорости компиляторов

1.9K
12 мая 2007 года
AxXxB
229 / / 21.11.2006
В этом сообщении от Залетина Виталия есть ссылка на страничку, где тестируются на скорость несколько компиляторов Бейсика. При этом используется такой вот бенчмарк:
Код:
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 (в форме):
Код:
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

, а вот так для 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

Интересно, что в коде для 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

При запуске исходника через 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

Интерпретированный вариант был выполнен за ~24 секунды, приложение (в полном экране) - ~10 сек (у автора - 56!).

Интересно узнать результат на Ваших компьютерах, а также результат выполнения данного (в смысле сконвертированного) кода другими компиляторами: C, C++, Delphi и т. д.

ЗЫ. Кто не может откомпилировать приведенный выше код, во вложении архивы с exe'шниками.
10
12 мая 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: 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.

На условные директивы не обращайте внимания - они только для уменьшения объёма exe-шника (используются модули Единой среды/KOL) и на скорость теста влияния не оказывают.

У меня приведённый код выполняется в среднем за 0.78 с. Если закомментировать строчку с Trunc и раскомментировать с целочисленным делением, скорость возрастает до 0.32 с. От комментариев воздержусь ;)

Цитата: AxXxB
ЗЫ. Кто не может откомпилировать приведенный выше код, во вложении архивы с exe'шниками.


То же для Дельфи.

1.9K
13 мая 2007 года
AxXxB
229 / / 21.11.2006
Цитата: 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++).

257
13 мая 2007 года
kosfiz
1.6K / / 18.09.2005
Celeron 1.7GHz
QB - 16.28125 сек.
VB - 14.89 сек.
Delphi - 1.14 сек.
комп очень нагружен был. пробовал потом на чистой винде показания были лучше
QB ~ 13 сек
VB ~ 10 сек
Delphi - 0.98 сек. - точно помню.
241
24 мая 2007 года
Sanila_san
1.6K / / 07.06.2005
На РСДН был интересный набор тестов. Любопытно получилось.

Я попробую протестировать дома на VB.NET, C#, Delphi w32 и Delphi.NET, ка сделаю - выложу. :)
6.4K
07 июня 2007 года
Host
122 / / 22.09.2005
Цитата: 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]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог