Текущий архив: 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.46 MB
Время: 0.011 c