Разница между вызовом экземпляра и статическим вызовом настолько мала, что я бы с радостью поспорил, что это не имеет никакого отношения к вашей проблеме производительности. Совсем. Да, статический вызов технически быстрее (на крошечную, крошечную сумму), но это ничто по сравнению со всеми файлами ввода-вывода, которые вы делаете. Как уже было сказано - профилируйте свой код и перестаньте беспокоиться о таких вещах (преждевременная оптимизация). Скорее всего, узким местом является низкая производительность сбора, возможно, это можно исправить с помощью словаря и т. Д.
Тайминги:
static: 154ms
instance: 156ms
Таким образом, разница в 2 мс по сравнению с 50 млн. Звонков! Забудь об этом ...
На основании:
class Program
{
static void Main()
{
StaticMethod(); // JIT
Program p = new Program();
p.InstanceMethod(); // JIT
const int LOOP = 50000000; // 50M
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) StaticMethod();
watch.Stop();
Console.WriteLine("static: " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) p.InstanceMethod();
watch.Stop();
Console.WriteLine("instance: " + watch.ElapsedMilliseconds + "ms");
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
void InstanceMethod() { }
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
static void StaticMethod() { }
}
редактирование:
Если мы предположим (например), что мы создаем новый метод каждые 20 вызовов (if (i % 20 == 0) p = new Program();
), то метрики изменятся на:
static: 174ms
instance: 873ms
Опять же - недостаточно близко, чтобы указывать на узкое место, когда это более 50 миллионов вызовов, а у нас все еще меньше секунды!