{{notification.text}}

MirGames

06.07.09 17:31
0
Дабы не устраивать оффтоп - написал простенькую прогу для проверки скорости вычисления Sin - при помощи стандартной функции и таблицы. Последний способ действительно быстрее (у меня выдает 1100 и 840 соответственно).
Код

uses
  windows;

function GetTimer: Integer;
  var
    T, F: LARGE_INTEGER;
begin
  QueryPerformanceFrequency(int64(F));
  QueryPerformanceCounter(int64(T));
  Result:=Trunc(1000*T.QuadPart/F.QuadPart);
end;

var
  I: Integer;
  S: Single;
  Start: Integer;
  Table: array[0..1000] of Single;

begin
  Randomize;
  for I := 0 to 1000 do
    Table[I] := Sin(I/1000);
  Writeln('Let''s go!');
  Readln;
  Start := GetTimer;
  for I := 0 to 10000000 do
    S := S + Sin(Random);
  Writeln('Simple method: ', GetTimer - Start, ' ', S);
  Start := GetTimer;
  for I := 0 to 10000000 do
    S := S + Table[Round(Random*1000)];
  Writeln('Freak method: ', GetTimer - Start, ' ', S);
end.
#1
аксакал
06.07.09 17:39
0
visual
А если хочу от 0 до 2*pi с шагом хотя бы в одну тысячную градуса и точностью до 6 знаков после запятой? ;)
Отредактировано: 06.07.09 17:40
#2
06.07.09 17:42
0
XProger
я думаю надо делать таблицу побольше)))и всётаки такие извращения врядли понадобятся)))мне кажется это предел извращения)))
#3
Почётный лектор
06.07.09 17:48
0
На компах нынешних по-моему табличная тригонометрия не актуальна (три десятых секунды на 10000000 вызовов - смешно), на прочих платформах - в зависимости от. Например, если остается лишняя память, можно чуть ускориться так - на ARM'ах, к примеру, весьма дорогой флот, любые операции с ним не жгут. Там разница будет больше. Но и память там тоже жалко, потому что мало :)
Надо искать баланс. Например, часто линейная интерполяция может заменить сферическую (для игр обычно такие приближения допустимы), вообще избавив от тригонометрии...
#4
06.07.09 17:48
0
XProger
Тогда табличный метод выдает уже 1800 ms и жестоко проигрывает в скорости. Кстати, в реальности в нем еще будет деление на 2pi, так что все будет еще хуже.
Код
uses
  windows;

function GetTimer: Integer;
  var
    T, F: LARGE_INTEGER;
begin
  QueryPerformanceFrequency(int64(F));
  QueryPerformanceCounter(int64(T));
  Result:=Trunc(1000*T.QuadPart/F.QuadPart);
end;

const
  SIZE = 360*1000;
var
  I: Integer;
  S: Single;
  Start: Integer;
  Table: array[0..SIZE-1] of Single;

begin
  Randomize;
  for I := 0 to SIZE-1 do
    Table[I] := Sin(2*pi*I/SIZE);
  Writeln('Let''s go!');
  Readln;
  Start := GetTimer;
  for I := 0 to 10000000 do
    S := S + Sin(Random*2*pi);
  Writeln('Simple method: ', GetTimer - Start, ' ', S);
  Start := GetTimer;
  for I := 0 to 10000000 do
    S := S + Table[Trunc(Random*SIZE)];
  Writeln('Freak method: ', GetTimer - Start, ' ', S);
end.
Отредактировано: 06.07.09 17:49
#5
аксакал
06.07.09 17:48
0
Что и требовалось доказать )
#6
Почётный лектор
06.07.09 17:54
0
Цитата(visual @ Сегодня, 13:48)
[snapback]95905[/snapback]
в реальности в нем еще будет деление на 2pi

Чур меня - математику в градусах делать :blink:!
#7
06.07.09 18:46
0
заменяем round на trunc и вуаля!

1420/1390
#8
Программир Всия Руси!
06.07.09 22:21
0
Код на C++ вызывает sin меньше чем за 1 такт как правило... На дельфи может таблицы и быстрее в виду убого компилятора.
#9
Почётный лектор
06.07.09 22:29
0
DRON
МЕНЬШЕ ЧЕМ ЗА 1 ТАКТ?
OMG. Это уничтожает все мое представление об устройстве мира.
#10
06.07.09 22:41
0
DRON (OffTop: я тестировал это все в free pascal'е, а не в дельфи, как тебе показалось)
Цитата
Код на C++ вызывает sin меньше чем за 1 такт как правило...

Ссылку на источник?
Отредактировано: 06.07.09 22:44
#11
Программир Всия Руси!
06.07.09 22:55
0
Universal, visual
Я имел в виду Core 2 процессоры и более поздние :)
Меньше чем за 1 такт может быть только в особых условиях, я не говорю что это всегда так.
Погуглите, современные процессоры так делают.
Завтра уточню у знающего чела, он тесты делал :) может я че то напутал, но вроде нет )
P.S.
такт ни есть квант процессорного времени. <--- БРЕД написал :))))
Отредактировано: 06.07.09 23:16
#12
Почётный лектор
07.07.09 00:53
0
Пожалуй, тему пора закрывать - скатилась в глубокий неадекват.
#13
07.07.09 04:09
0
Woolf
Цитата
заменяем round на trunc и вуаля!

1420/1390

а у меня зачастую trunc медленнее работает, сам удивился (C2D E6420)
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}