gifts2017

Оптимизация функции ПодставитьПараметрыВСтроку

Опубликовал Андрей Смирнов (curdate) в раздел Программирование - Практика программирования

В типовых конфигурациях часто используется функция ПодставитьПараметрыВСтроку. Если параметров несколько, эту функцию использовать достаточно удобно. Но работает она довольно медленно - еще бы, ведь в ней каждый раз выполняется полный перебор всех символов в стоке. При активной работе со строками падение производительности становится заметным.

Конечно, можно пользоваться регулярными выражениями... Но с ними нужно разбираться, отлаживать. Поэтому я решил попросту оптимизировать существующую функцию. Первым делом откажемся от перебора - ведь в 1С есть функцкция Найти(), которая работае достаточно быстро. Не буду утомлять, сразу напишу результат:

На моем ноутбуке выполнение 10 000 раз стандартной функции занимает 37 секунд, оптимизированной - меньше секунды.

 
 Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
    Знач
Параметр1,    Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
    Знач
Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
    Знач
Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт

    Если
СтрокаПодстановки = Неопределено ИЛИ СтрДлина(СтрокаПодстановки) = 0 Тогда
        Возврат
"";
    КонецЕсли;

   
Результат = "";

   
НачПозиция = 1;

   
Позиция = Найти(СтрокаПодстановки, "%");

    Пока
Позиция > 0 Цикл
       
СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1);
        Если
СимволСтроки <> "%" Тогда
           
Позиция = Позиция + 1;
            Продолжить;
        КонецЕсли;
       
Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, Позиция - НачПозиция);

       
Позиция = Позиция + 1;
       
СимволСтроки = Сред(СтрокаПодстановки, Позиция, 1);

        Если
СимволСтроки = "1" Тогда
           
ЗначениеПараметра = Параметр1;
        ИначеЕсли
СимволСтроки = "2" Тогда
           
ЗначениеПараметра = Параметр2;
        ИначеЕсли
СимволСтроки = "3" Тогда
           
ЗначениеПараметра = Параметр3;
        ИначеЕсли
СимволСтроки = "4" Тогда
           
ЗначениеПараметра = Параметр4;
        ИначеЕсли
СимволСтроки = "5" Тогда
           
ЗначениеПараметра = Параметр5;
        ИначеЕсли
СимволСтроки = "6" Тогда
           
ЗначениеПараметра = Параметр6;
        ИначеЕсли
СимволСтроки = "7" Тогда
           
ЗначениеПараметра = Параметр7;
        ИначеЕсли
СимволСтроки = "8" Тогда
           
ЗначениеПараметра = Параметр8;
        ИначеЕсли
СимволСтроки = "9" Тогда
           
ЗначениеПараметра = Параметр9;
        ИначеЕсли
СимволСтроки = "%" Тогда
           
ЗначениеПараметра = "%";
        Иначе
            ВызватьИсключение
НСтр("ru='Входная строка СтрокаПодстановки имеет неверный формат: %';uk='Вхідний рядок Строкаподстановки має невірний формат: %'" + ЗначениеПараметра);
        КонецЕсли;
        Если
ЗначениеПараметра = Неопределено Тогда
           
ЗначениеПараметра = "";
        Иначе
           
ЗначениеПараметра = Строка(ЗначениеПараметра);
        КонецЕсли;
       
Результат = Результат + ЗначениеПараметра;
       
Позиция = Позиция + 1;
       
СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция);
       
Позиция = Найти(СтрокаПодстановки, "%");
    КонецЦикла;

    Если (
НачПозиция <= СтрДлина(СтрокаПодстановки)) Тогда       

        Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) - НачПозиция + 1);
    КонецЕсли;

    Возврат
Результат;
КонецФункции

Скачать файлы

Наименование Файл Версия Размер
Тест стандартной и оптимизированной функции 7
.erf 7,03Kb
21.04.12
7
.erf 7,03Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Ожерельев (Поручик) 23.04.12 10:21
(0) Это как понимать?

    Если (НачПозиция         Результат = Результат + Сред(СтрокаПодстановки, НачПозиция, СтрДлина(СтрокаПодстановки) - НачПозиция + 1);
    КонецЕсли;
2. Павел Никифоров (Lyns_owner) 23.04.12 10:27
Прикольная функция... а что так мало параметров принимает?)) Сделай хотя бы 500... xD
3. Андрей Смирнов (curdate) 23.04.12 10:30
(1) Поручик, Первый раз "Разукрашкой" пользовался, вот и накосячил чуть. Спасибо, сейчас исправлю.
4. ediks (ediks) 23.04.12 10:31
(2) Ну, самом деле функция очень часто используется в БСП (по крайней мере) и там действительно 9 параметров. Автор попытался оптимизировать ее, но неудачно выложил код, как верно заметил Поручик в (1)
5. Сергей Ожерельев (Поручик) 23.04.12 12:21
(2) Для количества параметров более 9 надо усложнять алгоритм разбора, а на практике используется максимум 4-5.