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: |

In the next window, choose the type of your channel. If you want your channel to be public, you need to develop a link for it. In the screenshot below, it’s ”/catmarketing.” If your selected link is unavailable, you’ll need to suggest another option. best-secure-messaging-apps-shutterstock-1892950018.jpg On Tuesday, some local media outlets included Sing Tao Daily cited sources as saying the Hong Kong government was considering restricting access to Telegram. Privacy Commissioner for Personal Data Ada Chung told to the Legislative Council on Monday that government officials, police and lawmakers remain the targets of “doxxing” despite a privacy law amendment last year that criminalised the malicious disclosure of personal information. The Channel name and bio must be no more than 255 characters long How to build a private or public channel on Telegram?
from us


Telegram C# Heppard
FROM American