Имя: Пароль:
1C
1С v8
Загадка 1с, кто сможет ответить?
, ,
0 Elf56
 
12.05.17
08:56
Коллеги всем доброго времени суток.

Имеется 1С:Предприятие 8.3 (8.3.9.2170)

И очень простенькая обработка с самым простым текстом привожу его ниже


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    А = 0;
    Б = 0;
    
    ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    Для Ин = 1 По 100000 Цикл А = А + Ин; КонецЦикла;
    
    ВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВремяВыполненияВМиллисекундах = ВремяКонцаВыполнения - ВремяНачала;
    Сообщить(ВремяВыполненияВМиллисекундах);
    
    ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
    Для Ин = 1 По 100000 Цикл
        А = А + Ин;
    КонецЦикла;
    
    ВремяКонцаВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВремяВыполненияВМиллисекундах = ВремяКонцаВыполнения - ВремяНачала;
    Сообщить(ВремяВыполненияВМиллисекундах);
    
КонецПроцедуры

Теперь сам вопрос. В не зависимости какой будет цикл в одну строку первым или вторым он всегда будет выполняться в разы быстрее чем второй хоть он полностью скопирован с другого цикла, но просто размещен в одну строку у меня цикл в одну строку выполняется за 141, а цикл в три строки за 1000.

Кто знает причину этого? мне стало прямо интересно почему так? может это еще одна скрытая возможность оптимизации кода 1с ? )))
1 Naf2017
 
12.05.17
08:57
Баян
2 april
 
12.05.17
09:01
надо все типовые в одну строку переписать!
3 Кирпич
 
12.05.17
09:02
(0) напиши разработчикам 1с письмо с описанием данной проблемы. письмо напиши в одну строку, чтобы быстрее прочитали.
4 Elf56
 
12.05.17
09:05
(3) это ты пошутил или серьезно ? )))
5 Asmody
 
12.05.17
09:07
КакиеШуткиТутМироваяСенсация!!!111111одинодин
6 МихаилМ
 
12.05.17
09:07
давненько этого вопроса не было.

ах пятница.
7 Adilgeriy
 
12.05.17
09:08
(1) а по подробней
8 ShAV
 
12.05.17
09:08
(0) перед вторым циклом попробуй вставить   "А=0;"
9 Кирпич
 
12.05.17
09:08
о блин. я пятая колонна оказывается
10 Aleksey
 
12.05.17
09:09
11 ShAV
 
12.05.17
09:09
+(8) либо во втором цикле "А" исправь на "Б"
12 Elf56
 
12.05.17
09:10
(11) пробовал и с Б тоже результат тот же специально тут А два раза указал )
13 Elf56
 
12.05.17
09:10
(6) пятница да ) развлечение для мозга )
14 Кирпич
 
12.05.17
09:11
(7) эта фигня еще с 7.7 тянется
15 Крэкпэк
 
12.05.17
09:11
А если второй цикл тоже записать в одну строку, то он будет быстрее первого ))
16 golem14
 
12.05.17
09:12
у меня 48 и 196
17 Aleksey
 
12.05.17
09:12
18 kzot
 
12.05.17
09:12
(0) А повтори в обратном порядке.
19 mehfk
 
12.05.17
09:14
Ура! Пятничная тема!
20 Elf56
 
12.05.17
09:19
запустил предприятие не из конфигуратора а по ярлыку вот такие результаты выдало
172
203

остальная разница в 31 миллисекунду идет на специальный байт-код, который используется чтобы при развале с исключением в модуле, поставляемом без исходного кода, сориентироваться и выдать сообщение типа "Ошибка в строке 30". Это описано в теме ссылка на которую выше
21 Кирпич
 
12.05.17
09:22
(20) ну будем считать, что пофиксили. хотя могли бы обойтись и без "специальный байт-код" конечно
22 Гипервизор
 
12.05.17
09:23
(0)
230
242
А подсказать еще одну скрытую возможность оптимизации кода 1с так и быть могу: не объявлять неиспользуемые переменные.
23 Гобсек
 
12.05.17
09:23
(0)Лично для меня это новость. Но я могу предположить, что если цикл занимает несколько строк, то в случае зависания можно программу запустить под управлением отладчика, нажать на кнопку "пауза" и исполнение остановится внутри цикла. Если цикл занимает одну строку, то в случае зависания выявить место, где программа зациклилась, этим способом не получится. То есть выигрыш в производительности достигается за счет проигрыша в некоторых других отношениях.
Предлагаю ТС провести эксперимент и сообщить о результатах.
24 VanDiesel
 
12.05.17
09:24
Ну у тех кто начинал кодить на заре программирования или у тех кто кодил в ассемблере - такие вопросы не возникают.
25 dezss
 
12.05.17
09:25
26 Гобсек
 
12.05.17
09:32
(23)+ При проведении эксперимента цикл надо использовать бесконечный
27 Elf56
 
12.05.17
09:34
(23) именно поэтому если запустить предприятие из конфигуратора в режиме отладки будет разница не 172 и 203, а 141 и 1000
28 Elf56
 
12.05.17
09:35
интерпретатор тратит время на преобразование каждой строки для отладки
Ошибка? Это не ошибка, это системная функция.