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

Вниз

Функции сравнения строк, почему не так?   Найти похожие ветки 

 
Кто б сомневался ©   (2009-01-30 16:27) [0]

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


 
Rouse_ ©   (2009-01-30 16:30) [1]

function CompareStr(const S1, S2: string): Integer;
asm
 cmp eax, edx
 je @SameString
 ...
@SameString:
 xor eax, eax
 ret


> Возможно я чего то недопонял?

Скорее всего :)


 
Anatoly Podgoretsky ©   (2009-01-30 16:33) [2]

> Кто б сомневался  (30.01.2009 16:27:00)  [0]

А чего тут думать, зачем выполнять не нужную операцию, программисты в Борланде может и дураки, но не идиоты.


 
Rouse_ ©   (2009-01-30 16:35) [3]

пардон... это эквивалент... сравнение на размер происходит после проверки эквивалентности и проверки первых 4 байт (считай аналог размера) и только потом проверяется размер


 
Anatoly Podgoretsky ©   (2009-01-30 16:43) [4]

> Rouse_  (30.01.2009 16:35:03)  [3]

Размер, кроме нулевого проверять смысла нет, вне зависимости от результата сравнивать все равно нужно.


 
Кто б сомневался ©   (2009-01-30 17:32) [5]

Rouse_ ©   (30.01.09 16:30) [1]

не проверяется.

Значит еще раз. Delphi 2009 (в D7 было без сравнения длины строк тоже).
Берем две переменные. В одну вводим "asdasdasdasd" в другую тоже самое, но в конце добавляем еще один символ -  "asdasdasdasdw" .
Далее , см. в отладчике.
Все символы крутяться в @CompareLoop.


> Размер, кроме нулевого проверять смысла нет, вне зависимости
> от результата сравнивать все равно нужно.


Почему?! Ведь часто попадаются  две разные строки которые в первую очередь отличаются по длине. Объясните почему проверять смысла нет?


 
SPeller ©   (2009-01-30 17:35) [6]

кто сказал что разная длина чаще?


 
Кто б сомневался ©   (2009-01-30 17:39) [7]

Да не цеплятесь в к словам, не будьте буквоедом.


 
Jeer ©   (2009-01-30 17:43) [8]

Надо не сомневаться, а провести статистическое тестирование реализации того алгоритма, который Вы считаете более оптимальным и стандартных реализаций.
Представить отчет.
Можно здесь.


 
Германн ©   (2009-01-30 17:45) [9]

А разве размер как-то влияет на сравнение?


 
palva ©   (2009-01-30 17:45) [10]


> Объясните почему проверять смысла нет?

Выяснять, какая строка больше все равно придется, совпала длина или не совпала.


 
Pavia ©   (2009-01-30 17:52) [11]


> Почему?! Ведь часто попадаются  две разные строки которые
> в первую очередь отличаются по длине. Объясните почему проверять
> смысла нет?

Потому что разная длина не отвечает строчка < или > . А функция CompareStr отвичает.   Далее советую взять либо справку, либо учебник.


 
Jeer ©   (2009-01-30 17:52) [12]


> Германн ©   (30.01.09 17:45) [9]
>
> А разве размер как-то влияет на сравнение?


Ну, смысл посыла в том, что если размер (длина строки) разный, то не надо
дальше лазить по символам.
Вроде как понятно, д.б.


 
Кто б сомневался ©   (2009-01-30 18:03) [13]

Pavia ©   (30.01.09 17:52) [11]

Ну с CompareStr понятно. Ну есть же другие - SameStr, SameText, SameFileName. ANSISameStr и др. в модуле StrUtils.

P.s. Интересно послушать ответ Подгорецкого на (30.01.09 17:32) [5].
Почему категорически (судя по  [2]) нет смысла сравнивать длины строк перед их сравнением.


 
Sapersky   (2009-01-30 18:04) [14]

Там не строгое стравнение "равно"/"не равно". Строка может быть "больше" или "меньше", это нужно главным образом для сортировки по алфавиту.
Если требуется строгое сравнение - действительно, сначала лучше проверять размер.


 
Pavia ©   (2009-01-30 18:15) [15]

SameStr нужно для проверки равенства строк. Какраз таки и проверяет длину.
Вначале проверяет указатели указывают на одну строку. Если нет проверяют не нуливые. А после проверяет длину если равные то выполняет CompareText если нет то выходят.


 
Jeer ©   (2009-01-30 18:25) [16]

Ну вот.. начали процесс "углубления"..
А так хотелось, чтобы сомневающийся сам разобрался в хитросплетениях сравнения строк :)


 
тда   (2009-01-30 19:28) [17]

от версии зависит вроде


 
Anatoly Podgoretsky ©   (2009-01-30 21:22) [18]

> Кто б сомневался  (30.01.2009 17:32:05)  [5]

Потому что результат не Boolean, а Sign


 
Anatoly Podgoretsky ©   (2009-01-30 21:25) [19]

> Jeer  (30.01.2009 17:52:12)  [12]

Смысл посыла понятен, только он не соответствует реальности.


 
Кто б сомневался ©   (2009-01-31 18:14) [20]


> Потому что результат не Boolean, а Sign


ну так и надо было говорить. Т.к. не у всех результат sign, есть и boolean функции.


> Смысл посыла понятен, только он не соответствует реальности.


Дык вроде доказали уже, что проверка длины строк есть в SameStr и SameText. Вопрос касался то "CompareStr и CompareText и остальных функций [сравнения строк]"



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

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
6-1200643073
Andrewtitoff
2008-01-18 10:57
2009.03.29
Как правильно послать файл через TcpServer &amp; TcpClient ?


15-1232663571
Германн
2009-01-23 01:32
2009.03.29
Ну вот ещё один продукт наших студентов.


11-1197987179
nikfel
2007-12-18 17:12
2009.03.29
Как проиграть wav-файл.


15-1232851838
Vjik
2009-01-25 05:50
2009.03.29
Очень важные сообщения


15-1232270164
palva
2009-01-18 12:16
2009.03.29
Все верующие купаются сегодня в проруби