CSHARP_GEPARD Telegram 160
Function pointer #скорость

Представим, что у нас есть подсистема вычисления. Один класс отвечает за выбор операции над значениями, а другой производит магию вычисления с использованием выбранной операции. В каждом из классов какая-то сложная логика, поэтому объединить их нельзя или сложно.

Пример: операции над формулами в Excel - до того как мы прочитаем формулу, мы не знаем, какая операция будет произведена над ячейками.

Условно, это выглядит вот так:
MathOperation operation = SelectOperation(Context);
Func<int, int, int> executor = operation switch {
MathOperation.Add => MathOperations.Add,
MathOperation.Subtract => MathOperations.Subtract,
MathOperation.Multiply => MathOperations.Multiply,
MathOperation.Divide => MathOperations.Divide,
_ => Error.NotSupportedOperation(operation, Context)
};

Calculator.Execute(executor, xValue, yValue);


Это работает быстро, но, благодаря "современному" C# (function pointer'ы появились аж 5 лет назад), подобные сценарии можно ускорить на 10-15%. Для этого нужно уйти в лёгкий unsafe, и заменить Func<int, int, int> на delegate*<int, int, int>. Мотивацию появления этого улучшения можно подсмотреть тут.

Этот финт даёт нам возможность выразить следующую мысль: уважаемый компилятор и рантайм, мы точно знаем расположение функции в памяти (указатель), пожалуйста, не трать время, а просто дёрни то, что сказал тебе умный программист.

Для библиотечного кода такой unsafe весьма оправдан (так как даёт хороший буст производительности). В случае обычного энтерпрайз-кода я бы такое не использовал никогда.

Бенчмарк тут, чтобы каждый мог убедиться, что мы действительно получаем профит.

P.S.: Коллега напоминает, что ещё function pointer удобен для работы с библиотекам на других технологиях.
🔥10👍6😁1👀1



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

Function pointer #скорость

Представим, что у нас есть подсистема вычисления. Один класс отвечает за выбор операции над значениями, а другой производит магию вычисления с использованием выбранной операции. В каждом из классов какая-то сложная логика, поэтому объединить их нельзя или сложно.

Пример: операции над формулами в Excel - до того как мы прочитаем формулу, мы не знаем, какая операция будет произведена над ячейками.

Условно, это выглядит вот так:

MathOperation operation = SelectOperation(Context);
Func<int, int, int> executor = operation switch {
MathOperation.Add => MathOperations.Add,
MathOperation.Subtract => MathOperations.Subtract,
MathOperation.Multiply => MathOperations.Multiply,
MathOperation.Divide => MathOperations.Divide,
_ => Error.NotSupportedOperation(operation, Context)
};

Calculator.Execute(executor, xValue, yValue);


Это работает быстро, но, благодаря "современному" C# (function pointer'ы появились аж 5 лет назад), подобные сценарии можно ускорить на 10-15%. Для этого нужно уйти в лёгкий unsafe, и заменить Func<int, int, int> на delegate*<int, int, int>. Мотивацию появления этого улучшения можно подсмотреть тут.

Этот финт даёт нам возможность выразить следующую мысль: уважаемый компилятор и рантайм, мы точно знаем расположение функции в памяти (указатель), пожалуйста, не трать время, а просто дёрни то, что сказал тебе умный программист.

Для библиотечного кода такой unsafe весьма оправдан (так как даёт хороший буст производительности). В случае обычного энтерпрайз-кода я бы такое не использовал никогда.

Бенчмарк тут, чтобы каждый мог убедиться, что мы действительно получаем профит.

P.S.: Коллега напоминает, что ещё function pointer удобен для работы с библиотекам на других технологиях.

BY C# Heppard




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

View MORE
Open in Telegram


Telegram News

Date: |

Clear The main design elements of your Telegram channel include a name, bio (brief description), and avatar. Your bio should be: Telegram has announced a number of measures aiming to tackle the spread of disinformation through its platform in Brazil. These features are part of an agreement between the platform and the country's authorities ahead of the elections in October. Activate up to 20 bots In the “Bear Market Screaming Therapy Group” on Telegram, members are only allowed to post voice notes of themselves screaming. Anything else will result in an instant ban from the group, which currently has about 75 members.
from us


Telegram C# Heppard
FROM American