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 delete a channel with over 1,000 subscribers, you need to contact user support With the sharp downturn in the crypto market, yelling has become a coping mechanism for many crypto traders. This screaming therapy became popular after the surge of Goblintown Ethereum NFTs at the end of May or early June. Here, holders made incoherent groaning sounds in late-night Twitter spaces. They also role-played as urine-loving Goblin creatures. Hui said the messages, which included urging the disruption of airport operations, were attempts to incite followers to make use of poisonous, corrosive or flammable substances to vandalize police vehicles, and also called on others to make weapons to harm police. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more. Members can post their voice notes of themselves screaming. Interestingly, the group doesn’t allow to post anything else which might lead to an instant ban. As of now, there are more than 330 members in the group.
from us


Telegram C# Heppard
FROM American