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

Вниз

Можно ли оптимизировать данный код?   Найти похожие ветки 

 
AlexanderMS ©   (2006-06-16 17:38) [0]

Подскажите, пожалуйста, можно ли как-нибудь оптимизировать следующий код:
// сначала - переменные
var
 BArray : PByteArray;
 u, n : integer;
 ps : int64; // текущее смещение
 ms : TMemoryStream;
................................
begin
// код в общих чертах.
................................
 BArray := MS.Memory;
.........................
// Вложенный цикл (хоть и не указал). Здесь стоит вопрос:

 for n := 0 to u - 1 do
   Name := Name + chr(BArray[ps + n]);


.................
end;

В памяти есть набор символов (помимо прочего, что прочитали из файла и занесли в память). Их количество заранее известно. В цикле создаётся строка. Через Read пробовал - дольше. А нужна скорость! Этот вложенный цикл используется до 7 тысяч раз, и мне кажется, что строка создаётся долго (сравнительно): этот фрагмент кода (если смотреть в CPU Window) - едва ли не самый большой в процедуре.

Есть какие-либо предложения?


 
AlexanderMS ©   (2006-06-16 17:39) [1]

Забыл указать: Name : string;


 
Lamer@fools.ua ©   (2006-06-16 17:42) [2]

SetLength + Move


 
evvcom ©   (2006-06-16 17:49) [3]

> BArray[ps + n]

Насколько мне известно, индекс может быть 32-битным числом, не более. Возможно, компилятор использует только младшие 32 бита, но тем не менее...
И в память что, грузится столько байт, что DWORD-а не хватает? Не верю.

> Name := Name +

Увеличивать по 1 байту стринг неэффективно. Есть более эффективная функция Copy.


 
kaif ©   (2006-06-16 17:55) [4]

Прошу ногами не бить, если неправ, но мне кажется:
Для начала у TMemoryStream есть свои методы для решения таких задач.

Можно перевести Position методом Seek или прямым присвоением:

MS.Position := ps;

Затем можно считать методом read нужное число байт в буфер:

var
 s: string;
begin
 MS.Position := ps;
 SetLength(s, n);
 MS.Read(s, n); //здесь я не помню, возможно нужно привести тип string  к адресу начала его части байтов. Прошу мастеров меня здесь поправить. Но что-то подобное я как-то делал, хотя и не помню, как именно.

end;


 
tesseract ©   (2006-06-16 17:55) [5]


>  ps : int64; // текущее смещение

integer здесь тоже скорости подбавит(7000 меньше 2^32, а процессор у нас 32 бита).


 
AlexanderMS ©   (2006-06-16 18:13) [6]

kaif ©   (16.06.06 17:55) [4]
См. [1]. Уже пробовал. Заменил подобные обращения на Read, скорости поубавилось.
Посмотрел с помощью Hex Editor: DWord"а достаточно будет. Спасибо. Проверю.


 
MBo ©   (2006-06-16 18:16) [7]

Для оптимизации - сразу задать большую (чтобы хватило в любом случае) длину строки Name, в цикле не добавлять символ, а устанавливать нужный, а по окончании циклов укоротить до нужной длины.


 
AlexanderMS ©   (2006-06-16 18:19) [8]

Попробовал. Особого улучшения нет. Скажите, а что компьютеру сделать легче - брать значения переменных или "на ходу" прибавлять число (но в нескольких - 2-3х местах) к другой переменной?


 
AlexanderMS ©   (2006-06-16 18:21) [9]


> Увеличивать по 1 байту стринг неэффективно. Есть более эффективная
> функция Copy.

Как её здесь использовать в данном примере (объявлен указатель на массив байтов)?


 
AlexanderMS ©   (2006-06-16 18:22) [10]

MBo ©   (16.06.06 18:16) [7]

Спасибо, попробую.


 
tesseract ©   (2006-06-16 22:00) [11]

А почеме-бы не скопировать в pchar а потом не привести к string? идея шальная, но может поможет.


 
Юрий Зотов ©   (2006-06-17 00:32) [12]

Если "их количество заранее известно", то лучше [2] вряд ли что придумаешь.



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

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

Наверх




Память: 0.49 MB
Время: 0.027 c
2-1151377913
learner
2006-06-27 07:11
2006.07.16
CloseHandle при INVALID_HANDLE_VALUE .


15-1150563969
Furyz-dimodim
2006-06-17 21:06
2006.07.16
Вопрос для тех кто шарит в линуксе...


15-1150266529
REA
2006-06-14 10:28
2006.07.16
Уотерс и money


3-1147356242
Boris Marchenko
2006-05-11 18:04
2006.07.16
Ошибка при залогинивании в IBConsole


15-1150289277
Сергей М.
2006-06-14 16:47
2006.07.16
Взаимодействие дивайса под управлением Linux с Win-клиентом