Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизКакой тип лучше использовать для небольших строк? Найти похожие ветки
← →
novill © (2006-07-13 15:28) [0]string или string[xxx]? Строк мнгого, но они небольшие и работы с каждой немного.
← →
unknown © (2006-07-13 15:35) [1]ShortString
← →
novill © (2006-07-13 15:39) [2]Хм, с теминологией я лажанулся :)
выбор меду AnsiString и ShortString.
> unknown
Быстрее?
← →
begin...end © (2006-07-13 15:47) [3]> novill © (13.07.06 15:39) [2]
> Быстрее?
Чем что? ShortString = string[255].
P.S. Земляк ;-)
← →
novill © (2006-07-13 16:14) [4]AnsiString=string (по настройках по умолчанию)
ShortString=string[255]
> > novill © (13.07.06 15:39) [2]
> > Быстрее?
Работа с ShortString просиходит быстрее чем с AnsiString?
← →
begin...end © (2006-07-13 16:20) [5]> novill © (13.07.06 16:14) [4]
Какая конкретно работа? Приводите код, будем оценивать.
← →
tesseract © (2006-07-13 17:00) [6]> Работа с ShortString просиходит быстрее чем с AnsiString?
ShortString (pascal string)- массив, где первый элемент обозначает длину строки .
AnsiString - строка заканчивающаяся #0.
Скорость больше у AnsiString.
← →
Stakan © (2006-07-13 17:04) [7]tesseract © (13.07.06 17:00) [6]
Что быстрее - узнать длину ShortString или AnsiString?
← →
Джо © (2006-07-13 17:06) [8]> [7] Stakan © (13.07.06 17:04)
> tesseract © (13.07.06 17:00) [6]
> Что быстрее - узнать длину ShortString или AnsiString?
Одинаково.
← →
Джо © (2006-07-13 17:08) [9]Длина AnsiString также хранится в служебной области памяти, непосредственно перед самой строкой.
← →
Stakan © (2006-07-13 17:40) [10]Джо © (13.07.06 17:08) [9]
Я в курсе, но мне кажется, что для коротких строк всё - же быстрее
Напримерvar
такой код для коротких строк.
Str: string[32];
StrLen: Byte absolute Str;
А вот для длинных:function _LStrLen(const s: AnsiString): Longint;
begin
Result := 0;
if Pointer(s) <> nil then
Result := PStrRec(Integer(s) - sizeof(StrRec)).length;
end;
← →
Джо © (2006-07-13 17:44) [11]> Stakan ©
Никто не мешает сделать то же и для AnsiString, если есть вопросы к производительности. Подобные вопросы нужно обсуждать имея конкретный код.
← →
DrPass © (2006-07-13 17:52) [12]
> tesseract © (13.07.06 17:00) [6]
Скорость работы с ShortString выше, причем значительно. AnsiString - это сложный управляемый тип данных, а не просто строка с #0. ShortString не нуждается, например, в релокациях памяти.
← →
novill © (2006-07-14 11:16) [13]код состоит из многочисленных pos, delete, copy и посимвольным обращениям.
Занявшись анализом, я вот сейчас например обнаружил, что вот такой кодfor i:=1 to 100000 do
begin
s:="";
for j:=50 to 150 do
s:=chr(j)+s;
a:=s;
end;
Выполняется горяздо медленнее
чемfor i:=1 to 100000 do
begin
s:="";
for j:=50 to 150 do
begin
s[255-j]:=chr(j);
s:=trim(s);
end;
a:=s;
← →
novill © (2006-07-14 11:21) [14]да ,забыл
var i, j:integer;
t:TTime;
s:ShortString;
← →
begin...end © (2006-07-14 13:32) [15]> novill © (14.07.06 11:16) [13]
В примере дело вот в чём. При сложении коротких строк (ShortString) каждая из них преобразуется в длинную строку (AnsiString), они складываются, после чего получившаяся длинная строка преобразуется обратно в короткую. Всё это занимает много времени, поэтому первый пример работает гораздо медленнее, чем второй.
> код состоит из многочисленных pos, delete, copy и посимвольным
> обращениям.
Чтение символа длинной строки будет почти таким же быстрым, как и чтение символа короткой (в первом случае будет больше на одно разыменование, но это уже мелочи).
Функции Pos для короткой и длинной строк будут автоматичски вызываться разные, однако сам поиск в них организован примерно одинаково, и больших различий в скорости тут тоже ожидать не следует.
А вот в случае Delete и Copy различия есть, и существенные. Например, удаление из короткой строки какой-либо её части не приводит к изменению объёма памяти, занимаемой ею: дело ограничивается тем, что следующие после места удаления символы сдвигаются вперёд, а в первый байт строки записывается её новая длина. Для короткой же строки потребуется перераспределение под неё памяти (ReallocMem), что займёт относительно много времени.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c