А как насчет производительности?
Запуск приведенного ниже кода (LinqPad) привел к
1 000 000 000 Собственных операций: 358 930 064 тиков
1 000 000 000 Динамических c операций: 369 853 643 тиков
Поскольку в миллисекунде имеется 10 000 тиков, это работает в:
1 000 000 000 Собственные операции: 35 893 мс
1 000 000 000 Динамические c операции: 36 985 мс
var stopwatch = new Stopwatch();
var iterations = 1_000_000_000;
var rng = new Random();
var greaterThan = 0;
stopwatch.Start();
for (var iteration = 0; iteration < iterations; iteration++){
var (a, b) = (rng.Next(), rng.Next());
if (a > b) {
greaterThan++;
}
}
stopwatch.Stop();
Console.WriteLine($"{iterations:0,000} Native operations: {stopwatch.ElapsedTicks:0,000} ticks");
Expression<Func<int, int, bool>> GreaterThan = (a, b) => a > b;
var compiled = GreaterThan.Compile();
greaterThan = 0;
stopwatch.Reset();
stopwatch.Start();
for (var iteration = 0; iteration < iterations; iteration++)
{
var (a, b) = (rng.Next(), rng.Next());
if (compiled(a,b))
{
greaterThan++;
}
}
stopwatch.Stop();
Console.WriteLine($"{iterations:0,000} Dynamic operations: {stopwatch.ElapsedTicks:0,000} ticks");
То же самое, но с использованием лямбды (Func<int, int, bool>
) дало очень похожие результаты:
1 000 000 000 Собственные операции: 354 127 563 тика
1 000 000 000 Динами c операции: 401 450 782 тика
Или:
1 000 000 000 Собственные операции: 35 412 мс
1 000 000 000 Dynami c операции: 40 145 мс
Ускорение
Простой способ ускорить приведенный выше код - удалить случайное число из l oop. Простое использование 2 случайных чисел, сгенерированных до того, как один из разделов по времени значительно сокращает время выполнения, примерно до 3,1 секунды (Native) и 7,9 секунды (Dynami c).
Заключение
Итак в то время как использование динамической операции c вместо собственной операции, по-видимому, занимает вдвое больше времени, общее влияние на производительность, вероятно, будет подавлено остальной частью кода в l oop. Короче говоря, не беспокойтесь об этом, пока это действительно не станет проблемой.
Заключительные мысли
Вполне вероятно, что есть способ улучшить производительность проверки Dynami c но, вероятно, это снизит удобство сопровождения кода.
Отказ от ответственности: Время, показанное здесь, очень субъективно и зависит от специфики c компьютера с кодом