Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Что будет быстрее: сравнить две строки[255] или взять к.л.   Найти похожие ветки 

 
Vlad Oshin ©   (2004-05-14 11:37) [0]

функцию от них и сравнить результаты? Как думаете?
Преследуется задача вести лог.
Периодически (раз-два в секунду)получаю короткую строку, но они очень часто повторяются, сильно не желательно бы писать их все в лог. В принципе, можно ошибиться, чтоб 2 раза записать строку, но пропустить нельзя.
Может и функцию порекомендуете, если второй вариант лучше?


 
Паниковский ©   (2004-05-14 11:50) [1]

Vlad Oshin

Быстрее сравнить две строки.


 
Vlad Oshin ©   (2004-05-14 11:53) [2]

быстрее даже чем такое, как простейшее вычисление длинны?


 
jack128 ©   (2004-05-14 11:55) [3]


> быстрее даже чем такое, как простейшее вычисление длинны?
а что равенство длин означает равенство строк? ;-)


 
DVM ©   (2004-05-14 11:55) [4]

Не я думаю, длину короткой строки вычислить быстрее.
А что ты мучаешься? Сделай пару миллионов проходов и погляди разницу.


 
DVM ©   (2004-05-14 11:56) [5]


> а что равенство длин означает равенство строк? ;-)

Нет. Зато неравенство означает их различие.


 
Паниковский ©   (2004-05-14 11:56) [6]

Тады во
if strlen(str1) = strlen(str2) then
 begin
  if not Check(str1,str2) then
    write(logFile,str1);
 end
else
 write(logFile,str1);
/*Все написано на псевдо Паскале в Дельфи не проверялось*/


 
McSimm ©   (2004-05-14 11:59) [7]


> Vlad Oshin ©   (14.05.04 11:37)  

Если функцию брать один раз, а сравнивать часто, то очень даже эффективно. Я использовал crc32, но мне не очень критична скорость была, т.к. функция вычисляется единожды, а хранится и используется долго. Ложных равенств в практике ни разу не случалось, а скорость сравнения двух int32 это уже совсем другая скорость.


 
jack128 ©   (2004-05-14 12:03) [8]


> Нет. Зато неравенство означает их различие.
так в Delphi сравнение строк так и реализовано -> сначало сравнивается длина, а потом содержимое.


 
Vlad Oshin ©   (2004-05-14 12:03) [9]

вычисление длинны - первое и простейшее, что пришло на ум. Мне бы что-то похитрее, но простое...
Чтоб не сравнивать все-таки. Пусть будут иногда повторения строк, не страшно


> DVM ©   (14.05.04 11:55) [4]
> Не я думаю, длину короткой строки вычислить быстрее.
> А что ты мучаешься? Сделай пару миллионов проходов и погляди
> разницу.

Потом, конечно, так и сделаю, для контроля


 
Anatoly Podgoretsky ©   (2004-05-14 12:21) [10]

Так для расчета CRC нужно время и большее чем сравнение строк, которое делается в фунции простым сравнением символов, после сравнения длин.


 
Паниковский ©   (2004-05-14 12:30) [11]

function Check(str1,str2:string):boolean;
var
count:integer;
begin
result := true;
for count := 1 to Length(str1) do
if str1[count] <> str2[count] then
  result := false;
end;

...
if strlen(str1) = strlen(str2) then
begin
 if not Check(str1,str2) then
   write(logFile,str1);
end
else
write(logFile,str1);
....
/*Все написано на псевдо Паскале в Дельфи не проверялось*/


 
McSimm ©   (2004-05-14 12:34) [12]

>Anatoly Podgoretsky ©   (14.05.04 12:21)
>Так для расчета CRC нужно время и большее чем сравнение строк

Но если, как я и написал, CRC считается один раз, а сравнения делаются часто, то эффект будет.

Например, если в логе миллион строк уже, и каждую входящую хочется сравнить со всеми.


 
Digitman ©   (2004-05-14 12:35) [13]


> Vlad Oshin ©   (14.05.04 11:37)  


здесь, очевидно, нужно уточнить, что чаще требуется - сравнение на равенство или НЕравенство

после возможного сравнения длин 1-е во многих случаях (при длинных строках) предпочтительней реализовывать на базе CRC32/64, второе (при коротких строках) - явным посимвольным сравнением


 
Digitman ©   (2004-05-14 12:38) [14]


> Vlad Oshin


если речь идет о СУБД, не позволяющей уникально индексировать строки такой длины, то в целях автом.проверки уникальности не самым плохим выходом как раз и будет создание доп.поля, хранящего уникально индексированного CRC строки (CRC вычисляется либо в триггере либо на кл.стороне)


 
Матлабист   (2004-05-14 13:02) [15]

Насколько я понял, то если сначала было:
"A", потом "B", потом снова "A", то последнее "A" можно не печатать? Вообще, какие могут быть объемы?

> Периодически (раз-два в секунду)получаю
довольно-таки долго

Возможные решения:

Хранить список введенных ранее строк в
 1) B-дерево
 2) Хэш (например THashStringList, Delphi 7)
 3) Сортированый список TStringList (sorted) (медленней всех, но быстрее в реализации)

В принципе, времени на поиск и вставку должно хватать


 
Матлабист   (2004-05-14 13:05) [16]

Точнее THashedStringList (IniFiles)


 
Кабан   (2004-05-14 14:19) [17]

можно сравнивать, допустим, первые 4 байта


 
Vlad Oshin ©   (2004-05-14 14:23) [18]

всем спасибо!
Удалось найти автора другой программы, он поправил

а быстрее всего получилось именно тупое
if s1=s2


> McSimm ©   (14.05.04 12:34)

не, не то, сравнивать надо было часто


> Digitman ©

а в БД воткнуть идея!
чтоб потом лог обрабатывать легче


> Паниковский ©

не, проще сравнить получается


jack128 ©   (14.05.04 12:03) [8]
> Anatoly Podgoretsky ©   (14.05.04 12:21) [10]

вот кого надо было сразу слушать :)
и не парится


 
Игорь Шевченко ©   (2004-05-14 14:52) [19]

Кстати говоря, из личного опыта: Если строк, с которыми надо сравнивать, много, и они отличаются, скажем, неким символом, например, первым, то можно создать массив, размером в 256 (или 128) из списков, в каждом из которых будут строки, у которых первый символ одинаковый (тоже, своего рода, разновидность хэш-таблицы). Поиск на совпадение в таком мультисписке обычно быстрее, чем в в общем списке строк, осоебнно при большом количестве строк и более или менее равномерном распределении первого символа.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.031 c
1-1084781602
Vadim X
2004-05-17 12:13
2004.05.30
Как сбросить кэш?


1-1084715381
RomeoGolf
2004-05-16 17:49
2004.05.30
Free и nil - как корректнее совместить?


6-1081419374
-=Demon=-
2004-04-08 14:16
2004.05.30
Контрольная Сумма


14-1084182274
Шнур
2004-05-10 13:44
2004.05.30
MS SQL Server


14-1084370046
Serzh ml
2004-05-12 17:54
2004.05.30
откуда в метро так много бутылок?





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