![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какой тип лучше использовать для небольших строк? [D6, XP]
novill © (2006-07-13 15:28:00)string или string[xxx]? Строк мнгого, но они небольшие и работы с каждой немного.
begin...end (2006-07-14 13:32:00) [1]> novill © (14.07.06 11:16) [13]
В примере дело вот в чём. При сложении коротких строк (ShortString) каждая из них преобразуется в длинную строку (AnsiString), они складываются, после чего получившаяся длинная строка преобразуется обратно в короткую. Всё это занимает много времени, поэтому первый пример работает гораздо медленнее, чем второй.
> код состоит из многочисленных pos, delete, copy и посимвольным
> обращениям.
Чтение символа длинной строки будет почти таким же быстрым, как и чтение символа короткой (в первом случае будет больше на одно разыменование, но это уже мелочи).
Функции Pos для короткой и длинной строк будут автоматичски вызываться разные, однако сам поиск в них организован примерно одинаково, и больших различий в скорости тут тоже ожидать не следует.
А вот в случае Delete и Copy различия есть, и существенные. Например, удаление из короткой строки какой-либо её части не приводит к изменению объёма памяти, занимаемой ею: дело ограничивается тем, что следующие после места удаления символы сдвигаются вперёд, а в первый байт строки записывается её новая длина. Для короткой же строки потребуется перераспределение под неё памяти (ReallocMem), что займёт относительно много времени.
novill (2006-07-14 11:21:00) [2]да ,забыл
var i, j:integer;
t:TTime;
s:ShortString;
novill (2006-07-14 11:16:00) [3]код состоит из многочисленных 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;
DrPass (2006-07-13 17:52:00) [4]
> tesseract © (13.07.06 17:00) [6]
Скорость работы с ShortString выше, причем значительно. AnsiString - это сложный управляемый тип данных, а не просто строка с #0. ShortString не нуждается, например, в релокациях памяти.
Джо (2006-07-13 17:44:00) [5]> Stakan ©
Никто не мешает сделать то же и для AnsiString, если есть вопросы к производительности. Подобные вопросы нужно обсуждать имея конкретный код.
Stakan (2006-07-13 17:40:00) [6]Джо © (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:08:00) [7]Длина AnsiString также хранится в служебной области памяти, непосредственно перед самой строкой.
Джо (2006-07-13 17:06:00) [8]> [7] Stakan © (13.07.06 17:04)
> tesseract © (13.07.06 17:00) [6]
> Что быстрее - узнать длину ShortString или AnsiString?
Одинаково.
Stakan (2006-07-13 17:04:00) [9]tesseract © (13.07.06 17:00) [6]
Что быстрее - узнать длину ShortString или AnsiString?
tesseract (2006-07-13 17:00:00) [10]> Работа с ShortString просиходит быстрее чем с AnsiString?
ShortString (pascal string)- массив, где первый элемент обозначает длину строки .
AnsiString - строка заканчивающаяся #0.
Скорость больше у AnsiString.
begin...end (2006-07-13 16:20:00) [11]> novill © (13.07.06 16:14) [4]
Какая конкретно работа? Приводите код, будем оценивать.
novill (2006-07-13 16:14:00) [12]AnsiString=string (по настройках по умолчанию)
ShortString=string[255]
> > novill © (13.07.06 15:39) [2]
> > Быстрее?
Работа с ShortString просиходит быстрее чем с AnsiString?
begin...end (2006-07-13 15:47:00) [13]> novill © (13.07.06 15:39) [2]
> Быстрее?
Чем что? ShortString = string[255].
P.S. Земляк ;-)
novill (2006-07-13 15:39:00) [14]Хм, с теминологией я лажанулся :)
выбор меду AnsiString и ShortString.
> unknown
Быстрее?
unknown (2006-07-13 15:35:00) [15]ShortString