IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Тест скорости обработки разных типов данных., Тест на Гормоническом ряде .
SHnur
сообщение 10.01.2005 20:35
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской
Реальное имя: Шурик

Репутация: -  0  +


Вот написал как-то я такой тестик .
Результатом работы будет файл с подробным описанием тестов и временем их исполнения в Сотых Долях Секунды.

Код

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 раза медленее остальных !

Сообщение отредактировано: SHnur - 10.01.2005 20:38


--------------------
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2005 20:52
Сообщение #2


Гость






SHnur
А почему
Цитата
он примерно в 2 раза медленее остальных
знаешь? Дело все в том, что Real - это чуждый сопроцессору тип, и время, "съедаемое" преобразованием его в сопроцессорный тип, перекрывает ускорение (не добавляя при этом точности)... Вместо него лучше использовать Double...
 К началу страницы 
+ Ответить 
SHnur
сообщение 10.01.2005 21:02
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской
Реальное имя: Шурик

Репутация: -  0  +


volvo , да , на сколько я знаю тип REAL приходится преобразоовать в тип EXTENDED и самое страшное (в смысле затрат времени) в разнице машинного представления этих двух типов в Паскале /

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

так вот основная затрата времени при преоюразовании REAL -> Extended приходится на перемещение битов мантиссы (так как порядок их расположения разный )


--------------------
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
SHnur
сообщение 10.01.2005 21:07
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской
Реальное имя: Шурик

Репутация: -  0  +


Да , к стати эта прога показывает , что порядок вычисления имеет большое значение . Так в некоторых случаях вачисление (гормонического ряда) "с прва на лево" быстрее чем "с лева на право" .


--------------------
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.01.2005 21:16
Сообщение #5


Гость






SHnur
Цитата
на сколько я знаю тип REAL приходится преобразоовать в тип EXTENDED
Неправда. Real преобразуется в Double, как больший по размеру (6 байт -> 8 байт)
 К началу страницы 
+ Ответить 
SHnur
сообщение 10.01.2005 21:24
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской
Реальное имя: Шурик

Репутация: -  0  +


Как учили меня , все типы подгоняются под EXTENDED .
Хотя , возможно те , кто меня учил , ошибались или я что-то перепутал ;)


--------------------
Двадцать пятый час в сутках может появиться всего лишь из-за небольшой ошибки в программе.
Чтобы не воспользоваться сумасшедшими возможностями, нужно быть идиотом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 17:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"