TGViewer
C# Heppard C# Heppard @csharp_gepard · 1.65K subscribers
Post #160 2.21K
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.NotSupported(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 удобен для работы с библиотекам на других технологиях.
  • 🔥 15
  • 👍 12
  • ❤ 1
  • 😁 1
  • 👀 1
More from @csharp_gepard
  1. Mar 13, 2026Ozon Tech Community .NET Meetup 24 марта, лофт Casa Picassa, 19:00 Ищем способы бороться с…
  2. Jan 20, 2026Ещё одна история про память #отдых Судя по комментариям специалистов и ценам на RAM в мага…
  3. Nov 25, 2025FastEnum #скорость Иногда нам нужно не просто быстро, а очень быстро. В этот момент в дело…
  4. Nov 20, 2025UnsafeAccessor #скорость Иногда возникает странное желание изменять приватные поля в класс…
  5. Nov 17, 2025Latency numbers every programmer should know Я всё время теряю эти циферки, особенно когда…
  6. Oct 29, 2025Dictionary.TryGetValue #скорость Уж сколько лет прошло и, вроде, все это знают. Но, тем не…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →