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

Вниз

Что будет быстрее: сравнить две строки[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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.051 c
4-1082381434
S_S_S
2004-04-19 17:30
2004.05.30
Как переместить системные кнопки управления окном


3-1083695368
SergP
2004-05-04 22:29
2004.05.30
Можно ли обновить конкретную запись в запросе?


14-1084009285
Alex-21
2004-05-08 13:41
2004.05.30
Архангельский А.Я. Программирование в Delphi 5


14-1083896805
X9
2004-05-07 06:26
2004.05.30
Чат на Delphi


14-1084456596
Developerr
2004-05-13 17:56
2004.05.30
Как получить только имя файла в OpenDialog?