![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Быстрые функции
cyborg © (2004-07-24 19:44:00)Пишите сюда разные функции вычислений, будем оптимизировать и смотреть скорости.
miek (2004-07-25 18:49:00) [1]Главное - не забывать, что когда INC-рементируешь типизированный указатель, он реально увеличивается на X*(размер типа)...
OSokin (2004-07-25 17:47:00) [2]Почитай справку...
Zak3D[@Tm] (2004-07-25 17:06:00) [3]OSokin
Не уверен, что inc и dec работают быстрее...
OSokin (2004-07-25 16:58:00) [4]Многие об одной функции забывают...
inc(число, сколько прибавить) и dec(число, сколько убавить)
cyborg (2004-07-24 22:27:00) [5]
> [3] NailMan © (24.07.04 21:09)
Прогоняешь миллион функций несколько раз (10 хватит наверное) замеряя такты, минимальное полученное число - есть скорость.
wiz (2004-07-24 21:25:00) [6]2 Nailman:
единственная заметка к твоему бенчмарку - если у тебя компилер оптимизирует код, то он может много чего пропускать, т.к. по тексту результат CheckCollisionMUL дальше нигде не используется... (а если ты отключишь оптимизацию, то числа будут сильно заниженные)
Anatoly Podgoretsky (2004-07-24 21:21:00) [7]NailMan © (24.07.04 21:09) [3]
Зачем вычислять, используй в прямом виде, и результаты можно сравнивать, результаты для одного типа процесстовов, но с частотой 2 и 2.8 будут совпадать.
NailMan (2004-07-24 21:09:00) [8]RDTSC выдает такты процессора - их нескольконеудобно использовать(необходимо высчитать частоту процессора как разрешение). Лучше QueryPerfomanceCounter.
Я вот так делал в своем тесте:
Procedure TForm1.TestMUL;
var HPRes:Int64;
LastHPC:Int64;
HPC:int64;
i:integer;
v1,v2:td3dvector;
r1,r2:single;
HPS:Int64;
timeiter:extended;
begin
QueryPerformanceCounter(LastHPC);
Sleep(1000);
QueryPerformanceCounter(HPRes);
HPRes:=HPRes - LastHPC;
v1:=d3dxvector3(0,0,0); r1:=1;
v2:=d3dxvector3(1,1,1); r2:=1.1;
QueryPerformanceCounter(LastHPC);
For i:=0 to 1000000 do CheckCollisionMUL(v1,r1,v2,r2);
QueryPerformanceCounter(HPC);
hps:=hpc-lasthpc;
timeiter:= hps / 1000000;
Label2.Caption:=floattostrf(timeiter / HPRes * 1e9,fffixed,15,1)+' нс/итерация';
end;
---
WBR, NailMan aka 2:5020/3337.13
cyborg (2004-07-24 19:48:00) [9]Для измерения скоростей используйте функцию:
function GetCPUTick: int64; assembler;
asm
rdtsc
end;
или (для Delphi5 или меньше, котрые не понимают):
function GetCPUTick: int64; assembler;
asm
db 0fh,31h;
end;
Функция возвращает такты процессора.
cyborg (2004-07-24 19:45:00) [10][644] NailMan © (24.07.04 15:18)
Ха! интересные результаты получились на моем варианте тестилки:
алгоритмы поиска столкновения сфера-сфера(3D) на синглах:
алгоритм(полностью процедуру я привел выше):
sQ:=Sqr(v2.x-v1.x) + Sqr(v2.y-v1.y) + Sqr(v2.z-v1.z);
If sq<=((r1+r2)*(r1+r2)) then result:=true;
выдал результат на 1млн итераций: 55 нс/итерация
алгоритм:
sQ:=(v2.x-v1.x)*(v2.x-v1.x) + (v2.y-v1.y)*(v2.y-v1.y) + (v2.z-v1.z)*(v2.z-v1.z);
If sq<=((r1+r2)*(r1+r2)) then result:=true;
выдал результат на 1млн итераций: 27.2 нс/итерация
Проц AXP3000+(2100MHz), мозг 512 DDR400.
Результат без использования SQR быстрей в 2 раза чем с этой функцией.
А если модифицировать так:
If (v2.x-v1.x)*(v2.x-v1.x) + (v2.y-v1.y)*(v2.y-v1.y) + (v2.z-v1.z)*(v2.z-v1.z)<=((r1+r2)*(r1+r2)) then result:=true else result:=false;
то получается: 24.4 нс/итерация
Вот она где сила....
---
WBR, NailMan aka 2:5020/3337.13
--------------------------------------------------------------------------------
[646] cyborg © (24.07.04 19:05)
Попробуй ещё:
Result:=(v2.x-v1.x)*(v2.x-v1.x) + (v2.y-v1.y)*(v2.y-v1.y) + (v2.z-v1.z)*(v2.z-v1.z)<=((r1+r2)*(r1+r2));
Ещё одной проверкой меньше.