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