Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.03;
Скачать: CL | DM;

Вниз

Оптимизация кода   Найти похожие ветки 

 
REA ©   (2003-02-19 15:37) [0]

Имеется фрагмент кода:

j := 0;
For i := StartIndex To StopIndex Do
Begin
PrjBuffer[j].X := Round(XOfs + XSegment[i]*XScl);
PrjBuffer[j].Y := Round(YOfs + YSegment[i]*YScl);
Inc(j);
End;

Хочется соптимизировать.
Сделал так:
i := StopIndex;
pSData := @XSegment.Data[i];
pYData := @YSegment.Data[i];
si := StartIndex;
pBuf := @PrjBuffer[LastPtIndex];
While i <> si Do
Begin
pBuf.X := Round(XOfs + pSData^*XScl);
pBuf.Y := Round(YOfs + pYData^*YScl);
Dec(pSData);
Dec(pYData);
Dec(pBuf);
Dec(i);
End;

Как еще можно ускорить? (желательно без ассемблера)


 
MBo ©   (2003-02-19 15:44) [1]

А что, второе быстрее???
Какие переменные вещественные?


 
REA ©   (2003-02-19 15:54) [2]

Второе вероятно быстрее: цикл по уменьшению, нет адресации к массивам, переменные перевел в локальные (на стек).
Вещественные: XOfs, pSData^, XScl, pYData^
Как свести к целочисленной математике не знаю.


 
Radionov Alexey ©   (2003-02-19 15:54) [3]

Чуток быстрее:
j := 0;
For i := StartIndex To StopIndex Do
with PrjBuffer[j] do
Begin
X := Round(XOfs + XSegment[i]*XScl);
Y := Round(YOfs + YSegment[i]*YScl);
Inc(j);
End;


Но лучше, конечно, знать саму задачу.


 
REA ©   (2003-02-19 15:57) [4]

Пробовал With - кажется ничего не дает. Ассемблерный код тот же.


 
REA ©   (2003-02-19 16:28) [5]

Сорри. Вместо <>, >=


 
REA ©   (2003-02-19 16:52) [6]

Даст ли что нибудь SetPrecisionMode(pmDouble) ?


 
MBo ©   (2003-02-19 17:05) [7]

нет. лучше объясни задачу


 
REA ©   (2003-02-19 17:11) [8]

Задача тривиальна.
Спроецировать на график (Массив пригодный для PolyLine) точки, хранящиеся в массивах X и Y с заданного индекса по заданный. Уровней проецирования много, но результирующие коэффициенты сводятся к Ax+B.


 
han_malign ©   (2003-02-19 17:47) [9]

ну допустим еще один декремент в цикле можно убрать - вполне можно
pBuf := @PrjBuffer[LastPtIndex];
pBBuf:= @PrjBuffer[0];//на всякий случай - надо разбираться с приведением массивного типа к указателю (от соглашений Delphi зависит и типа массива)
while(DWORD(pBuf)>DWORD(pBBuf))do ...

Кстати насчет dec(pBuf) - вы уверены что Delphi автоматически вычисляет шаг декремента по типу указателя, помоему нет???


 
REA ©   (2003-02-19 18:03) [10]

Очень даже вычисляет. Спасибо за подсказку.



Страницы: 1 вся ветка

Текущий архив: 2003.03.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-5594
Nehto
2003-02-19 19:55
2003.03.03
Kak udalit ne pustoj katalog


3-5397
hooch
2003-02-12 12:07
2003.03.03
delphi + ms sql 200


14-5847
xoxol
2003-02-11 06:27
2003.03.03
FORMAT C:


14-5866
Axis_of_Evil
2003-02-14 09:12
2003.03.03
IIS


4-5920
AiratX
2003-01-16 17:52
2003.03.03
Подскажите пожалуйста как сказать часам, что время изменилось.