Главная страница
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.023 c
14-5810
{{{KOTOS}}}
2003-02-12 13:40
2003.03.03
Почему не находит?


14-5770
Мазут Береговой
2003-02-16 08:22
2003.03.03
Я


3-5385
qwerty2
2003-02-12 11:00
2003.03.03
Hint DBNavigator a


14-5797
Игорь Шевченко
2003-02-11 09:27
2003.03.03
С днем рождения, Александр aka Внук!


7-5900
Kotka
2002-12-29 01:02
2003.03.03
Перехват подсказок