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

Вниз

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

 
Кто б сомневался ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.049 c
3-1217487936
9899100
2008-07-31 11:05
2009.03.29
Список таблиц


15-1232463158
Dimka Maslov
2009-01-20 17:52
2009.03.29
Логические операции


15-1232623498
дед Маздай
2009-01-22 14:24
2009.03.29
Подскажите способ реализации


3-1217475458
wsv
2008-07-31 07:37
2009.03.29
Проверить системный DSN


2-1233786331
Drowsy
2009-02-05 01:25
2009.03.29
Библиотеки на С++ для Дельфи.





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