Что работает быстрее: СтрНайти или Подобно?

06.10.25

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

Задача. Есть регистр на 200 000 строк, с хранилищем значений, в котором лежит xml файл. Нужно сделать поиск по содержанию в этих файлах.

Задача

Есть регистр на 200 000 строк, с хранилищем значений, в котором лежит xml файл. Нужно сделать поиск по содержанию в этих файлах.

 

Делаем пример

Так как у меня есть обработка по загрузке в регистр из файла и при нажатии на кнопку делается 1 запись с уникальной записью.

 

Пробуем кликером.

 

Ладно… Это долго…. Поэтому дописываем цикл в коде сохранения

 

 

Но так как мы «крутой» прогер и хотим получить результат максимально быстро  - пишем код в одну строчку (можно в транзакцию поместить и будет еще быстрее):


 
 Рубрика научпок

Транзакция позволяет множество мелких операций заменять одной крупной, важно понимать, что вызов самой транзакции тоже занимает время. Поэтому если данных немного, можно обойтись и без транзакции, при этом она не должна быть очень большой т.е не забываем делить на оптимальные порции.  

Пока читали научпок, у нас уже записи приготовились (а если не прочитали, то читает - загружается 😡)

 

 Делаем тесты в обработке:

 

 

  1. Если написать алгоритм в одну строку (123 523):

 

 

  1. Тот же алгоритм, но в несколько строчек (129 572)

 

 

  1. Если использовать запрос (152 812, из которых 151 563, это взятие данных из хранилища, т.е 1 249 это время работы в запросе)

 

 

Если смотреть на форме списка, то, конечно, тут работает быстрее (пишите в комментариях, почему на форме работает быстрее 😇):

 

 

1514 – в одну строку

1976 - в несколько строк

2098 – это заполнить строку таблицы значений

3322 – это заполнение и выполнение запроса (3322-2098=1224) т.е в целом подобно работает быстрее

 

И приходим к выводу:

1) Что в моей задаче лучше использовать СтрНайти

2) Что Подобно работает быстрее

3) Код в строчку работает быстрее. НО лучше прочитайте статью (ведь код выполняется одинаково) 

4) Финальный код, на котором остановился я 

 

 

Буду рад узнать новые методики оптимизации, и на любую активность в комментариях.

Вступайте в нашу телеграмм-группу Инфостарт

хранилище значений 1с СтрНайти Подобно Оптимизация

См. также

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

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    19260    TitanLuchs    102    

130

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

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    11455    bayselonarrend    126    

64

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

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    19115    dsdred    77    

133

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

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

23.06.2024    20091    bayselonarrend    22    

168

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

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

13.03.2024    11401    dsdred    22    

84

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

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

24.01.2024    41942    YA_418728146    35    

75
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. paulwist 06.10.25 08:20 Сейчас в теме
Транзакция позволяет множество мелких операций заменять одной крупной


Про какие мелкие операции идёт речь??

... важно понимать, что вызов самой транзакции тоже занимает время.


Это вы про какую транзакцию пишите про 1С или про СУБД??

...Поэтому если данных немного, можно обойтись и без транзакции, при этом она не должна быть очень большой т.е не забываем делить на оптимальные порции.


А что делать если одна из порций не записалась/вывалилась с ошибкой??
6. abolior 06.10.25 12:15 Сейчас в теме
(1) Про какие мелкие операции идёт речь??
операций с диском. Заменяем много мелких операций с диском, одной большой.

А что делать если одна из порций не записалась/вывалилась с ошибкой??
В моем бы случае, можно было бы использовать Вызвать исключение
8. paulwist 06.10.25 13:18 Сейчас в теме
(6)
операций с диском. Заменяем много мелких операций с диском, одной большой.


Эээ, вы из 1С умеете управлять контроллером диска?? Покажите, как это делаете, очень интересно!!!

(6)
В моем бы случае, можно было бы использовать Вызвать исключение


Хорошо, вызвали исключение на ошибочной порции данных, а что делать с теми порциями, которые уже записаны и те, которые ещё не успели записать??
2. aleksey2 89 06.10.25 08:50 Сейчас в теме
Здесь многопочочность ускорит.
Каждый поток читает свои строки
3. RocKeR_13 1452 06.10.25 11:13 Сейчас в теме
Как-то сумбурно написано. Плюс зачем нужно было сюда добавлять уже заезженное сравнение быстродействия выполнения кода в одну или несколько строк, если цель была в другом? К тому же с выключенной отладкой не надо было бы ничего мудрить с вычислением разницы между однострочной и многострочной записями. Плюс ну как-то совсем некорректный пример выбрали: с практической точки зрения вы получили противоречащие выводы - вроде "Подобно" быстрее, а лучше использовать "СтрНайти". И тогда непонятно, вы решали-то в итоге какую задачу: практическую, когда учитывали время на подготовку данных, или теоретическую, когда вы для сферического коня в вакууме сравнивали напрямую поиск в запросе по подстроке с циклом и поиском методом СтрНайти? А как будет изменяться разница при росте/уменьшении количества строк? А что с точки зрения использования вычислительных мощностей?
5. abolior 06.10.25 12:05 Сейчас в теме
(3)
ю, когда вы для сферического коня в вак


Спасибо, за комментарий, в следующий раз напишу более структурировано


А как будет изменяться разница при росте/уменьшении количества строк?
на 20 строк СтрНайти отработало быстрее, в Подобно время выполнение запроса, было примерно столько же, но время обработки данных очень большое

А что с точки зрения использования вычислительных мощностей?
Тут не проверял, но думаю, что разница между методами не сильно большая будет

Плюс зачем нужно было сюда добавлять уже заезженное сравнение быстродействия выполнения кода в одну или несколько строк, если цель была в другом?
Потому что она заезженная, д и узнал про это относительно недавно
4. starik-2005 3192 06.10.25 11:37 Сейчас в теме
Если смотреть на форме списка, то, конечно, тут работает быстрее (пишите в комментариях, почему на форме работает быстрее 😇):
А что конкретно "работает быстрее"? Подобно или СтрНайти?
RocKeR_13; +1 Ответить
7. Diversus 2337 06.10.25 12:49 Сейчас в теме
Транзакция позволяет множество мелких операций заменять одной крупной


Это утверждение не верное.
Транзакции нужны для консистентной записи данных в базе данных.

Если у вас простой поиск в регистре, то транзакции не нужны.
9. paulwist 06.10.25 13:19 Сейчас в теме
(7)
Если у вас простой поиск в регистре, то транзакции не нужны.


Ммм, вы про какие транзакции "говорите" 1С или СУБД??
10. Diversus 2337 06.10.25 13:22 Сейчас в теме
(9)

Ммм, вы про какие транзакции "говорите" 1С или СУБД??


А какая разница? Метод НачатьТранзакцию() в 1С приводит к созданию транзакции на уровне СУБД.
11. paulwist 06.10.25 14:40 Сейчас в теме
(10)
А какая разница? Метод НачатьТранзакцию() в 1С приводит к созданию транзакции на уровне СУБД.


А если метод НачатьТранзакцию() в 1С не используется, то команда "простой поиск в регистре" не приводит к созданию транзакции на уровне СУБД, я правильно понял??
12. Diversus 2337 06.10.25 16:37 Сейчас в теме
(11) Транзакции нужны, чтобы фиксировать несколько операций с данными, чтобы они не "разъехались". Классический пример - это операции с банковскими переводами.
Банковский перевод - это как минимум две операции:
1. Списать деньги с отправителя.
2. Зачислить деньги получателю.

Представьте, что в процессе выполнения этих двух операций будет ошибка, и выполнится только шаг 1, а на шаге 2 будет ошибка и она не запишется. В этом случае нужно, чтобы операции были выполнены либо обе одновременно, либо ни одной. Поэтому и придумали механизм транзакций, тогда последовательность действий вот такая:
НачатьТранзакцию()
Попытка
  // Списать деньги с отправителя
  // Зачислить деньги получателю
  ЗафиксироватьТранзакцию();
Исключение
  ОтменитьТранзакцию();
КонецПопытки;
Показать


В этом случае все будет ОК. Если будет ошибка, то транзакция откатится и ничего не будет сделано с данными.

Когда же мы ищем данные ничего из этого не нужно.

Возможно нужна БЛОКИРОВКА данных регистра на время поиска, но это совсем другой механизм.
13. paulwist 06.10.25 16:51 Сейчас в теме
(12)
Когда же мы ищем данные ничего из этого не нужно.

Возможно нужна БЛОКИРОВКА данных регистра на время поиска, но это совсем другой механизм.


Из вашего ответа я не понял, команда "простой поиск в регистре" не приводит к созданию транзакции на уровне СУБД, ДА или НЕТ??
14. Diversus 2337 06.10.25 16:52 Сейчас в теме
15. paulwist 06.10.25 16:54 Сейчас в теме
(14) то есть, "простой поиск в регистре" приводит к созданию транзакции в СУБД, правильно??
16. Diversus 2337 06.10.25 16:57 Сейчас в теме
(15) Это троллинг? ))) НИКАКОЙ транзакции не создается. При поиске, выполняется запрос SELECT к СУБД и все. Для его работы не нужны никакие транзакции.

Транзакции используются КОГДА ДАННЫЕ ИЗМЕНЯЮТСЯ в базе данных.
При поиске данные изменяются?
Для отправки сообщения требуется регистрация/авторизация