Имя: Пароль:
1C
1С v8
Поможет ли "Выполнить" увеличить производительность?
,
0 izekia
 
20.10.11
22:04
Вопрос в следующем, есть некоторый алгоритм обрабатывающий ячейки тз в зависимости от типа колонок, если я сделаю некий универсальный алгоритм, то добавится много лишних сравнений (жаль что 1С далек от функциональной программирования), но как вариант, я могу сгенерировать код и выполнить его, все необходимые данные будут помещены в доступные в локальном контексте реквизиты ...

в общем вопрос, стоит ли смотреть в эту сторону?
1 ДенисЧ
 
20.10.11
22:05
нет
2 Sk0rp
 
20.10.11
22:09
Да. Только рекомендую все алгоритмы оформить разными функциями и через выполнить только вызывать их.
3 kuza2000
 
20.10.11
22:19
"Выполнить" - это вначале компиляция кода, несоизмеримо более тяжелая операция, чем сравнение-переход в условии. Не может она быть быстрее (если, конечно, условий не миллион :) )

Сам использую "выполнить" только в редких случаях, если это может упростить код, повысить его читабильность/универсальность и при этом быстродействие не важно.
4 Mashinist
 
20.10.11
22:22
(3) "Выполнить" - это вначале компиляция кода...
Это конечно правильно
Но говорят 1Сина кеширует откомпилированные модули и если дергаться будет часто, то компилироваться будет только один раз
Так что не все так однозначно
5 kuza2000
 
20.10.11
22:47
(4) Хотя, если фрагменты кода строятся один раз, а потом многократно используются и не изменяются - все может быть, тут, конечно, тест бы не помешал...
Возможно, имеет значение - что сравнивается в условии. Если строки - это одно, а если числа или ссылки, или типы - то это очень-очень быстрые операции, сомневаюсь, что может что-то сравниться с этим. А стоимость перехода по времени практически нулевая по сравнению с любыми другими операциями.
6 kuza2000
 
20.10.11
23:32
В общем, простейший практический тест подтвердил (3) целиком и полностью. И никакое кэширование его не спасает.

   Сумма1 = 0;
   
   Соманда1 = "Сумма1 = Сумма1 + й";
   
   д = ТекущаяДата();
   Для й = 1 По 1000000 Цикл
       Выполнить(Соманда1);
   КонецЦикла;
   КА.ВремяВыполнения(д);
   
   Сумма1 = 0;
   
   д = ТекущаяДата();
   Для й = 1 По 1000000 Цикл
       Если й % 2 = 0 Тогда
           Сумма1 = Сумма1 + й;
       Иначе
           Сумма1 = Сумма1 + й;
       КонецЕсли;
   КонецЦикла;
   КА.ВремяВыполнения(д);

Результат:


Продолжительность: (35) 0 м 35 с
Продолжительность: (9) 0 м 9 с

Разница в 4 раза.
7 kuza2000
 
20.10.11
23:52
Хотя нет, я не правильно интерпретировал результаты. В общем, я увеличил число действий до 12-ти:

   Соманда1 = "
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;
   |Сумма1 = Сумма1 + й;";

Ну и в другом цикле 12 условий. В результате "Выполнить" обогнало:

Продолжительность: (72) 1 м 12 с
Продолжительность: (74) 1 м 14 с

В общем, кэширование есть и из-за него можно получить выигрыш в определенных случаях. Если код один раз строится, он действительно проще, чем было бы без выполнить и потом много раз используется.
8 izekia
 
21.10.11
10:01
(2) зачем функции - это замедлит только, лучше тупо вставлять нужный алгоритм
(3) спасибо, сам не успел затестить
(4) насколько я понимаю это относится только к модулям, а не к тексту, который передается параметром в Выполнить ...

а вообще интересно было бы узнать, кэширует ли 1С где-то эти тексты для того чтобы исключить повторную компиляцию
9 Reset
 
21.10.11
10:19
(4) "Выполнить" ... "кэширует модули"...
думать совсем отучились
10 НЕА123
 
21.10.11
10:23
(9)
пятница (с)
11 hhhh
 
21.10.11
10:31
(7)а почему в выполнить() делаешь без условий? Ты не филонь, пиши и в выполнить

     Если й % 2 = 0 Тогда
           Сумма1 = Сумма1 + й;
       Иначе
           Сумма1 = Сумма1 + й;
       КонецЕсли;

Тогда и посмотрим, правильно или неправильно ты синтерпретировал.
12 izekia
 
21.10.11
10:33
(11) в том то и суть, что ты нужную сумму подставляешь в текст и условие не нужно, оно отрабатывает при формировании текста
13 hhhh
 
21.10.11
10:37
(12) дык, й % 2 = 0 зачем? ОНо дает офигенную потерю производительности.

Пиши

   Для й = 1 По 1000000 Цикл
       Сумма1 = Сумма1 + й;
    КонецЦикла;

и увидитш, что выполнить() будет в пролете.
14 IamAlexy
 
21.10.11
10:39
я может тупой но не понимаю в чем смысл условия в (11)
15 hhhh
 
21.10.11
10:39
(13)+ деление в сотни раз медленнее сложения, нас ведь этому еще в школе учили.
16 НЕА123
 
21.10.11
10:40
Сумма1 = 0;
   
   Соманда1 = "       Если й % 2 = 0 Тогда"
           "Сумма1 = Сумма1 + й;"
       "Иначе"
           "Сумма1 = Сумма1 + й;"
       "КонецЕсли;";
   
   д = ТекущаяДата();
   Для й = 1 По 1000000 Цикл
       Выполнить(Соманда1);
   КонецЦикла;
   КА.ВремяВыполнения(д);
   
   Сумма1 = 0;
   
   д = ТекущаяДата();
   Для й = 1 По 1000000 Цикл
       Если й % 2 = 0 Тогда
           Сумма1 = Сумма1 + й;
       Иначе
           Сумма1 = Сумма1 + й;
       КонецЕсли;
   КонецЦикла;
   КА.ВремяВыполнения(д);
17 пипец
 
21.10.11
10:41
я вот не тупой но понимаю что ТС , явно далек от программирования и близок к троллизму
18 izekia
 
21.10.11
10:41
(9) сделал замеры, то что компилируется в Выполнить не кэшируется
19 izekia
 
21.10.11
10:42
(17) ты неправ по всем пунктам
20 IamAlexy
 
21.10.11
10:42
а я не верил чо г.внокод бывает....
глядя на эту ветку я понимаю как я ошибался...


а ведь намерения автора чисты и невинны...
21 izekia
 
21.10.11
10:43
(20) ты мой код где здесь видишь, друк?
22 НЕА123
 
21.10.11
10:44
товарищи!
может в ветку в Юмор? а?
я могу.
23 IamAlexy
 
21.10.11
10:45
(20) на воре и шапка горит?
сам походу подозреваешь г.внокод в своем коде? :)
24 izekia
 
21.10.11
10:48
(20) + (23) шикарно
25 izekia
 
21.10.11
10:50
(22) ветка вполне серьезная, если у тебя не получается представить ситуацию, где можно оптимизировать выполнение кода с помощью выполнить - это вои личные проблемы
26 Reset
 
21.10.11
10:54
(25) Скорее всего, здесь наоборот ситуация - ты не в состоянии нормально алгоритмизировать задачу, и идешь по легкому для тебя пути.

"оптимизировать ВЫПОЛНЕНИЕ кода с помощью выполнить" - Нонсенс.
27 izekia
 
21.10.11
11:04
(26) пример: мне надо сравнить две таблицы значений, колонки могут быть разного типа, для одних колонок при сравнении мне нужно делать приведение, для других этого не требуется. Объем большой, типы колонок меняются. Скомпилировать и выполнить код, который без дополнительных условий проведет сравнение мне кажется неплохим вариантом.
28 izekia
 
21.10.11
11:41
вот в принципе пример, на котором при увеличении количества итераций видно, что выполнить использовать оптимальнее:
   типЧисло = Тип("Число");
   типДата = Тип("Дата");
   типСтрока = Тип("Строка");
   а = Новый Массив(3);
   а[0] = 2;
   а[1] = "";
   а[2] = '20110101';
   Для инд = 1 по 10000 Цикл
       Для инда = 0 По 2 Цикл
           Если ТипЗнч(а[инда]) = типЧисло Тогда
               а[инда] = а[инда] + 10;
           ИначеЕсли ТипЗнч(а[инда]) = типСтрока Тогда
               а[инда] = СокрЛП(а[инда]);
           ИначеЕсли ТипЗнч(а[инда]) = типДата Тогда
               а[инда] = а[инда] + 86400;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
   
   Выполнить("Для инд = 1 по 10000 Цикл а[0] = а[0] + 10; а[1] = СокрЛП(а[1]); а[2] = а[2] + 86400; КонецЦикла;");
29 Mort
 
21.10.11
11:44
А где условия в Выполнить и выяснение типов?
30 izekia
 
21.10.11
11:47
(29) а, простите, зачем мне там условия, если я буду формировать текст на основании уже известных мне типов
я конечно могу добавить формирование текста с условиями, но на общую производительность это не повлияет
31 Mort
 
21.10.11
11:53
(30) Типы один хрен придется выяснять, до расчета или во время расчета.

А вообще всё это лажа.
32 izekia
 
21.10.11
11:58
(31) если я выясню до расчета, я смогу сформировать оптимальный алгоритм именно для этого набора типов

лажа? а с реализацией регулярных выражений не знаком?
33 izekia
 
21.10.11
23:42
спасибо всем парни за участие, особенно за замеры, реально быстрее
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший