Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение строк.


Страницы:   1 2 3

Riply ©   (2007-03-05 21:59:00) 

Здравствуйте !
Вопрос такой:
Есть строковая константа с которой (так много раз, аж страшно),
надо сравнивать другие строчки (not case-sensitive) и получать
результат <, = или >
Какой вариант лучше использовать ?
const
BaseStr = 'bla-bla';
if LowerCase(TestedString) < BaseStr then
......
const
BaseStr = 'BLA-BLA';
if UpperCase(TestedString) < BaseStr then
......
if CompareText(TestedString, BaseStr) < 0 then
...
P.S. Хотела найти подсказку в исходниках, но там ассемблер,
а мы с ним еще не подружились :(


Sha   (2007-03-05 23:37:00) [21]

> Johnmen ©   (05.03.07 23:28) [21]
> А я тут FastCode вспомнил, там CompareText или что-то аналогичное было...

Угу


Игорь Шевченко   (2007-03-05 23:30:00) [22]


> Предполагается, что TestedString такой же длины, как и BaseStr.


а можно использовать _memicmp из ntdll.dll, если не требуется case-insensitive сравнения русских букв :)


Johnmen   (2007-03-05 23:28:00) [23]


> Sha ©   (05.03.07 23:15) [20]

А я тут FastCode вспомнил, там CompareText или что-то аналогичное было...


Sha   (2007-03-05 23:15:00) [24]

Хорошо бы добавить в описание немного специфики из области использования, тогда можно будет дать определенный ответ.
Например, разовый поиск в несортированном списке и вставка в
сортированный список могут быть оптимизированы по-разному.
В общем, может есть какие-то особенности задачи,
на которых можно сыграть, а именно:
сравниваются ли строки разной длины, или всегда одинаковой,
какой тип сравнения нужен =, <> или <,=,>, все или один,
наиболее частый результат сравнения,
надо ли сравнивать национальные символы,
насколько константы являются "константами".

Приведение к LowerCase (ANSILowerCase) неверно в принципе,
если требуется результат, совместимый с CompareText (ANSICompareText).

Вместо AnsiCompareText лучше написать свою с использованием таблицы,
сформированной на основе ANSILowerСаse


DVM   (2007-03-05 23:00:00) [25]

Хотя UpperCase() не работает с русскими буквами, а использование AnsiUpperCase сводит на нет все преимущества того, что я написал выше.


DVM   (2007-03-05 22:52:00) [26]


> Kedge ©   (05.03.07 22:47) [16]

там вот в [13] написали


DVM   (2007-03-05 22:50:00) [27]

А если учесть, что в верхний регистр базовую константу-строку переводить придется только 1 раз - то разница еще выше 110000


Kedge   (2007-03-05 22:47:00) [28]

> [14] DVM ©   (05.03.07 22:44)
Что-то я не пойму: А зачем, при использовании CompareText, еще нужны и Upper/LowerCase ?


DVM   (2007-03-05 22:47:00) [29]

Upper/LowerCase + CompareText - 180000 микросекунд
AnsiCompareText - 220000 микросекунд - почти на 20% медленнее.


DVM   (2007-03-05 22:44:00) [30]


> Palladin ©   (05.03.07 22:37) [13]

Надо же, а я и не знал.

Исходя из того, что требуется сравнение

> not case-sensitive

Я бы выбрал комбинацию Upper/LowerCase + CompareText - все быстрее получится.


Palladin   (2007-03-05 22:37:00) [31]


> DVM ©   (05.03.07 22:31) [12]

девствительно, только вот AnsiCompareText('б','Б') почемуто 0, а CompareText('б','Б') не 0 ...


DVM   (2007-03-05 22:31:00) [32]


> Спасибо всем. Пока остановлюсь на AnsiCompareText.

Зря. Он в 10(!) раз медленнее чем CompareText()


Riply   (2007-03-05 22:29:00) [33]

Спасибо всем. Пока остановлюсь на AnsiCompareText.


DVM   (2007-03-05 22:25:00) [34]


> Для лучшего результата надо сравнивать равные строки

ok, справнил одинаковые - разницы практически нет.


Riply   (2007-03-05 22:19:00) [35]

> [2] DVM ©   (05.03.07 22:08)
Для лучшего результата надо сравнивать равные строки
(иначе ты сравниваешь только первый символ)
P.S.
Забыла добавить в [0] Riply ©   (05.03.07 21:59)
Предполагается, что TestedString такой же длины, как и BaseStr.
>[3] Аноним   (05.03.07 22:11)
>Сколько раз? Приблизительно?
Возможно, для выражения этого числа, DWord-а хватит :)


Eraser   (2007-03-05 22:19:00) [36]

> [6] DVM ©   (05.03.07 22:16)

прошу прощение, хотел её процитировать, а процитировал тебя )


DVM   (2007-03-05 22:18:00) [37]


> т.о. Upper/LowerCase лишние.

У меня они закоментированы, это же для теста.


DVM   (2007-03-05 22:16:00) [38]


> Eraser ©   (05.03.07 22:13) [4]
> > [2] DVM ©   (05.03.07 22:08)
>
>
> > CompareText()
>
> CompareText is not case sensitive
> т.о. Upper/LowerCase лишние.

Так ему вроде и надо not case


DVM   (2007-03-05 22:14:00) [39]


> Надо больше брать, до миллиона


s1:='qwerty';
s2:='ytrewq';

for i:= 1 to 1000000 do
  begin
    //if UpperCase(s1) < s2 then begin end;     // 2 место 90597 микросекунд
    //if LowerCase(s1) < s2 then begin end;     // 3 место 94217 микросекунд
    if CompareText(s1, s2) < 0 then begin end; // 1 место 19254 микросекунд
  end;


Eraser   (2007-03-05 22:13:00) [40]

> [2] DVM ©   (05.03.07 22:08)


> CompareText()

CompareText is not case sensitive
т.о. Upper/LowerCase лишние.

PS лучше использовать AnsiCompareText.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо