Сравнение строк (на равенство)

17.04.20

Разработка - Механизмы платформы 1С

Исследуем, выигрышно ли применять СтрСравнить вместо "=". Заодно проверим временные затраты при передаче параметров по ссылке и по значению.

В текущей разработке есть несколько модулей (обработок), в работе которых выполняется много анализа строк на равенство. Код оптимизирован в достаточной степени, но выполнений сравнения все равно достаточно много.

Среди строковых функций Стр* - тоже есть функция сравнения:

 
 СтрСравнить(Строка1, Строка2)

Проанализируем, стоит ли применять данную функцию вместо обычной проверки на равенство "=".

Для этого написана тестовая внешняя обработка:

 
 Модуль объекта

В ней присутствует некоторое количество копипаста, прошу особо не придираться по этому поводу;)

Тестировать производительность будем штатным замером производительности. Анализ расхода памяти не проверял.

Эксперименты провожу на 1С:Предприятие 8.3 (8.3.16.1063), 64-бит, УФ.

И вот результаты тестирования

Сначала посмотрим на вызовы процедур сравнения по способу передачи параметров сравнения - по ссылке и по значению.

Вызовы с передачей параметров по значению:

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
122 СтрСравнитьНеравныеПоЗначению(Строка1, Строка2); 100 000 0,47021 3,34
57 СравнитьНеравныеПоЗначению(Строка1, Строка2); 100 000 0,465204 3,31
90 СтрСравнитьРавныеПоЗначению(Строка1, Строка1Копия); 100 000 0,449524 3,2
25 СравнитьРавныеПоЗначению(Строка1, Строка1Копия); 100 000 0,435197 3,09
    Итого 1,820135 12,94

 

Вызовы с передачей параметров по ссылке:

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
138 СтрСравнитьРавныеПоСсылке(Строка1, Строка1Копия); 100 000 0,464388 3,3
41 СравнитьНеравныеПоСсылке(Строка1, Строка2); 100 000 0,457277 3,25
106 СтрСравнитьНеравныеПоСсылке(Строка1, Строка2); 100 000 0,451031 3,21
73 СравнитьРавныеПоСсылке(Строка1, Строка1Копия); 100 000 0,428993 3,05
    Итого 1,801689 12,81

 

Видим, что вызовы методов с передачей параметров по значению - незначительно более затратны по времени выполнения. Вероятно, из-за создания копий передаваемых параметров.

А что же насчет сравнения строк?

Статистика сравнений с помощью "=":

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
150 Результат = Строка1=Строка2; 100 000 0,147104 1,05
146 Результат = Строка1=Строка2; 100 000 0,140452 1
158 Результат = Строка1=Строка2; 100 000 0,131109 0,93
154 Результат = Строка1=Строка2; 100 000 &0,125878 0,9
    Итого 0,544543 3,88

 

Статистика сравнений с помощью СтрСравнить():

Номер строки Строка Кол. Врем. (чистое) % (Врем.) (чистое)
163 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,192031 1,37
167 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,186851 1,33
175 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,185261 1,32
171 Результат = СтрСравнить(Строка1, Строка2); 100 000 0,170094 1,21
    Итого 0,734237 5,23

 

Если для анализа способа передачи параметров - не все так очевидно, то для анализа сравнения строк - сомнений нет. Выигрышнее пользоваться обычным сравнением с помощью оператора "=". СтрСравнить затратнее по времени на 35% (=(0,734237-0,544543) / 0,544543 *100).

Если дочитать до конца справку по СтрСравнить(), то видим: "См. также: СравнениеЗначений, метод Сравнить". Вероятно, СтрСравнить() внутри использует объект СравнениеЗначений. И это создает дополнительные накладные расходы.

Выводы

Передача параметров примитивных типов по значению имеет свои дополнительные затраты. Но такой оверхед доп.времени незначителен.

Для анализа строк на равенство не стоит... гм... выделываться и использовать СтрСравнить().

Часть 2. Но есть нюанс!

Вывод по анализу сравнения строк, сделанный выше, не совсем корректен. Я замылился на особенностях своей прикладной задачи и упустил важный нюанс.

Если перечитать встроенную справку СтрСравнить(), то видим: "Выполняет сравнение строк без учета регистра"... Т.е., сравнивать напрямую "=" и СтрСравнить - не совсем корректно, т.к. сами результаты выполнения оператора и функции могут быть различными.

Приводить поведение СтрСравнить к поведению оператора "=" не имеет смысла, т.к. СтрСравнить() и так изначально проигрывает по производительности. Но вот привести поведение "=" к СтрСравнить - мы вполне можем попробовать.

С большой вероятностью можно предположить, что "=" + два ВРег'а будут затратнее по производительности. Но "все, что можно проверить - нужно проверить".

Результаты выполнения "Результат = ВРег(Строка1)=ВРег(Строка2)":

Номер строки Строка Кол. Врем. (чистое)
126 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,234419
114 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,242221
122 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,251323
118 Результат = ВРег(Строка1)=ВРег(Строка2); 100 000 0,25332
    Итого 0,981283

 

ВРег(Строка1)=ВРег(Строка2) затратнее по времени выполнения, чем СтрСравнить() примерно на 30% - замеры немного плавают по времени.

Уточненные выводы

Если требуется сравнить строки с учетом регистра, то пользуемся "=". 

Если требуется сравнить строки без учета регистра, то пользуемся СтрСравнить().

 

Искренне Ваш, КО;)

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7443    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17666    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11222    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23757    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14730    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. bulpi 217 17.04.20 16:29 Сейчас в теме
Я смотрю, на карантине делать совсем нечего :)
Артано; +1 Ответить
2. ImHunter 327 17.04.20 16:39 Сейчас в теме
Угу... Тем более, когда в отпуске:(
AntoShiK86; +1 Ответить
3. kirillkr 29 17.04.20 17:23 Сейчас в теме
А разве равенство (знак =) не проверяет полное равенство в том числе и регистр символов? На сколько я помню "ЭтаСтрока" <> "эТАсТРОКА". В то время как СтрСравнить("ЭтаСтрока", "эТАсТРОКА") вернет 0, т.е. они равны.
Для чистоты эксперимента предлагаю тогда еще привести замеры с приведением значений в один регистр прежде, чем сравнивать с помощью операции равенства.
nekit_rdx; triviumfan; +2 Ответить
4. ImHunter 327 17.04.20 17:36 Сейчас в теме
(3) Кстати, да. Есть такой нюанс насчет регистра. Не учел, т.к. в моей прикладной задаче все в нижнем рег.
Допишу еще потом.
5. GreenDragon 23.04.20 06:45 Сейчас в теме
Нужна статья на сравнение производительности операций суммирования и вычитания двух чисел.
Dnki; Артано; +2 Ответить
6. ImHunter 327 23.04.20 06:50 Сейчас в теме
(5) Валяйте, заработайте звездочек.
7. GreenDragon 23.04.20 06:51 Сейчас в теме
(6) не, не, не! Я посмотрел ваши другие статьи - лучше я время на их чтение и реализацию потрачу)))
8. O_W 28.04.20 22:25 Сейчас в теме
Ждем статью как лучше написать С= А+Б или С=Б+А
9. LamerSoft 1348 08.05.20 14:18 Сейчас в теме
О-большое – интересует, а вы тут про атомарные операции )
10. пользователь 12.03.21 11:00
Сообщение было скрыто модератором.
...
11. пользователь 22.04.21 15:27
Сообщение было скрыто модератором.
...
12. пользователь 22.04.21 17:15
Сообщение было скрыто модератором.
...
13. пользователь 22.04.21 17:15
Сообщение было скрыто модератором.
...
14. пользователь 22.04.21 17:15
Сообщение было скрыто модератором.
...
15. Dnki 4 01.05.21 11:32 Сейчас в теме
Молодец! Люди должны иногда смотреть критично, задумываться над тем, что кажется для многих, неважным.
Suslik_Johns; +1 Ответить
16. AntoShiK86 31 21.06.23 05:57 Сейчас в теме
В не пробовали на длинных текстах. Json запросы, сравнивать или тому подобное. Есть ли различие?
17. ImHunter 327 23.06.23 17:16 Сейчас в теме
(16) Хотел попробовать. Раз спросили, то как-нить займусь.
Ну О-большое по понятным причинам вывести все равно не смогу.
18. Suslik_Johns 28.07.23 12:05 Сейчас в теме
Спасибо! Очень полезной мне сейчас оказалось статья!
Оставьте свое сообщение