Главная страница
    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.025 c
15-1150462592
blackcrazzy
2006-06-16 16:56
2006.08.06
Сайт Delphimaster.ru


15-1152595364
tButton
2006-07-11 09:22
2006.08.06
а я вот призадумался


1-1150958318
Maxim_82
2006-06-22 10:38
2006.08.06
PlayList с помощью ListBox а


2-1153049491
spogi
2006-07-16 15:31
2006.08.06
Нумерация


2-1153375514
rosl
2006-07-20 10:05
2006.08.06
формат 1С





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