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

Вниз

Какой тип лучше использовать для небольших строк?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1148995910
Romul
2006-05-30 17:31
2006.08.06
Работа с полем BLOB, очень жду


2-1153302763
novill
2006-07-19 13:52
2006.08.06
Обработчик один - классы объектов разные, как объявить?


2-1153411217
Ivolg
2006-07-20 20:00
2006.08.06
Сообщение


2-1152886626
дмитрий _делфи
2006-07-14 18:17
2006.08.06
делаю игру. надо сделать пульки.


4-1145340167
Виталий Панасенко
2006-04-18 10:02
2006.08.06
EAN-8, EAN-13 etc.