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

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

Скорость сравнения строк в Ansi и Unicode формате.


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

Riply ©   (2007-10-31 03:51:00) 

Здравствуйте !
Допустим, у нас есть две строки:
wBuf1, wBuf2: WideString;
и они же, "переведенные в Ansi": aBuf1, aBuf2: string;
Верно ли следующее утверждение:
регистро-зависимое сравнение aBuf1 и aBuf2 будет выполняться быстрее,
чем регистро-зависимое сравнение wBuf1 и wBuf2 ?


Anatoly Podgoretsky   (2007-11-01 09:50:00) [21]

> Riply  (01.11.2007 09:30:38)  [38]

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


Riply   (2007-11-01 09:30:00) [22]

> [37] Anatoly Podgoretsky ©   (01.11.07 09:16)
> А чего не поняла?
> Сравнение можно заменять вычитанием, можно даже XOR применить.
:)
Это был ответ на [33] guav ©, показывающий, что они все таки сравнивают и
никакие различные представления одного и того же символа не учитывают :)


Anatoly Podgoretsky   (2007-11-01 09:16:00) [23]

> Riply  (01.11.2007 08:12:35)  [35]

А чего не поняла?
Сравнение можно заменять вычитанием, можно даже XOR применить.


Riply   (2007-11-01 08:23:00) [24]

>[34] Джо ©   (01.11.07 06:56)

>> [32] DevilDevil   (31.10.07 23:32)
>А как вот это вообще к теме относится?

В теме слово "строка" есть ? - Есть ! Слово "сравнить" есть ? - Есть !
"Так что тебе, собака, еще надо ?" (с) Иван Васильевич

:)


Riply   (2007-11-01 08:12:00) [25]

> [33] guav ©   (01.11.07 00:07)
>> Microsoft, если я правильно увидела, сравнивает так: wBuf1[i] = wBuf2[i].
> где ?
> PS: Так они вряд ли сравнивают, скорее они так копируют :)
LONG
NTAPI
RtlCompareUnicodeString(
  IN PCUNICODE_STRING s1,
  IN PCUNICODE_STRING s2,
  IN BOOLEAN  CaseInsensitive)
{
  unsigned int len;
  LONG ret = 0;
  LPCWSTR p1, p2;

  len = min(s1->Length, s2->Length) / sizeof(WCHAR);
  p1 = s1->Buffer;
  p2 = s2->Buffer;

  if (CaseInsensitive)
  {
    while (!ret && len--) ret = RtlUpcaseUnicodeChar(*p1++) - RtlUpcaseUnicodeChar(*p2++);
  }
  else
  {
    while (!ret && len--) ret = *p1++ - *p2++;
  }
  if (!ret) ret = s1->Length - s2->Length;
  return ret;
}


Если я не сумела это правильно понять, то ухожу в монастырь. :)


Джо   (2007-11-01 06:56:00) [26]

> [32] DevilDevil   (31.10.07 23:32)
> function EqualStrings(const S1, S2 : string) : integer;
> begin
>  Result := (integer(S1) = integer(S2)) or
>               ( Length(S1) = Length(S2)
>                 and
>                 CompareMem(pointer(S1), pointer(S2), Length(S2)
> )  );
> end;
>
> а вообще, я писал такую же, только быстрее - полностью на
> ассемблере.
>
> P.S. в FastCode вообще маньяки !!!

А как вот это вообще к теме относится?


guav   (2007-11-01 00:07:00) [27]


> Microsoft, если я правильно увидела, сравнивает так: wBuf1[i] = wBuf2[i].

где ?

PS: Так они вряд ли сравнивают, скорее они так копируют :)


DevilDevil   (2007-10-31 23:32:00) [28]

function EqualStrings(const S1, S2 : string) : integer;
begin
  Result := (integer(S1) = integer(S2)) or
               ( Length(S1) = Length(S2)
                 and
                 CompareMem(pointer(S1), pointer(S2), Length(S2) )  );
end;


а вообще, я писал такую же, только быстрее - полностью на ассемблере.

P.S. в FastCode вообще маньяки !!!


Anatoly Podgoretsky   (2007-10-31 23:25:00) [29]

> Riply  (31.10.2007 23:21:30)  [30]

А кому сейчас легко.


Riply   (2007-10-31 23:21:00) [30]

> [29] Anatoly Podgoretsky ©   (31.10.07 23:19)

>Не ты первая.

Мне от этого не легче :))


Anatoly Podgoretsky   (2007-10-31 23:19:00) [31]

> Что-то я не понимаю. Совсем запуталась

Не ты первая.


Riply   (2007-10-31 23:12:00) [32]

Что-то я не понимаю. Совсем запуталась. :(
Microsoft, если я правильно увидела, сравнивает так: wBuf1[i] = wBuf2[i].
Вы хотите сказать, что равенство может быть верным, при разной "памяти" wBuf1 и wBuf2 ?


Anatoly Podgoretsky   (2007-10-31 23:08:00) [33]

> guav  (31.10.2007 23:07:26)  [26]

Конечно не помешает, поскольку при регистро-зависимом сравнение оно может делаться как простое сравнение памяти.


guav   (2007-10-31 23:07:00) [34]

В любом случае само мультибайтоное представление UTF-16 не помешает CompareMem, в [2] говорилось именно о формах, а не о кодировках.


Anatoly Podgoretsky   (2007-10-31 22:55:00) [35]

Лучше взлянуть вот эту статью http://en.wikipedia.org/wiki/UTF-16
В ней более подробно описана эта запутаная ситуация с Юникод.


guav   (2007-10-31 22:31:00) [36]

И оттуда же
Unicode can often represent the same glyph in either a ''composed'' or a ''decomposed'' form: for example, the composed form of "Ä" is the single Unicode code point "Ä" (U+00C4), while its decomposed form is "A" + "¨" (U+0041 U+0308).

То есть CompareMem не всегда будет работать как требуется.


guav   (2007-10-31 22:30:00) [37]


> Давай не будем говорить о транспортной кодировке, к Юникод
> это имеет только косвенное отношеие.

Давай будем говорить о кодировке, используемой в W-функциях.

http://msdn2.microsoft.com/en-us/library/ms776459.aspx
Unicode-enabled functions are often referred to as wide character functions, as described in Conventions for Function Prototypes. This designation is made because of the use of the UTF-16encoding, which is the most common encoding of Unicode and the one used for native Unicode encoding on Windows operating systems. Each code value is 16 bits wide, in contrast to the older code page approach to character and string data, which uses 8-bit code values.


Anatoly Podgoretsky   (2007-10-31 22:12:00) [38]

> guav  (31.10.2007 22:06:21)  [21]

Давай не будем говорить о транспортной кодировке, к Юникод это имеет только косвенное отношеие.


guav   (2007-10-31 22:06:00) [39]


> А насчет разных форм сболтнул кто то некомпетентный, на
> текущий момент есть только две формы ucs-2 и ucs-4 и других
> не предвидится.

Речь идёт о композиции и декомпозиции
Например, символ «á» может быть представлен как последовательность базового символа «a» (U+0061) и модифицирующего символа « ́» (U+0301) или как монолитный символ «á» (U+00C1).

Насчёт кодирования, читал в википедиии что в современных Windows Юникод не ucs-2, а UTF-16, просто зарезервинованные символы ucs-2 делоют её подмножетсвом UTF-16. В MSDN подтверждение не искал, пока не этот вопрос беспокоит.


Anatoly Podgoretsky   (2007-10-31 21:57:00) [40]

> guav  (31.10.2007 21:26:19)  [19]

Уважаю этот ресурс.
А насчет разных форм сболтнул кто то некомпетентный, на текущий момент есть только две формы ucs-2 и ucs-4 и других не предвидится.
При том смешно, когда Микрософт продвигал ucs-4 над ним смеялось сообщество ucs-2 и утверждало, что только ucs-2 а ucs-4 это ересь. Когда же Микрософт стал использовать ucs-2, то же самое сообщество стало использовать то чего обсмеивало.


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

Наверх

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