powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Бинарные операторы в перечислениях - зачем?
25 сообщений из 25, страница 1 из 1
Бинарные операторы в перечислениях - зачем?
    #38750015
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что, сильно производительнее будет писать

Код: c#
1.
2.
3.
4.
5.
6.
// Определение метода.
SetCooperativeLevel(CooperativeLevel level)
{...}

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground | CooperativeLevel.Exclusive);



вместо

Код: c#
1.
2.
3.
4.
5.
// Определение метода.
SetCooperativeLevel(params CooperativeLevel[] levels)

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground, CooperativeLevel.Exclusive);



В первом случае ещё надо постоянно держать в голове, что такое оператор "bitwise OR" и как это связано с перечислениями. Ведь не все перечисления заданы удобно для применения "bitwise OR" (т. е. рядом 1, 2, 4, 8 и т. д.). Т. е. надо ещё и знать, а можно ли для этого перечисления применять "bitwise OR", поглядывая в исходный код этого перечисления.

Вообще, откуда эта хрень пошла с "bitwise OR" в перечислениях? Программисты "старой закалки" повнедряли свои ненужные фичи из низкоуровневых языков?
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750018
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, вот реально... Я так понимаю, борьба идёт за читаемость-понимаемость и всё такое. За лямбды гоняют. А "bitwise OR" мало где применяется. И тут на тебе - всякую хрень с побитовыми операциями пишут, вместо простых и понятных широко применяемых выражений. Отцы-программисты совсем уже заигрались в богов и самодурство.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750028
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
// Определение метода.
SetCooperativeLevel(CooperativeLevel level, UserLevel userLevel)
{...}
// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground | CooperativeLevel.Exclusive, UserLevel.Guest | UserLevel.Blogger);


Код: c#
1.
2.
3.
// Определение метода.
SetCooperativeLevel(params CooperativeLevel[] levels  ?????)
{...}
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750070
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42Нет, вот реально... Я так понимаю, борьба идёт за читаемость-понимаемость и всё такое. За лямбды гоняют. А "bitwise OR" мало где применяется. И тут на тебе - всякую хрень с побитовыми операциями пишут, вместо простых и понятных широко применяемых выражений. Отцы-программисты совсем уже заигрались в богов и самодурство.
Какбэ мир не замыкается на .Net. Есть еще com-взаимодействия + WinAPI. Много где флаги применяются.
НемоКэп42Ведь не все перечисления заданы удобно для применения "bitwise OR" (т. е. рядом 1, 2, 4, 8 и т. д.). Т. е. надо ещё и знать, а можно ли для этого перечисления применять "bitwise OR", поглядывая в исходный код этого перечисления.
Исходный код не нужен. Enum для этого имеет атрибут Flags
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750071
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42, первый способ производительнее и удобнее. Производительнее т.к. нет выделения памяти под массив. Удобнее потому что операция проверки установлен один бит или несколько всегда вылядит так if ((val & mask) == mask). Во втором случае будет нужен цикл что удлинит код.

Флаги, как это называет .NET, нужны для редких ситуаций плотной упаковки значений на уровне битов и для взаимодействия с неуправляемым кодом.

НемоКэп42В первом случае ещё надо постоянно держать в голове, что такое оператор "bitwise OR" и как это связано с перечислениями. Это всегда означает установку битов. Не важно enum или число.

НемоКэп42едь не все перечисления заданы удобно для применения "bitwise OR" (т. е. рядом 1, 2, 4, 8 и т. д.).
А какая тебя разница? Enum дает тебе возможность глядеть на это с точки зрения наличия/отсутствия именованных значений забыв про биты.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750183
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
SetCooperativeLevel(CooperativeLevel.Foreground | CooperativeLevel.Exclusive);


Код: c#
1.
2.
var ForegroundAndExclusive = CooperativeLevel.Foreground | CooperativeLevel.Exclusive;
SetCooperativeLevel(ForegroundAndExclusive);
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750880
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убедили. :)
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750896
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42
Код: c#
1.
2.
3.
4.
5.
6.
// Определение метода.
SetCooperativeLevel(CooperativeLevel level)
{...}

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground | CooperativeLevel.Exclusive);



either

Код: c#
1.
2.
3.
4.
5.
// Определение метода.
SetCooperativeLevel(params CooperativeLevel[] levels)

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground, CooperativeLevel.Exclusive);




не кажется что в крайнем с низу варианте небрежное обращение с памятью, даже если рассматривать не в контексте вопроса?
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750953
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степине кажется что в крайнем с низу варианте небрежное обращение с памятью, даже если рассматривать не в контексте вопроса?
Угу. Добавляется неявный вызов new CooperativeLevel[]{ CooperativeLevel.Foreground, CooperativeLevel.Exclusive }, что разумеется хуже чем передача копии значения value-типа.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38750961
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
конечно, вот по этому и стоит заменять при проектирования типа ( особенного обобщенного) перегрузкой метода по количеству параметров.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751011
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи, зачем обязательно заменять, когда можно дополнить вариантом без аргументов, если это допустимо, и несколькими вариантами с конкретными аргументами. Используем Console.WriteLine и String.Concat как пример.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751016
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,
прав ( заменить убрать) - стоит использовать вместо param -
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751110
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиНемоКэп42
Код: c#
1.
2.
3.
4.
5.
6.
// Определение метода.
SetCooperativeLevel(CooperativeLevel level)
{...}

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground | CooperativeLevel.Exclusive);



either

Код: c#
1.
2.
3.
4.
5.
// Определение метода.
SetCooperativeLevel(params CooperativeLevel[] levels)

// Вызов метода
SetCooperativeLevel(CooperativeLevel.Foreground, CooperativeLevel.Exclusive);




не кажется что в крайнем с низу варианте небрежное обращение с памятью, даже если рассматривать не в контексте вопроса?
Когда в дотнете память считали, тем более, в таких мелочах? Ну много там памяти лишней уйдёт? Зато программировать удобнее не только бородатым зазнайкам из восьмидесятых-девяностых, но и тем, кому эти битовые операции по поводу и без не сдались.

После использования Expression и лямбд (а кое-кто ещё и рефлексией раньше заморачивался) в INotifyPropertyChanged для передачи имени параметра (чтобы строкой не писать) я ваших аргументов не понимаю.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751251
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42Когда в дотнете память считали, тем более, в таких мелочах?
Если клепаешь формочки, то да. Если высоко-нагруженное серверное приложение, то нужно думать о памяти в том числе.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751276
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЕсли высоко-нагруженное серверное приложение, то нужно думать о памяти в том числе.
bazileДобавляется неявный вызов new CooperativeLevel[]{ CooperativeLevel.Foreground, CooperativeLevel.Exclusive }, что разумеется хуже чем передача копии значения value-типа.

Хуже, но незначительно. На высоконагруженное серверное приложение это практически не повлияет. Тем не менее, вариант с флагами все равно ИМХО удобнее.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751322
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79ЕвгенийВЕсли высоко-нагруженное серверное приложение, то нужно думать о памяти в том числе.
bazileДобавляется неявный вызов new CooperativeLevel[]{ CooperativeLevel.Foreground, CooperativeLevel.Exclusive }, что разумеется хуже чем передача копии значения value-типа.

Хуже, но незначительно. На высоконагруженное серверное приложение это практически не повлияет. Тем не менее, вариант с флагами все равно ИМХО удобнее.
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
   [Flags]
    public enum E1
    {
        None = 0,
        Item1 = 1,
        Item2 = 2,
        Item4 = 4
    }
    public class Test
    {
        public static void M1(E1 e)
        {
            var x = e;
            Run();
        }
        public static void M2(params E1[] e)
        {
            var x = e;
            Run();
        }
        static void Run()
        {
            var x = Math.Sin(5);
        }
    }
 static void Main(string[] args)
        {
            const int x = 100000000;
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < x; i++)
            {
                E1 e = E1.Item1 | E1.Item4;
                Test.M1(e);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            sw = Stopwatch.StartNew();
            for (int i = 0; i < x; i++)
            {

                Test.M2(E1.Item1, E1.Item4);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);

            
            Console.ReadLine();
        }


У меня такой результат.
90942
1639851
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751358
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВУ меня такой результат.
90942
1639851
И что это показало? Что на 100 миллионах итераций разница составила 160 тысяч тиков? Это безусловно фантастическая нагрузка и глобальное проседание производительности.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751361
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79160 тысяч тиков?
Прошу прощения, 1,6 млн. Но сути предыдущего комментария это не изменило.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751368
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результаты вашего кода у меня на компьютере в мс:
6153
6568

Итого на 100 млн операций разница составила 400 мс. Или, на один вызов задержка составила 0.004 мкс (4 наносекунды, если я правильно посчитал). Считаю, что это допустимая задержка.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751376
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Результаты вашего кода у меня на компьютере в мс:
6153
6568

Итого на 100 млн операций разница составила 400 мс. Или, на один вызов задержка составила 0.004 мкс (4 наносекунды, если я правильно посчитал). Считаю, что это допустимая задержка.
А если скомпилировать в Release и запустить вне студии?
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751384
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВArm79Результаты вашего кода у меня на компьютере в мс:
6153
6568

Итого на 100 млн операций разница составила 400 мс. Или, на один вызов задержка составила 0.004 мкс (4 наносекунды, если я правильно посчитал). Считаю, что это допустимая задержка.
А если скомпилировать в Release и запустить вне студии?

Там еще интереснее (мс на 100 млн операций):
28
596

Затратно на несколько порядков, но в абсолютном выражении ничтожно
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751406
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
А так?
Код: 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.
  static void Main(string[] args)
        {
            const int x = 100000000;
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < x; i++)
            {
                E1 e = E1.Item1 | E1.Item4;
                Test.M1(e);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            Console.WriteLine(GC.CollectionCount(0));
            sw = Stopwatch.StartNew();
            for (int i = 0; i < x; i++)
            {

                Test.M2(E1.Item1, E1.Item4);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedTicks);
            Console.WriteLine(GC.CollectionCount(0));

            
            Console.ReadLine();
        }


А если ему (GC) нужно перелопачивать еще десятки миллионов объектов из 0 поколения?
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751415
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все в мс, тики в топку


из студии:
Код: plaintext
1.
2.
3.
4.
Debug      Release
6015        4100
0             0
6578        4666
476          476

извне:
Код: plaintext
1.
2.
3.
4.
5.
Debug      Release
4210        28
0             0
4795        591
476          476

ЕвгенийВА если ему (GC) нужно перелопачивать еще десятки миллионов объектов из 0 поколения?
GC заточен на то, чтобы обрабатывать кучу мелких ненужных объектов, они все вылетают на первом же поколении. А еще нужно юзать серверный GC
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751423
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
Заточен то он заточен, но из-за такой лабуды многие короткоживущие объекты уедут в первое поколение, а то и во второе, что не есть гуд.
Поимеем проблему на ровном месте.
...
Рейтинг: 0 / 0
Бинарные операторы в перечислениях - зачем?
    #38751919
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42,
НемоКэп42Когда в дотнете память считали, тем более, в таких мелочах? Ну много там памяти лишней уйдёт? Зато программировать удобнее не только бородатым зазнайкам из восьмидесятых-девяностых, но и тем, кому эти битовые операции по поводу и без не сдались.
Но это Ваше личное мнение, писать то Вы будете как старший скажет..
Don't worry, be happy
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Бинарные операторы в перечислениях - зачем?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]