Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
15-1150349099
Layner
2006-06-15 09:24
2006.07.16
Delphi 2006, можно ди вернуться к интерфейсу как у Delphi 7?


1-1149229801
Layner
2006-06-02 10:30
2006.07.16
Balloon Hint не хочет показываться :( В чем может быть дело..


2-1151385233
bajenovv
2006-06-27 09:13
2006.07.16
помогите плиз новичку!!!!


2-1151237529
Mr tray
2006-06-25 16:12
2006.07.16
string [8] заполняется только четырьмя символами


2-1151673955
koha
2006-06-30 17:25
2006.07.16
Как отследить запущенную программу через winexec





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский