Форум: "Прочее";
Текущий архив: 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.048 c