Конференция "Начинающим" » Сравниваем строки
 
  • gosha51 (18.02.17 19:33) [0]
    Добрый вечер друзья. Подскажите, пожалуйста, каким образом быстрее и проще сравнить две unicode строки (разной длины, одинаковой длины - не важно). Использую Delphi XE8. По старой памяти я использую WideSameStr/WideSameText в зависимости от необходимости проверки на регистр, но чаще всего мне было бы достаточно побайтовое равенство (т.е. с учетом регистра). Так вот есть ли вероятность какой-либо ошибки, если я буду сравнивать две unicode строки просто знаком равенства? Не могу вспомнить в чем была проблема, и почему я отказался от этого как-то на заре delphi 2009, но вот сомнения остались.
  • gosha51 (18.02.17 20:05) [1]
    А по скорости WideSameStr чуть ли не в 200 раз медленнее, чем использование знака "=". Вот и думаю почему бы не использовать знак равенства для проверки.
  • Dimka Maslov © (20.02.17 12:07) [2]
    Если регистр не важен, то можно пользоваться знаком равенства, а если важен,
    можно попробовать WinApi функцию CompareStringEx
  • Кто б сомневался © (20.02.17 13:43) [3]
    Dimka Maslov ©
    API функция очень медленная, кажись раз в 6 в сравнении с указанными ниже.

    Тем более какая WinAPi функция, если язык позволяет писать под 4 платформы.

    Обычно использую.
    CompareStr
    CompareText
  • Кто б сомневался © (20.02.17 13:46) [4]
    Также в хелперах string есть пару функций.
    Набери переменную, нажми точку и Ctrl + Space набери первые буквы"Co" , редактор покажет список хелперов для string:
     
    MyVarString.
  • Rouse_ © (20.02.17 13:47) [5]
    так то оно конечно да:

    a, b: string;
    s: DWORD;
    I: Integer;
    Z: DWORD;
    CONST Count = 10000000;
    begin
     try
       Z := 0;
       a := '123';
       b := 'gssdfghdfhdfghdfhg';
       S := GetTickCount;
       for I := 0 to Count do
         if not WideSameStr(a, b) then
           Inc(Z);
       Writeln(GetTickCount - s);
       S := GetTickCount;
       for I := 0 to Count do
       if a <> b then
           Inc(Z);
       Writeln(GetTickCount - s);
     except
       on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
     end;
     readln;
    end.


    но, молодой человек, вы задумайтесь, как резко произойдет ускорение выполнения данного кода если мы изменим тип параметров (А и B) с "string" на "WideString" ;)
 
Конференция "Начинающим" » Сравниваем строки
Есть новые Нет новых   [118582   +31][b:0][p:0]