Текущий архив: 2004.11.21;
Скачать: CL | DM;
ВнизБыстрые функции Найти похожие ветки
← →
cyborg © (2004-07-24 19:44) [0]Пишите сюда разные функции вычислений, будем оптимизировать и смотреть скорости.
← →
cyborg © (2004-07-24 19:45) [1][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));
Ещё одной проверкой меньше.
← →
cyborg © (2004-07-24 19:48) [2]Для измерения скоростей используйте функцию:
function GetCPUTick: int64; assembler;
asm
rdtsc
end;
или (для Delphi5 или меньше, котрые не понимают):
function GetCPUTick: int64; assembler;
asm
db 0fh,31h;
end;
Функция возвращает такты процессора.
← →
NailMan © (2004-07-24 21:09) [3]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
← →
Anatoly Podgoretsky © (2004-07-24 21:21) [4]NailMan © (24.07.04 21:09) [3]
Зачем вычислять, используй в прямом виде, и результаты можно сравнивать, результаты для одного типа процесстовов, но с частотой 2 и 2.8 будут совпадать.
← →
wiz © (2004-07-24 21:25) [5]2 Nailman:
единственная заметка к твоему бенчмарку - если у тебя компилер оптимизирует код, то он может много чего пропускать, т.к. по тексту результат CheckCollisionMUL дальше нигде не используется... (а если ты отключишь оптимизацию, то числа будут сильно заниженные)
← →
cyborg © (2004-07-24 22:27) [6]
> [3] NailMan © (24.07.04 21:09)
Прогоняешь миллион функций несколько раз (10 хватит наверное) замеряя такты, минимальное полученное число - есть скорость.
← →
OSokin (2004-07-25 16:58) [7]Многие об одной функции забывают...
inc(число, сколько прибавить) и dec(число, сколько убавить)
← →
Zak3D[@Tm] © (2004-07-25 17:06) [8]OSokin
Не уверен, что inc и dec работают быстрее...
← →
OSokin (2004-07-25 17:47) [9]Почитай справку...
← →
miek © (2004-07-25 18:49) [10]Главное - не забывать, что когда INC-рементируешь типизированный указатель, он реально увеличивается на X*(размер типа)...
Страницы: 1 вся ветка
Текущий архив: 2004.11.21;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.052 c