Помощь - Поиск - Пользователи - Календарь
Полная версия: Тест скорости обработки разных типов данных.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SHnur
Вот написал как-то я такой тестик .
Результатом работы будет файл с подробным описанием тестов и временем их исполнения в Сотых Долях Секунды.

Код

program Big_experiment;
{$N+}
uses crt, dos;
var resSingle : single;
   resDouble : double;
   resReal : real;
   resExtended : extended;
   n : longint;
   h , h1 , m , m1, s, s1 , hd , hd1 :extended;
   hw , h1w , mw , m1w, sw, s1w , hdw , hd1w :word;


{---}
function CalcTime:extended;
var res : extended;
begin
  res := 0;
  res := abs( (hd-hd1) + ((s*100)-(s1*100)) + ((m*6000)-(m1*6000)) + ((h*360000)-(h1*360000)));
  calctime := res;
end;
{---}
procedure exp(flag :byte;direction :boolean); {direction : true - left to right; false right to left}
var i  : longint;
   t : extended;
begin


  i := 1;
  repeat
     t:=(i*2)-1;
     if not(direction) then t := (n+1-t)*2-1;
     case flag of
        1 : resSingle := resSingle + 1 /(t*t);
        2 : resDouble := resDouble + 1 / (t*t);
        3 : resReal := resReal + 1 / (t*t);
        4 : resExtended := resExtended + 1 / (t*t);
     end;
     inc(i);
  until (i=n);


end;
{---}
{---}
var f : text;
  i : longint;
  nam : array[1..4] of string;

begin
  resSingle := 0;
  resDouble := 0;
  resReal := 0;
  resExtended :=0;
  nam[1] := 'Single';
  nam[2] := 'Double';
  nam[3] := 'Real';
  nam[4] := 'Extended';

  assign(f,'big_res.txt');
  rewrite(f);

  clrscr;

  n := 1000;
  repeat
     for i := 1 to 4 do begin
        writeln(f,nam[i] , '  n=',n);

        gettime(hw,mw,sw,hdw);
        h := hw; m := mw; s := sw; hd := hdw;

        exp(i,true);

        gettime(h1w,m1w,s1w,hd1w);
        h1 := h1w; m1 := m1w; s1 := s1w; hd1 := hd1w;
        case i of
           1 : writeln(f,'Left to right :',resSingle, ' with  ',CalcTime:2:0,' ss');
           2 : writeln(f,'Left to right :',resDouble, ' with  ',CalcTime:2:0,' ss');
           3 : writeln(f,'Left to right :',resReal, ' with  ',CalcTime:2:0,' ss');
           4 : writeln(f,'Left to right :',resExtended, ' with  ',CalcTime:2:0,' ss');
        end;

        writeln(nam[i] , '  ',CalcTime :2:0,' ss ');

        resSingle := 0;
        resDouble := 0;
        resReal := 0;
        resExtended :=0;

        gettime(hw,mw,sw,hdw);
        h := hw; m := mw; s := sw; hd := hdw;

        exp(i,false);

        gettime(h1w,m1w,s1w,hd1w);
        h1 := h1w; m1 := m1w; s1 := s1w; hd1 := hd1w;
        case i of
           1 : writeln(f,'Right to left',resSingle,' with ',CalcTime:2:0,' ss');
           2 : writeln(f,'Right to left',resDouble,' with ',CalcTime:2:0,' ss');
           3 : writeln(f,'Right to left',resReal,' with ',CalcTime:2:0,' ss');
           4 : writeln(f,'Right to left',resExtended,' with ',CalcTime:2:0,' ss');
        end;
        writeln(f,'Pi^2 / 8        :' , (pi*pi)/8);
        writeln(f);

        writeln(nam[i] , '  ',CalcTime :2:0,' ss ');
     end;
     writeln(n);
     n := n * 10;
  until (n= 1000000000);

  writeln;
  writeln('Detailed results was saved in BIG_RES.txt  . Thank you for using my test. (ss = sec/100)');
  readkey;
  close(f);
end.


Призываю всех отказаться от использования типа REAL , в связи с тем , что он примерно в 2 раза медленее остальных !
volvo
SHnur
А почему
Цитата
он примерно в 2 раза медленее остальных
знаешь? Дело все в том, что Real - это чуждый сопроцессору тип, и время, "съедаемое" преобразованием его в сопроцессорный тип, перекрывает ускорение (не добавляя при этом точности)... Вместо него лучше использовать Double...
SHnur
volvo , да , на сколько я знаю тип REAL приходится преобразоовать в тип EXTENDED и самое страшное (в смысле затрат времени) в разнице машинного представления этих двух типов в Паскале /

Real (6 байтов)
1-знаковый бит ,39 -битов Мантиссы ,8-битов порядка
Extended (10 байтов)
1 - знаковый бит , 15-битов порядка,1-постоянный бит,63 бита мантиссы

так вот основная затрата времени при преоюразовании REAL -> Extended приходится на перемещение битов мантиссы (так как порядок их расположения разный )
SHnur
Да , к стати эта прога показывает , что порядок вычисления имеет большое значение . Так в некоторых случаях вачисление (гормонического ряда) "с прва на лево" быстрее чем "с лева на право" .
volvo
SHnur
Цитата
на сколько я знаю тип REAL приходится преобразоовать в тип EXTENDED
Неправда. Real преобразуется в Double, как больший по размеру (6 байт -> 8 байт)
SHnur
Как учили меня , все типы подгоняются под EXTENDED .
Хотя , возможно те , кто меня учил , ошибались или я что-то перепутал ;)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.