gifts2017

НЕ (а=б) vs (a "меньше-больше" б)

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

Периодически на работе возникает столь же бесполезно, сколь и забавная дискуссия по поводу того – что же правильней использовать в коде в условии: конструкцию НЕ (а=б) или (а<>б). Причем дискуссии порой разгораются нешутошные и чаепития затягиваются. Понятно что вопрос этот особенной производственной важности не имеет и какого то кардинального технологического прорыва в работе не даст. Но …
Попробуем порассуждать на эту отвлеченную от дела тему, и попутно возможно выяснить истину. Итак, предпосылки.
Условимся конструкцию НЕ (а=б) называть конструкцией А, а конструкцию (a<>б) называть конструкцией Б.
Декларируется, что конструкция А работает быстрее, легче читается в коде да и вообще более логична. Основывается данное высказывание на том, что в данной ситуации, если рассуждать низкоуровнево кроется две очень простых и быстрых операции – сравнение двух чисел на равенство, в результате которой по идее выставляется бит – либо да, либо нет – 1 или 0. А потом булево отрицание этого самого по идее бита. Как там устроена 1С внутри – фиг его знает. Но рассуждаем чисто гипотетически. С тем же успехом можно порассуждать о подобных конструкциях в языке паскаль или С. Итак – декларируются две простейшие операции - проверка на равенство двух переменных и дальше отрицание этого результата. Напротив же в конструкции Б, утверждается в сугубо служебных дискуссиях, выполняется две долгих инструкции – вначале проверка на меньше, потом проверка на больше. Основывается сей вывод на том что именно так, дескать, работал MS SQL Server 7.0 и там замена в условии запроса конструкции Б на А увеличивали скорость выполнения запроса чуть ли не в 1.5 раза. Моя же точка зрения состоит в том, что так быть не должно и просто не может. Хотя конечно же опять же никто не знает как устроена 1С изнутри – но если парсер/интерпретатор 1С реально считает это двумя условиями, грубо говоря, то это полный маразм. По идее, эти два значка (<>), идущие подряд говорят о том, что это одна операция на самом деле. И по идее и проще с точки зрения парсера/компилятора при обнаружении такой конструкции сравнить два операнда на равенство и выставить все тот же бит, но только инвертированный. В том плане что если равно – то бит = 1, иначе 0. Можно и наоборот – но тут не суть. В итоге по идее мы получаем в варианте Б одну быструю операцию и на выходе булево значения результата сравнения.
Вобщем для разрешения сией нешутошной дискуссии было бы неплохо выслушать самих разработчиков 1С по этому вопросу и наконец то выяснить все наболевшие вопросы :)
С точки же зрения удобочитаемости кода лично я читаю что первый вариант наиболее логичен, быстро и однозначно понимаем. К тому же как то хорошо ложится на нормальный русский язык и обычное в свободной форме логическое рассуждение. Хотя это конечно на любителя. Но … но …

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Герман (German) 25.07.08 11:09
2. Андрей Скляров (coder1cv8) 25.07.08 11:33
Я к этому вопросу подхожу чисто практически. )
Всегда использую второй вариант, потому как он состоит из 4 символов, против первого, который в 2 раза длинее. ) Если кто-то скажет что второй вариант требует переключения раскладки, то хочу заметить, что лично у меня это не так )
3. just (Just) 25.07.08 11:34
4. Страпот (Bobak) 25.07.08 11:38
Да уж. Ведь, делать мне нечего, даже взял и замеры произвел :). Разницы во времени исполнения нет.
А использую я обычно второй вариант, букв меньше :).
5. Андрей (automation1c) 25.07.08 11:41
(2) не понял где в два раза :) это видимо елси только переменные называются именно а и б. А ели переменные зовутся длинно ?
(4) пробовали в ЕСЛИ или условие в запросе ?
6. Brr (brr) 25.07.08 11:43
7. Страпот (Bobak) 25.07.08 11:45
(5) "НЕ()"-четыре символа, "<>"-два символа
Пробовал в "Если". С запросами это дольше, а мне лень.
8. Страпот (Bobak) 25.07.08 11:47
Кстати, если условие сложные то читабельность первого варианта хуже.
9. Андрей Скляров (coder1cv8) 25.07.08 11:53
(5) Какая разница как переменные зовуться? ) Главное что бы одинаково для двух вариантов ) Посчитай.
10. Евгений Мартыненков (JohnyDeath) 25.07.08 12:21
А мне удобней читать вариант Б.
11. Валерий Агеев (awa) 25.07.08 12:43
Первый раз слышу такой бред, что "<>" - это две операции.
Конкретно в виртуальной машине 1С конструкция А выполняется именно двумя операциями, конструкция Б - одной (занимался декомпиляцией, знаю). Но заметить разницу во времени выполнения практически невозможно. И на практике каждый пишет, как ему удобней, лично я всегда использую вариант Б.
Если же спускаться до ассемблера, то там вообще всего одна операция сравнения, которая выставляет сразу кучу флагов, и куча разных команд условных переходов.
Styvi; vasilykushnir; +2 Ответить 1
12. Сhe Burashka (CheBurator) 25.07.08 13:08
я гораздо чаще использую НЕ()..
и вообще - паранойя у меня... я не пишу
если док.получитьДокумент()=1
.. я пишу
если док.получитьДокумент()>0
ded00786; lomok; +2 Ответить 2
13. Аркадий Кучер (Abadonna) 25.07.08 13:26
(12).. я пишу если док.получитьДокумент()>0
Циклодол попробуй ;))))))))))
14. VasilyKushnir (vasilykushnir) 25.07.08 13:28
(11) +5
Второй однозначно.
Согласен также с (8) - именно читабельность первого варианта хуже. И вправду - зачем правой рукой через голову чесать левое ухо, если это можно гораздо удобнее сделать левой рукой?
ded00786; +1 Ответить
15. vip (vip) 25.07.08 13:37
16. Владимир (hogik) 25.07.08 14:07
(12)(Сhe Burashka)
“я пишу если док.получитьДокумент()>0”
Это не паранойя, а доверчивость. ;-)))
Ф=Док.ПолучитьДокумент();
Если Ф=0 Тогда
Если Ф=1 Тогда
Сообщить("Ошибка в 1С");
17. Андрей (automation1c) 25.07.08 14:16
Вообще конечно и тот и другой вариант не идеальны и оптимальным было бы использование как во многих языках конструкции a != b - и максимально понятно и максимально по русски.
18. VasilyKushnir (vasilykushnir) 25.07.08 14:55
(17) > и максимально понятно и максимально по русски.
Чудненько! Но по-русски все-таки ближе конструкция:
А ФигРавно Б
19. Lomok (lomok) 25.07.08 15:03
(2) Достаточно шаблоны настроить и не требует :)
20. Lomok (lomok) 25.07.08 15:06
Я юзаю <>, привык со школы еще...
21. Виктор (viksin) 29.07.08 09:27
Засисит от контекста употребления. Чаще вариант А.
(17) >и вообще - паранойя у меня... я не пишу
>если док.получитьДокумент()=1
>.. я пишу
>если док.получитьДокумент()>0
Хм, а я пишу
Если Док.ПолучитьДокумент() Тогда

Кстати, всё это на ИТС-дисках описано подробно довольно. Сокращения вообще не люблю, типа Док, вот они реально неудобны при чтении.
22. Максим Арендаренко (Larkin) 30.07.08 09:10
Как там устроена 1С внутри – фиг его знает.
23. BEPTEP (BEPTEP) 30.07.08 09:57
А<>Б работает быстрее чем НЕ(А=Б), судя по тесту (код ниже):
Код
 
Процедура Сформировать()
   а=0;
   б=0;         
   Сообщить("Старт <>:"+ТекущееВремя());
   Для й=1 По Колво Цикл
      Если а<>б Тогда
      КонецЕсли;
   КонецЦикла;                          
   Сообщить("Стоп <>:"+ТекущееВремя());
   
   Сообщить("Старт НЕ:"+ТекущееВремя());
   Для й=1 По Колво Цикл
      Если НЕ (а=б) Тогда
      КонецЕсли;
   КонецЦикла;                          
   Сообщить("Стоп НЕ:"+ТекущееВремя());
КонецПроцедуры

Показать полностью


В случае "Колво"= 100 млн итераций время:
А<>Б работает 148 сек
НЕ(А=Б) работает 153 сек

з.ы. Налицо ЗНАЧИТЕЛЬНЫЙ прирост производительности. Те, кто пользует конструкцию "НЕаб" - еретики, НПППППППП на них не хватает... разрази их нуралиев!

з.ы.ы. 1с770027, dbf
24. Сергей Ожерельев (Поручик) 30.07.08 17:44
25. Андрей (automation1c) 30.07.08 17:48
(24) Скажи мне какие ветки ты посещаешь - и я скажу тебе кто ты (с) кто то из классиков :)
26. Андрей (automation1c) 30.07.08 17:54
(23) а наоборот попробуйте :) Ну то есть циклы местами поменять :) И результаты изменятся в обратную сторону
27. Сергей (Skynin) 30.07.08 21:45
Холивар так холивар.
1. Что подставит 1С или иной интерпретатор или компилятор вместо <> != - неизвестно. Вполне может быть что и подставляет некое НЕ (а=б). Или наоборот, вместо НЕ (а=б) - <>. Не программиста вобщем-то забота.
2. Читабельность у НЕ (а=б) - хуже в реальных случаях. Например сравниваем:
(ПеременнаяА + Переменная21 * 2) <> (ФункцияА(ПеременнаяНадцатая) * 3)
и
НЕ ((ПеременнаяА + Переменная21 * 2) = (ФункцияА(ПеременнаяНадцатая) * 3))

В первом варианте сразу видно что проверяется НЕравенство
А во втором стоит = и уж потом, где-то в начало нужно стрелять глазами чтобы узреть НЕ. Как будто специально запутывается чтение кода.
А если, как часто бывает сцеплено таких проверок через И или ИЛИ ? Причем одни выражения проверяются на равенство, а другие на неравенство? А везде = и где то-там, между сцепками, среди И ИЛИ встречаются НЕ.
<> != придумали для того чтобы читабельность была выше, а значит меньше ошибок совершалось.

Потому что как кем-то сказано:
Код программы читается людьми, и лишь иногда - выполняется компьютером.
28. Андрей Пушкин (Akela) 04.08.08 17:22
Красиво и точно: >> Потому что как кем-то сказано:
Код программы читается людьми, и лишь иногда - выполняется компьютером.
29. Андрей Пушкин (Akela) 04.08.08 17:25
Как-то столкнулся с чужим кодом написанным где-то так:

если этосклад= 1 Тогда
сООбщить("можно ") ;
else Конецесли
;


Хотел пойти утопиться с моста...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа