Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1152275970
Yegorchic
2006-07-07 16:39
2006.08.06
Можно ли поменять стекло на мониторе?


2-1153407511
Sirus
2006-07-20 18:58
2006.08.06
Выбор принтера


5-1137497165
Anatoly_71
2006-01-17 14:26
2006.08.06
TDateTimePicker заставить выпасть календарь


2-1153430505
Батя
2006-07-21 01:21
2006.08.06
WebBrowser


15-1152520236
iddddi
2006-07-10 12:30
2006.08.06
Рисование штрих-кода Code 128





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский