TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1153 1.47K
День девятьсот тридцать седьмой. #TipsAndTricks
Как Измерить Прошедшее Время без Аллокаций
Есть много случаев, когда вам нужно вычислить время выполнения метода. Классический способ - использовать класс Stopwatch. Это ссылочный тип, поэтому его создание может увеличить нагрузку на сборщик мусора. В случае однопоточного приложения вы можете повторно использовать экземпляр, чтобы избежать создания большого количества экземпляров. Однако в многопоточном приложении может быть сложнее повторно использовать экземпляры. Вы можете использовать поле [ThreadStatic] или ObjectPool<Stopwatch>, но и за это придется заплатить производительностью.

Если вам не нужны все функции Stopwatch, такие как остановка и перезапуск секундомера, вы можете создать структуру, которая предоставляет только минимум функционала. Таким образом, можно легко замерить время без каких-либо аллокаций. Идея состоит в том, чтобы использовать значение Stopwatch.GetTimestamp() при инициализации структуры и при вычислении прошедшего времени. Затем вычислить разницу, чтобы получить искомое время.

// За основу взят код отсюда: https://github.com/dotnet/runtime/blob/26b6e4ea97a627ab800362b2c10f32ebecea041d/src/libraries/Common/src/Extensions/ValueStopwatch/ValueStopwatch.cs

using System.Diagnostics;
public readonly struct ValueStopwatch
{
private static readonly double _timeToTicks =
TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;

private readonly long _startTimestamp;

private ValueStopwatch(long startTimestamp)
=> _startTimestamp = startTimestamp;

public static ValueStopwatch StartNew()
=> new ValueStopwatch(GetTimestamp());

public static long GetTimestamp()
=> Stopwatch.GetTimestamp();

public static TimeSpan
GetElapsedTime(long start, long end) {
var delta = end - start;
var ticks = (long)(_timeToTicks * delta);
return new TimeSpan(ticks);
}

public TimeSpan GetElapsedTime()
=> GetElapsedTime(_startTimestamp, GetTimestamp());
}

Использование:
var stopwatch = ValueStopwatch.StartNew();
// измеряемый код
Console.WriteLine(stopwatch.GetElapsedTime());

Источник: https://www.meziantou.net/how-to-measure-elapsed-time-without-allocating-a-stopwatch.htm
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
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 →