В текущей разработке есть несколько модулей (обработок), в работе которых выполняется много анализа строк на равенство. Код оптимизирован в достаточной степени, но выполнений сравнения все равно достаточно много.
Среди строковых функций Стр* - тоже есть функция сравнения:
Проанализируем, стоит ли применять данную функцию вместо обычной проверки на равенство "=".
Для этого написана тестовая внешняя обработка:
В ней присутствует некоторое количество копипаста, прошу особо не придираться по этому поводу;)
Тестировать производительность будем штатным замером производительности. Анализ расхода памяти не проверял.
Эксперименты провожу на 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% - замеры немного плавают по времени.
Уточненные выводы
Если требуется сравнить строки с учетом регистра, то пользуемся "=".
Если требуется сравнить строки без учета регистра, то пользуемся СтрСравнить().
Искренне Ваш, КО;)