Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как оптимизировать код 1с v77 ? (число прочтений - 6741 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Как оптимизировать код 1с v77 ?
13. Апреля 2011 :: 07:59
Печать  
Есть код v77 ( В модуле проведения )

Код
Выбрать все
Если А>= 0 Тогда
   Если В = 1 Тогда
      // Двигаем регистр
   КонцЕсли;
КонцЕсли;
 



Будет ли улучшенный код работать быстрее ( желательно с обоснованием ).
Здесь А и В простые переменные и/или реквизиты документа ( не функции )

Код
Выбрать все
Если (А>=0 ) И (В = 1) Тогда
      // Двигаем регистр
КонцЕсли;
 


  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Как оптимизировать код 1с v77 ?
Ответ #1 - 13. Апреля 2011 :: 08:26
Печать  
Предположительно, в первом случае мимо пролетать должно быстрее (при А < 0).
А протестировать можно и по методу черного ящика, сняв замеры времени выполнения веток.
И если вопросы останутся, тогда можно и P-код проанализировать (но это более затратно).
« Последняя редакция: 13. Апреля 2011 :: 15:31 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #2 - 13. Апреля 2011 :: 08:30
Печать  
делаю ставку на первый код
  

1&&2&&3
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как оптимизировать код 1с v77 ?
Ответ #3 - 13. Апреля 2011 :: 08:36
Печать  
первый быстрее, ибо  клюшки проверяют все ветки условия, в отличие от снеговика или запроса (семёркиного)

ЗЫ:
"все ветки условия" - имеется ввиду что в семёрке будут проверены оба неравенства А=.. и В=..., тогда как в снеговике (или в чорном запросе клюшек) упрощенная логика, там В=.. проверится только  в том случае, если первое неравенство вернёт истину.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #4 - 13. Апреля 2011 :: 08:42
Печать  
Eprst писал(а) 13. Апреля 2011 :: 08:36:
первый быстрее, ибо  клюшки проверяют все ветки условия, в отличие от снеговика или запроса (семёркиного)

Да но если оба условия истинны то может выполнение двух операторов  <Если> будет дольше чем
одно <Если> c более сложным условием.

Ну также уже понял если оставлять два Если то более верхнее ставить из "селективности" результата сравнения.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #5 - 13. Апреля 2011 :: 08:58
Печать  
Eprst писал(а) 13. Апреля 2011 :: 08:36:
в семёрке будут проверены оба неравенства А=.. и В=...

интересно, а есть ли этому доказательства?
я понимаю что можно проверить А()=.. и В()=...
но А() и А две большие разницы
я понимаю, что тут наверно надо смотреть P-код
но может быть кто то смотрел или знает другой (изящный) способ доказательства
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #6 - 13. Апреля 2011 :: 09:05
Печать  
trad писал(а) 13. Апреля 2011 :: 08:58:
Eprst писал(а) 13. Апреля 2011 :: 08:36:
в семёрке будут проверены оба неравенства А=.. и В=...

интересно, а есть ли этому доказательства?
я понимаю что можно проверить А()=.. и В()=...
но А() и А две большие разницы
я понимаю, что тут наверно надо смотреть P-код
но может быть кто то смотрел или знает другой (изящный) способ доказательства

не знаю есть ли этому доказательство но из недавнего
это утверждается(насколько обоснованно не знаю) например в http://infostart.ru/public/83887/

ну да надо наверное смотреть либо в p-код
или знать правила граматики языка 1с77.
  
Наверх
 
IP записан
 
Artem N
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Местоположение: Киров
Зарегистрирован: 13. Апреля 2011
Re: Как оптимизировать код 1с v77 ?
Ответ #7 - 13. Апреля 2011 :: 09:07
Печать  
Обосновано всё, да.
ПКод можно посмотреть в декомпиляторе de1c77, там дизассемблер есть.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #8 - 13. Апреля 2011 :: 09:20
Печать  
Artem N писал(а) 13. Апреля 2011 :: 09:07:
Обосновано всё, да.
ПКод можно посмотреть в декомпиляторе de1c77, там дизассемблер есть.

а как обстоят дела с условным если
т.е. если такой код

Код
Выбрать все
	Х = ?(  (А >= 0 ) И ( В = 1 ),1,0);
	Если Х = 1 Тогда
		//
	КонецЕсли; 


  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #9 - 13. Апреля 2011 :: 09:28
Печать  
trad писал(а) 13. Апреля 2011 :: 08:58:
Eprst писал(а) 13. Апреля 2011 :: 08:36:
в семёрке будут проверены оба неравенства А=.. и В=...

интересно, а есть ли этому доказательства?
я понимаю что можно проверить А()=.. и В()=...
но А() и А две большие разницы
я понимаю, что тут наверно надо смотреть P-код
но может быть кто то смотрел или знает другой (изящный) способ доказательства

Для проверки в А() возвращаем истина, в Б() выполняем исключение, все - 77 дает исключение, а 8.1 проходит.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как оптимизировать код 1с v77 ?
Ответ #10 - 13. Апреля 2011 :: 09:33
Печать  
artbear писал(а) 13. Апреля 2011 :: 09:28:
trad писал(а) 13. Апреля 2011 :: 08:58:
Eprst писал(а) 13. Апреля 2011 :: 08:36:
в семёрке будут проверены оба неравенства А=.. и В=...

интересно, а есть ли этому доказательства?
я понимаю что можно проверить А()=.. и В()=...
но А() и А две большие разницы
я понимаю, что тут наверно надо смотреть P-код
но может быть кто то смотрел или знает другой (изящный) способ доказательства

Для проверки в А() возвращаем истина, в Б() выполняем исключение, все - 77 дает исключение, а 8.1 проходит.


Это понятно, тут вопрос в том, одинаково ли проверяются операнды и вычисления функций в условии ? (т.е А()=.. и А=..)

Склоняюсь, что одинаково.

Не даром же, в снеговике везде подчеркивают (например на оф. сайте) что реализован механизм упрощенной проверки выражений в условиях..
Значит , в семёрке проверяется всё (исключения - чорные запросы, там упрощенная логика).
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #11 - 13. Апреля 2011 :: 09:45
Печать  
Проверил  (8) через функции  при любых значениях параметров вычисляется два выражения.
Но действительно правомерна ли такая замена простой переменной на функцию ?


Но в этих примерах простейшие сравнения c переменными.
Так какой же код "оптимальный" ? ( два варианта из 0 или из 8 )
  
Наверх
 
IP записан
 
Artem N
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Местоположение: Киров
Зарегистрирован: 13. Апреля 2011
Re: Как оптимизировать код 1с v77 ?
Ответ #12 - 13. Апреля 2011 :: 10:13
Печать  
а как обстоят дела с условным если
т.е. если такой код

Код
Выбрать все
	Х = ?(  (А >= 0 ) И ( В = 1 ),1,0);
	Если Х = 1 Тогда
		//
	КонецЕсли; 


[/quote]

Всё точно так же. Не оптимизируется. "?" от "Если" отличается только тем, что на внутреннем стеке остаётся висеть переменная.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #13 - 13. Апреля 2011 :: 10:16
Печать  
Artem N писал(а) 13. Апреля 2011 :: 10:13:
а как обстоят дела с условным если
т.е. если такой код

Код
Выбрать все
	Х = ?(  (А >= 0 ) И ( В = 1 ),1,0);
	Если Х = 1 Тогда
		//
	КонецЕсли; 




Всё точно так же. Не оптимизируется. "?" от "Если" отличается только тем, что на внутреннем стеке остаётся висеть переменная.

значит получается что вариант 8 всегда медленее чем второй вариант из 0
  
Наверх
 
IP записан
 
Artem N
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Местоположение: Киров
Зарегистрирован: 13. Апреля 2011
Re: Как оптимизировать код 1с v77 ?
Ответ #14 - 13. Апреля 2011 :: 10:23
Печать  
Да.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как оптимизировать код 1с v77 ?
Ответ #15 - 13. Апреля 2011 :: 10:26
Печать  
А выложите de1c77, та что на проекте автора, у меня не работает.
Печаль
ЗЫ: илю сюда Ёпрст-у в подарок
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #16 - 13. Апреля 2011 :: 10:28
Печать  
Artem N писал(а) 13. Апреля 2011 :: 10:23:
Да.

ну а тогда рассмотрим случай когда оба условных выражения истинны.
Что в этом случае будет быстрее
два если в каждом одно логическое сравнение
или одно Если с  двумя логическими сраввнениями и одной логической операцией И

Как бы по числу операций первый вариант из 0 предпочтительней
но не пересилит ли все это лишний оператор "Если"
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #17 - 13. Апреля 2011 :: 10:33
Печать  
Артур меня не понял, но натолкнул на такую проверку

Перем а,б;
а=0;
Если (а=1)И(б>0) Тогда
     Сообщить("!");
КонецЕсли;

Ошибка: "Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)"

Вывод: проверяется все выражение.
  

1&&2&&3
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #18 - 13. Апреля 2011 :: 10:38
Печать  
Глубину поста (2) не осилил но из попытки осознания
появился еще один код

Код
Выбрать все
   Если А< 0 Тогда
   ИначеЕсли В = 1 Тогда
	// Двигаем регистр
   КонцЕсли; 

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #19 - 13. Апреля 2011 :: 14:34
Печать  
Сделал тесты
1cv77 релиз 25

в тестах вариант #1 это первый код из 0
в тестах вариант #2 это второй код из 0
в тестах вариант #3 это код из 18
в тестах вариант #4 это код из 13
Прогонял заведомо ложное для двух условий (-1 , -1 )
и заведомо истинное для двух условий      ( 1 ,  1 )
число итераций 15,000,000
обработка прилагается
  

test_95______________________.ert ( 31 KB | Загрузки )
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #20 - 13. Апреля 2011 :: 14:35
Печать  
Результаты теста
условие не выполнено

Вариант №1 число циклов =  А1 = -1 Б1 = -1 Время = 21247
Вариант №1 число циклов =  А1 = -1 Б1 = -1 Время = 21246
Вариант №1 число циклов =  А1 = -1 Б1 = -1 Время = 21255
Вариант №2 число циклов =  А1 = -1 Б1 = -1 Время = 28262
Вариант №2 число циклов =  А1 = -1 Б1 = -1 Время = 28267
Вариант №2 число циклов =  А1 = -1 Б1 = -1 Время = 28246
Вариант №3 число циклов =  А1 = -1 Б1 = -1 Время = 21673
Вариант №3 число циклов =  А1 = -1 Б1 = -1 Время = 21670
Вариант №3 число циклов =  А1 = -1 Б1 = -1 Время = 21677
Вариант №4 число циклов =  А1 = -1 Б1 = -1 Время = 39114
Вариант №4 число циклов =  А1 = -1 Б1 = -1 Время = 39121
Вариант №4 число циклов =  А1 = -1 Б1 = -1 Время = 39079


условие выполнено
Вариант №1 число циклов =  А1 = 1 Б1 = 1 Время = 29201
Вариант №1 число циклов =  А1 = 1 Б1 = 1 Время = 29229
Вариант №1 число циклов =  А1 = 1 Б1 = 1 Время = 29202
Вариант №2 число циклов =  А1 = 1 Б1 = 1 Время = 28830
Вариант №2 число циклов =  А1 = 1 Б1 = 1 Время = 28806
Вариант №2 число циклов =  А1 = 1 Б1 = 1 Время = 28818
Вариант №3 число циклов =  А1 = 1 Б1 = 1 Время = 28324
Вариант №3 число циклов =  А1 = 1 Б1 = 1 Время = 28296
Вариант №3 число циклов =  А1 = 1 Б1 = 1 Время = 28326
Вариант №4 число циклов =  А1 = 1 Б1 = 1 Время = 37842
Вариант №4 число циклов =  А1 = 1 Б1 = 1 Время = 37828
Вариант №4 число циклов =  А1 = 1 Б1 = 1 Время = 37831


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #21 - 13. Апреля 2011 :: 14:39
Печать  
Выводы <ЛочическийЕсли> проиграл остальным очень сильно.

Еще вывод Если более вероятно что условие чаще выдаст нет
то надо использовать вариант №1

Если более вероятно что оба условия выдают да
то надо использовать вариант №3
  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: Как оптимизировать код 1с v77 ?
Ответ #22 - 20. Апреля 2011 :: 04:52
Печать  
В глубокой древности учебы, препод настоятельно рекомендовал выяснять максимальную  вероятность выполнения условия и ставить его первым....
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #23 - 20. Апреля 2011 :: 07:43
Печать  
nicolas писал(а) 20. Апреля 2011 :: 04:52:
В глубокой древности учебы, препод настоятельно рекомендовал выяснять максимальную  вероятность выполнения условия и ставить его первым....

ну такие вещи нельзя отрывать от реализаций языков и компиляторов.

в том же ci порядок выполнения строго не определен.
a() & b()


эта  же ветка показывает что если
есть два условия и первое условие очень вероянто ( более 90%)
то наиболее быстрый способ это через отрицание первого условия. (см пост 18)
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как оптимизировать код 1с v77 ?
Ответ #24 - 20. Апреля 2011 :: 15:21
Печать  
Artem N писал(а) 13. Апреля 2011 :: 09:07:
посмотреть в декомпиляторе de1c77

феерично...
а закладка Исходный код, что должна содержать? там пусто.

стесняюсь спросить, а чего покажет после кзк-2?
  
Наверх
ICQ  
IP записан
 
Artem N
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Местоположение: Киров
Зарегистрирован: 13. Апреля 2011
Re: Как оптимизировать код 1с v77 ?
Ответ #25 - 21. Апреля 2011 :: 05:57
Печать  
spock писал(а) 20. Апреля 2011 :: 15:21:
феерично...
а закладка Исходный код, что должна содержать? там пусто.

стесняюсь спросить, а чего покажет после кзк-2?

Закладка "Исходный код" устарела. А КЗК-2 не декомпилируется Улыбка Покажет лишь список функций.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как оптимизировать код 1с v77 ?
Ответ #26 - 28. Апреля 2011 :: 05:28
Печать  
Дабы не создавать новую тему.

Что эффективнее:

1) Такая проверка на наличие реквизита шапки документа:
Код
Выбрать все
Если ПустоеЗначение(ИмяРеквизита) = 1 Тогда
	Возврат 0;
ИначеЕсли Метаданные.ОбщийРеквизитДокумента(ИмяРеквизита).Выбран() = 1 Тогда
	Возврат 1;
ИначеЕсли ПустоеЗначение(ВидДокумента) = 1 Тогда
	Возврат 0;
ИначеЕсли Метаданные.Документ(ВидДокумента).РеквизитШапки(ИмяРеквизита).Выбран() = 1 Тогда
	Возврат 1;
Иначе
	Возврат 0;
КонецЕсли;
 

(код уперт из стандартной конфы)

или же банально
Код
Выбрать все
Попытка Док.<ИмяРеквизита> = Значение; Исключение КонецПопытки; 



2) проверка существования колонки ТЗ
Код
Выбрать все
Попытка
	ТЗ.ПолучитьПараметрыКолонки(ИмяКолонки);
	Возврат 1;
Исключение
	Возврат 0;
КонецПопытки;
 



или же без эксепшенов:

Код
Выбрать все
Для й = 1 По ТЗ.КоличествоКолонок() Цикл
_ИмяКолонки = ТЗ.ПолучитьПараметрыКолонки(й);
Если нРег(_ИмяКолонки) = нРег(ИмяКолонки) Тогда
	Возврат 1;
КонецЕсли;
Возврат 0
 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как оптимизировать код 1с v77 ?
Ответ #27 - 28. Апреля 2011 :: 05:59
Печать  
проверка существования колонки ТЗ:


Код
Выбрать все
Если ТЗ.ВидимостьКолонки(ИмяКолонки,1) = -1 Тогда
    Сообщить("а нету нихрена колонки с идентификатором "+ИмяКолонки);
Иначе
    Сообщить("я-я, есть унатуре");
КонецЕсли;    

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать