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

Вниз

Скорость сравнения строк в Ansi и Unicode формате.   Найти похожие ветки 

 
guav ©   (2007-11-01 09:55) [40]

Это именно код Windows ?
Хотя, да, так и сравнивают. Мне удалось создать разные файлы с именами "Ä" (U+00C4), и "A" + "¨" (U+0041 U+0308).


 
Riply ©   (2007-11-01 09:58) [41]

>  [39] Anatoly Podgoretsky ©   (01.11.07 09:50)
> Так я про UCS-2 и говорил, а в Википедия пишут другое, что мол UTF-16,
> а что на самом деле - является тайной, но по приведеному коду этого не видно.

Код, чесно говоря, не совсем Microsoft`овский.
Взят отсюда: http://www.reactos.org/generated/doxygen/d8/d16/unicode_8c-source.html
Но я не думаю, что в таком важном вопросе ReactOS`овцы
позволили себе вольный перевод или авторскую правку :)


 
guav ©   (2007-11-01 09:59) [42]


> Так я про UCS-2 и говорил, а в Википедия пишут другое, что
> мол UTF-16, а что на самом деле - является тайной

Тайны нет, MSDN тоже утверждает что UTF-16.


 
guav ©   (2007-11-01 11:03) [43]

Да. RtlCompareUnicodeString работает именно так.
.7C917800: 668B4D08   mov         cx,[ebp][00008]
.7C917804: 663B4D10   cmp         cx,[ebp][00010]
.7C917808: 74DE         je            .07C9177E8


Сравнение CompareMem а не по символам там нельзя применить, т.к. функция должа вернуть не просто равенство или неравенство. Оптимизировать такое сравнение можно: сравнивать DWORDы, при неравенстве перед вычетанием для выдачи ответа менять порядок байт на нужный.


 
Riply ©   (2007-11-01 11:11) [44]

> [43] guav ©   (01.11.07 11:03)

> Сравнение CompareMem а не по символам там нельзя применить,
> т.к. функция должа вернуть не просто равенство или неравенство.

Зато можно попробовать использовать RtlCompareMemory :)


 
Riply ©   (2007-11-01 11:21) [45]

> [44] Riply ©   (01.11.07 11:11)
> Зато можно попробовать использовать RtlCompareMemory :)

Но не нужно :), наверное.
Хотя внешне и кажется, что это "оптимизирует", но что-то здесь "не то".
Они же так не поступили.
Скорее всего мы начнем проигрывать на строках, различающихся символами, близкими к началу строки.


 
clickmaker ©   (2007-11-01 12:22) [46]


> то ухожу в монастырь

мужской? :)


 
Anatoly Podgoretsky ©   (2007-11-01 12:24) [47]


> Код, чесно говоря, не совсем Microsoft`овский.

Не суть важно, можно говорить по данному коду, этот работает с ucs-2


 
Anatoly Podgoretsky ©   (2007-11-01 12:27) [48]


> > Зато можно попробовать использовать RtlCompareMemory :
> )
>
> Но не нужно :), наверное.

Не нужно, для Юникод кодов менее $10000 ucs-2 совпадает с utf-16


 
Riply ©   (2007-11-01 20:59) [49]

> [46] clickmaker ©   (01.11.07 12:22)
> мужской? :)

Над этим вопросом еще не задумывалась.
А в какой нынче модно уходить ? :)  

> [48] Anatoly Podgoretsky ©   (01.11.07 12:27)

> Не нужно, для Юникод кодов менее $10000 ucs-2 совпадает с utf-16

Ну и слава богу. Работы меньше :)

Из этой ветки я вынесла следующее:
Мне надо было имеющийся лист(массив) UNICODE_STRING`ов
обработать (сортировка, поиск дубликатв) и преобразовать в ANSI.
Вопрос был в следующем: что сначала преобразовать в Ansi или обрабатывать.
Если я правильно поняла, то обработка его в исходном виде лучше.
Ускорения при использовании Ansi мы не обнаружили, зато выяснили,
что многие Ansi функции работают через UNICODE.

За что всем большое спасибо :)


 
Anatoly Podgoretsky ©   (2007-11-01 23:15) [50]


> зато выяснили,
> что многие Ansi функции работают через UNICODE.

Попутно можно выяснить, что Ansi функции могут не работать в общем случае, никогда нет гарантии в возможности преобразования Юникод в Ansi


 
Riply ©   (2007-11-02 09:30) [51]

> [50] Anatoly Podgoretsky ©   (01.11.07 23:15)
> Попутно можно выяснить, что Ansi функции могут не работать в общем случае,
> никогда нет гарантии в возможности преобразования Юникод в Ansi

Тоже очень полезное "выяснение" :)
P.S.
Похоже пора работать только в UNICODE - проблем меньше, "взаимопонимания" с системой больше :)


 
Anatoly Podgoretsky ©   (2007-11-02 09:50) [52]

> Riply  (02.11.2007 09:30:51)  [51]

Дельфи это не благоприятствуют, TNT Contros и не должного уровня и не покрывает все потребностей, хорошо хоть базовые покрывает. Я во всех проектах использую эту библиотеку в обязательном порядке. Есть и реальная нужда во многоязычие и нет желания бороться с локализациями конкретных машин, да и не возможно это по большому счету.


 
Riply ©   (2007-11-02 10:28) [53]

> [52] Anatoly Podgoretsky ©   (02.11.07 09:50)
> TNT Contros и не должного уровня и не покрывает все потребностей, хорошо хоть базовые покрывает.
> Я во всех проектах использую эту библиотеку в обязательном порядке.

"Чем дальше в лес - тем больше дров".
Впервые слышу об этой библиотеке. Где ее можно посмотреть и потрогать ?


 
Anatoly Podgoretsky ©   (2007-11-02 10:35) [54]

> Riply  (02.11.2007 10:28:53)  [53]

Ну сейчас она перешла в разряд платных, возможно где то в файловых архивах еще валяются старые бесплатные версии.
Но если есть желание то могу выслать на твой почтовый ящик. Библиотека достойная. Базовая версия 2.2.5., размер 260 кб в zip
А найти легко, через поисковую систему - TntUnicodeControls


 
Riply ©   (2007-11-02 10:59) [55]

> [54] Anatoly Podgoretsky ©   (02.11.07 10:35)
> Но если есть желание то могу выслать на твой почтовый ящик.

Желание есть. :) Буду очень признательна.

P.S.
Надеюсь моя анкета цела. Вроде надавно перерегистрироавлась.


 
Riply ©   (2007-11-02 21:34) [56]

Вот натолкнулась на функцию в WideStrUtils:

function WStrComp(const Str1, Str2: PWideChar): Integer; assembler;
asm
       PUSH    EDI
       PUSH    ESI
       MOV     EDI,EDX
       MOV     ESI,EAX
       MOV     ECX,0FFFFFFFFH
       XOR     EAX,EAX
       REPNE   SCASW
       NOT     ECX
       NOT     ECX
       MOV     EDI,EDX
       XOR     EDX,EDX
       REPE    CMPSW
       MOV     AX,[ESI-2]
       MOV     DX,[EDI-2]
       SUB     EAX,EDX
       POP     ESI
       POP     EDI
end;


Она внутри использует что-то типа CompareMem или
"по идеологии" похожа на RtlCompareUnicodeString в [35] Riply © ?


 
guav ©   (2007-11-02 21:43) [57]

Ищет нуль в конце одной из строк для определения длины, затем сравнивает по два байта.
использует то что в конце обязателен нуль, в отличии от RtlCompareUnicodeString, которая не рассчитывает на это и готова прнять нули в середине.


 
Riply ©   (2007-11-02 21:51) [58]

> [57] guav ©   (02.11.07 21:43)
> Ищет нуль в конце одной из строк для определения длины, затем сравнивает по два байта.

Именно это меня и интересовало. Спасибо.
Т.е. использует "посимвольное" сравнение как и RtlCompareUnicodeString
и не пытается сравнивать по четыре байта ?


 
guav ©   (2007-11-02 22:00) [59]

Сравни
> REPE    CMPSD
> JNE     @@2
> MOV     ECX,EDX
> REPE    CMPSB

и

>       REPE    CMPSW

посимвольно :)

Функция тоже использует вычитание символов, и в отличии от RtlCompareUnicodeString всегда использует такое вычитание (это работает т.к. #0 меньше любого символа)



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

Форум: "Начинающим";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.048 c
15-1192786848
de.
2007-10-19 13:40
2007.11.25
Среда разработки


2-1193740119
Zong_Zong
2007-10-30 13:28
2007.11.25
GDB как открыть?


15-1192629525
исследователь
2007-10-17 17:58
2007.11.25
ALTER TABLE в Delphi


2-1193818997
bioSerg
2007-10-31 11:23
2007.11.25
Invalid Floating Point Operation и NAN


2-1194125113
nWinter
2007-11-04 00:25
2007.11.25
PopupMenu





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