CSHARP_GEPARD Telegram 154
HasFlag #скорость

Недавно, как продвинутый, беседовал с Claude 4.0 Sonnet, который утверждал, что прямая битовая проверка (bitwise) наличия флага в enum быстрее, чем применение my_enum.HasFlag(flag). Я не поверил, так как проверял это пару лет назад, где-то в предоливьешные времена, после выхода .NET 5.

Напомню, что enum может хранить как бы несколько значений, и может рассматриваться как битовое поле, то есть набор флагов. Например, тип оператора и его значение. Делается это просто, с помощью атрибута FlagsAttribute (пройдите по ссылке, там много полезной информации по использованию флагов в enum).

[Flags]
public enum Operator: short {
None = 0x0,

// Flags
NonOperator = 0x0001,
Comparison = 0x0002,
...

// Comparison Operators
Equals = 0x0700 | Comparison,
NotEquals = 0x0800 | Comparison,
...

// Specific non-operators
Whitespace = 0x2000 | NonOperator,
Quotes = 0x2100 | NonOperator,
...
}

Согласно примеру выше, флаги нужны, когда наш код ветвится как от типа оператора, так и от самого оператора. Можно создать два enum'a, а можно запихать всё в один, как сделано в примере. Иногда это очень удобно, а иногда экономно, если мы, например, пишем компактные структурки.

По результатам тестирования чуда не произошло, и HasFlag имеет примерно ту же производительность, что и bitwise (см. скриншот для Windows или для macOS). Для полноты картины, я запихнул в тест то, что часто видел на разных проектах для выполнения подобной задачи - классифицировать значения в enum (проверка через массив, через HashSet и через switch).

Вывод: проверяем флаги через Enum.HasFlag, так как это читабельнее, да и поддерживать проще. Проверка через bitwise тоже хорошо, но только для пацанов, которым HasFlag не завезли.

Бенчмарк тут, а не в комментариях, так как его много.

P.S.: Коллега подтверждает, что шарплаб утверждает, что разница на низком уровне всё-таки есть. Может быть она и играет, когда мы наблюдаем небольшую разницу между bitwise и HasFlag. Она вылезает на Windows, при многочисленных перезапусках бенчмарка (её и сейчас видно в RatioSD). Удивительно, но на macOS всё стабильно.
👍16🔥8



tgoop.com/csharp_gepard/154
Create:
Last Update:

HasFlag #скорость

Недавно, как продвинутый, беседовал с Claude 4.0 Sonnet, который утверждал, что прямая битовая проверка (bitwise) наличия флага в enum быстрее, чем применение my_enum.HasFlag(flag). Я не поверил, так как проверял это пару лет назад, где-то в предоливьешные времена, после выхода .NET 5.

Напомню, что enum может хранить как бы несколько значений, и может рассматриваться как битовое поле, то есть набор флагов. Например, тип оператора и его значение. Делается это просто, с помощью атрибута FlagsAttribute (пройдите по ссылке, там много полезной информации по использованию флагов в enum).

[Flags]
public enum Operator: short {
None = 0x0,

// Flags
NonOperator = 0x0001,
Comparison = 0x0002,
...

// Comparison Operators
Equals = 0x0700 | Comparison,
NotEquals = 0x0800 | Comparison,
...

// Specific non-operators
Whitespace = 0x2000 | NonOperator,
Quotes = 0x2100 | NonOperator,
...
}

Согласно примеру выше, флаги нужны, когда наш код ветвится как от типа оператора, так и от самого оператора. Можно создать два enum'a, а можно запихать всё в один, как сделано в примере. Иногда это очень удобно, а иногда экономно, если мы, например, пишем компактные структурки.

По результатам тестирования чуда не произошло, и HasFlag имеет примерно ту же производительность, что и bitwise (см. скриншот для Windows или для macOS). Для полноты картины, я запихнул в тест то, что часто видел на разных проектах для выполнения подобной задачи - классифицировать значения в enum (проверка через массив, через HashSet и через switch).

Вывод: проверяем флаги через Enum.HasFlag, так как это читабельнее, да и поддерживать проще. Проверка через bitwise тоже хорошо, но только для пацанов, которым HasFlag не завезли.

Бенчмарк тут, а не в комментариях, так как его много.

P.S.: Коллега подтверждает, что шарплаб утверждает, что разница на низком уровне всё-таки есть. Может быть она и играет, когда мы наблюдаем небольшую разницу между bitwise и HasFlag. Она вылезает на Windows, при многочисленных перезапусках бенчмарка (её и сейчас видно в RatioSD). Удивительно, но на macOS всё стабильно.

BY C# Heppard




Share with your friend now:
tgoop.com/csharp_gepard/154

View MORE
Open in Telegram


Telegram News

Date: |

To view your bio, click the Menu icon and select “View channel info.” There have been several contributions to the group with members posting voice notes of screaming, yelling, groaning, and wailing in different rhythms and pitches. Calling out the “degenerate” community or the crypto obsessives that engage in high-risk trading, Co-founder of NFT renting protocol Rentable World emiliano.eth shared this group on his Twitter. He wrote: “hey degen, are you stressed? Just let it out all out. Voice only tg channel for screaming”. Ng was convicted in April for conspiracy to incite a riot, public nuisance, arson, criminal damage, manufacturing of explosives, administering poison and wounding with intent to do grievous bodily harm between October 2019 and June 2020. Concise To edit your name or bio, click the Menu icon and select “Manage Channel.”
from us


Telegram C# Heppard
FROM American