Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775

Оптимизировать логическое выражение?

20.01.2025, 10:52. Показов 3148. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая логика вычисления булевого значения:
C#
1
2
3
    public static bool IsAllowed(int a, int b, int c) => 
            (a == 1 || b == 1 || c == 1)
        && !(a == 2 || b == 2 || c == 2);
Именно с точки зрения логики вычисления есть какие-то варианты записи, которые позволят оптимизировать этот метод в плане производительности (меньше операций сравнения, меньше булевых операторов)?

Ну т.е. не в том смысле, чтобы текст метода сократить (через объединение значений в коллекцию и linq, например), а чтобы именно вычислений меньше стало. И без замены типов параметров на 'bool'.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2025, 10:52
Ответы с готовыми решениями:

Распознать логическое выражение
Добрый день! Есть ли в .NET функция которая может преобразовывать в логическое выражение строки типа "(true && false) ||...

Составить логическое выражение
Имеется 3 числа: a, b, c. Составить логические выражения, с помощью которых можно проверить истинность утверждений: • среди них есть хотя...

Строку в логическое выражение
Здравствуйте! Возник вопрос. Как из строки "True & False" можно сделать логическое выражение? Заранее спасибо.

37
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
21.01.2025, 08:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kotelok Посмотреть сообщение
А, сорь, если вы про последний вариант, то там да, придётся-таки предварительно как-то "нормализовывать" входные данные, чтобы любые прочие значения сводились к нулю.

может ли так случиться что "оптимизированные" If-ы просто перейдут в метод нормализации?
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
21.01.2025, 08:49
Цитата Сообщение от kotelok Посмотреть сообщение
Если на входе метода будет (4442, -58, 1)
тогда вам выгоднее проверять на неуспешность, так как вероятность получения значения 1 у вас будет 1:4млрд, получения двойки в следующем 1:4*4млрд, а получения двойки в двух кажется (4млрд*(4млрд/2)), но это не точно, в любом случае если распределение случайное, то вероятность поймать несовпадающее условие стремится к 100%.

Добавлено через 3 минуты
Цитата Сообщение от golosalex Посмотреть сообщение
может ли так случиться что "оптимизированные" If-ы просто перейдут в метод нормализации?
по сути и получится что проще проверять
C#
1
if ((a < 1 && b < 1 && c < 1) || (a > 1 && b > 1 && c > 1)) return false;
так как это условие будет в 99.99% случаев срабатывать.
1
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
21.01.2025, 09:43
Цитата Сообщение от kotelok Посмотреть сообщение
не в том смысле, чтобы текст метода сократить (через объединение значений в коллекцию и linq, например)
А чем LINQ не устраивает? Методы .All() и .Any(), очень подходящий инструмент для Вашего случая...
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
21.01.2025, 10:04
Цитата Сообщение от YuS_2 Посмотреть сообщение
А чем LINQ не устраивает?
а разве линк и скорость не взаимоисключающие вещи?
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,749
Записей в блоге: 2
21.01.2025, 11:01
Цитата Сообщение от belalugoci Посмотреть сообщение
а разве линк и скорость не взаимоисключающие вещи?
Не знаю если смысл вам что-то доказывать (вы ж редко что принимаете ), но "нет". Примерно с 8ой версии LINQ можно не считать таким. Его активно рефакторят и у него скорость может быть чуть хуже чистого кода, а часто и быстрее. Они сейчас активно используют Span, маршалинг и кучу разных оптимизаций.
0
jump
 Аватар для I can
5009 / 4803 / 852
Регистрация: 13.04.2015
Сообщений: 10,060
21.01.2025, 11:24
Цитата Сообщение от kotelok Посмотреть сообщение
ещё ноль может быть
А отрицательные?
Иначе
C#
1
public static bool IsAllowed(int a, int b, int c) => (a+b+c== 1);
Добавлено через 1 минуту
Цитата Сообщение от kotelok Посмотреть сообщение
Если на входе метода будет (4442, -58, 1)
Всё, увидел, не подойдёт....
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
21.01.2025, 11:34
kotelok, что-то мне подсказывает, что быстрее чем обычное сравнение ничто не принесет дополнительной "оптимизации".
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.01.2025, 12:41
Цитата Сообщение от wizard41 Посмотреть сообщение
что-то мне подсказывает, что быстрее чем обычное сравнение ничто не принесет дополнительной "оптимизации".
Ну, если про логику, то по идеи "да" -- сложно придумать что-то быстрее пяти сравнений на (не)равенство. Но вроде как можно дополнительно "выровнять" машинный код так, чтобы он максимально профитно грузился в CPU (без понятия как, но встречал 100 лет назад на хабре тему насчет этого) и вроде как есть смысл проследить чтобы компилятор не решил по своему "оптимизировать" код, т.к. существует не нулевая вероятность что он сделает хуже (тоже на хабре был разбор, но там речь уже вроде про C++).

Ещё по идеи можно извернуться и компилить не метод проверки, а сразу жирный кусок, в котором будет цикл + условие внутри него. Минус один стек вызова это как бы тоже не мало.

На мой взгляд, при большом желании и соответствующих знаниях про низкоуровневую работу (увы не про меня) можно нарыть где ускорить.

Добавлено через 10 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
Ещё по идеи можно извернуться и компилить не метод проверки, а сразу жирный кусок, в котором будет цикл + условие внутри него. Минус один стек вызова это как бы тоже не мало.
возможно оффтоп, но на всякий -- существует такая вещь как MethodImplOptions. Если я правильно понял задум сего атрибута, то указывает компилятору что нужно встраивать код метода в место вызова.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
21.01.2025, 12:52
Wolfdp, это можно прямо инлайнить в C++, а так же иногда использовалось в языках типа Pascal.
Если же речь чисто про шарп, то без unsafe такого не соорудить.

Добавлено через 1 минуту
Не говоря уже про *asm-вставки, но наверное в шарпе так нельзя...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.01.2025, 13:44
Цитата Сообщение от wizard41 Посмотреть сообщение
Если же речь чисто про шарп, то без unsafe такого не соорудить.
Вроде можно.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
new Neko1().Nya();
Console.WriteLine();
new Neko2().Nya();
 
class Neko1
{
    public void Nya()
    {
        Inner();
    }
 
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    private void Inner()
    {
        var current = Environment.StackTrace;
        Console.WriteLine(current);
    }
}
 
class Neko2
{
    public void Nya()
    {
        Inner();
    }
 
    [MethodImpl(MethodImplOptions.NoInlining)]
    private void Inner()
    {
        var current = Environment.StackTrace;
        Console.WriteLine(current);
    }
}
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
21.01.2025, 14:01
Цитата Сообщение от Wolfdp Посмотреть сообщение
возможно оффтоп, но на всякий -- существует такая вещь как MethodImplOptions. Если я правильно понял задум сего атрибута, то указывает компилятору что нужно встраивать код метода в место вызова.
я так делаю
C#
1
2
3
4
5
6
7
8
9
using System.Runtime.CompilerServices;
 
Console.WriteLine(Find());
 
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
static bool Find()
{
   return true;
}
0
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
21.01.2025, 14:10
Цитата Сообщение от wizard41 Посмотреть сообщение
Не говоря уже про *asm-вставки, но наверное в шарпе так нельзя...
мне бы тоже было интересно узнать как правильно их в шарпе делать.

пока что на ум приходит только сделать Pinvoke сишной функции обертки, у которой либо вставка либо вызов функции целиком написанной на ассемблере.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
21.01.2025, 14:23
Цитата Сообщение от wizard41 Посмотреть сообщение
asm-вставки, но наверное в шарпе так нельзя...
Цитата Сообщение от golosalex Посмотреть сообщение
мне бы тоже было интересно узнать как правильно их в шарпе делать.
https://github.com/Midiy/UseAsmCode
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
21.01.2025, 14:33
Цитата Сообщение от YuS_2 Посмотреть сообщение
https://github.com/Midiy/UseAsmCode
это пять же unsafe. Таких методик можно с десяток наковырять.
Интересует чистый код, возможно с подключением библиотек...

Добавлено через 1 минуту
З.Ы. прям сейчас не интересует, правда, но как-то ранее задавался этим вопросом.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.01.2025, 14:46
Цитата Сообщение от wizard41 Посмотреть сообщение
Интересует чистый код, возможно с подключением библиотек...
это невозможно априори, т.к. код компилится в промежуточный IL, который перед выполнением компилируется в машинный под конкретную платформу. Насколько знаю asm это под конкретные архитектуры, так что 100% придется "читерить".
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
21.01.2025, 14:49
Wolfdp, ну так про это я уже говорил ранее:
Если же речь чисто про шарп, то без unsafe такого не соорудить.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
21.01.2025, 14:51
Цитата Сообщение от Wolfdp Посмотреть сообщение
так что 100% придется "читерить".
Цитата Сообщение от wizard41 Посмотреть сообщение
это пять же unsafe.
Увлекательная история создания из первоисточника:
Разумеется, ни о какой безопасности (в том смысле, с котором это слово используется в C#) здесь не может быть и речи. Однако вышеописанный метод InvokeAsm() оперирует указателями, а значит, вызываться может только из блока, помеченного ключевым словом unsafe, что не всегда удобно — как минимум, это требует компиляции с ключом /unsafe (ну или соответствующей галочки в свойствах проекта в VS). Поэтому логичным кажется предоставить оболочку, оперирующую хотя бы IntPtr (на худой конец), а в идеале — и вовсе позволяющую пользователю указывать передаваемые и возвращаемые типы. Что ж, это звучит как generic, пишем generic, о чём тут ещё, спрашивается, говорить? На самом деле — есть о чём.
ссылка на хабр (боюсь, что это запрещено правилами и если вдруг, то прошу модераторов убрать ссылку)
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
21.01.2025, 15:03
Про asm это я просто привел в пример, т.с. в качестве "управляемого руками кода".
Понятно, что в шарпе напрямую такого не сделать - полагаемся на мозг компилятора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2025, 15:03

Разобрать в ПОЛИЗ логическое выражение
Предположим у нас есть логическое выражение типа Con(A \bigcup B)\bigcap Dil(!A). И его надо решить. Для решения я выбрал разбор...

Как посчитать собранное логическое выражение?
так - работает int d=12 &amp; 15; а вот так - нет int d=Convert.ToInt32(&quot;12 &amp;15&quot;); штука в том, что у меня логическое выражение...

Вычислить логическое выражение (есть ответ)
дело не в том что есть ответ - а в том что я не понимаю почему он правильный Есть ряд выражений: if (true | a / (1 - a)==1) ...

Записать логическое выражение сравнения дробей
Записать логическое выражение, определяющее какая дробь больше А/B или C/D.

Проверить является ли логическое выражение тождеством
Проверить является ли логическое выражение тождеством. Выполните задание в С#.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru