Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как оптимизировать код 1с v77 ? (число прочтений - 5465 )
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
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 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
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать