Тема: Benchmark
Показать сообщение отдельно
  #13  
Старый 08.01.2012, 23:09
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Вы не то тестировали. Ни для кого не секрет, что вывод через COUT в студии невероятно медленный. Я провел другой тест на вашем же примере:
Делфа:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
program D7Benchmark;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, DateUtils;
 
const
  REPEAT_NUM = 10000000;
 
function Fact(N: integer):integer;
begin
    if (N = 1) or (N = 0) then
        Result := 1
    else
        Result := N * Fact(N - 1);
end;
 
type tin = array [0..0]of integer;
var
  i : integer;
  T1 : TDateTime;
  j:^tin;
 
begin
  getmem(j,100*sizeof(integer));
  T1 := Now;
  for i := 0 to REPEAT_NUM-1 do
    j[i mod 100]:=Fact(i mod 2 + 14);
  WriteLn('Num of calculatings:');
  WriteLn(REPEAT_NUM);
  WriteLn('Time of working is:');
  WriteLn(MilliSecondsBetween(Now, T1));
  WriteLn('PressEnter');
  ReadLn;
end.
Студия:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <iostream>
#include <ctime>
 
using namespace std;
 
const int REPEAT_NUM = 10000000;
int Fact(int N);
 
int _tmain(int argc, _TCHAR* argv[])
{
    long c;
    int i,*j;
    j = new int[100];
    c=clock();
       for (i = 0; i < REPEAT_NUM; i++)
        j[i%100] = Fact(i%2+14);
 
    c=clock()-c ;
    cout << "Time is: " << c << "\n";
    cout << "Press ENTER..";
    cin >> i;
    return 0;
}
 
int Fact(int N)
{
    if (N == 1 || N == 0)
        return 1;
    else
        return N * Fact(N - 1);
}
GCC у меня нет, его не тестил.
Результат:
Делфи ХЕ - 1.7 сек, Студия - 0.9 сек.
Такие сложности (с остатком от деления и записью в массив) для обмана оптимизации студии.
Было так:
Код:
1
2
for i:=1 to REPEAT_NUM do
 Fact(15);
Делфа такой код честно выполняла, студия же нагло пропустила.
Потом сделал так:
Код:
1
2
for i:=0 to REPEAT_NUM-1 do
 j[i mod 100]:=Fact(15);
Делфа опять честно выполняла, а студия посчитала один раз и потом вписала во все ячейки, смотрел дизасом (время было ~50мс).
В результате сделал такой извратский тест.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием