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

25.07.08

Разработка - Математика и алгоритмы

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

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    2748    stopa85    12    

36

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    6705    user1959478    50    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    2684    maksa2005    8    

25

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10242    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    3959    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3075    gzharkoj    14    

24

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    8889    7    kalyaka    11    

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

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

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


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

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

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

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

Потому что как кем-то сказано:
Код программы читается людьми, и лишь иногда - выполняется компьютером.
victor_kuin; +1 Ответить
28. Akela 19 04.08.08 17:22 Сейчас в теме
Красиво и точно: >> Потому что как кем-то сказано:
Код программы читается людьми, и лишь иногда - выполняется компьютером.
29. Akela 19 04.08.08 17:25 Сейчас в теме
Как-то столкнулся с чужим кодом написанным где-то так:

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


Хотел пойти утопиться с моста...
Оставьте свое сообщение