Полезные страницы:
- [Официальная документация](https://learn.microsoft.com/ru-ru/dotnet/api/system.diagnostics.stopwatch?view=net-7.0)
- [Хабр -> Под капотом у Stopwatch](https://habr.com/ru/articles/226279/)
Позволяет замерить время работы участка кода.
### Точность
в .Net-среде минимальное время замера 1 наносекунда (1 тик = 1 ns), но в Unity-среде (Mono или IL2CPP) минимальное время замера 100 наносекунд (1 тик = 1 ns).
Дело в том, что в Unity Stopwatch делает минимум 10 млн тиков в секунду, а в .NET StopWatch делает минимум 1 млрд тиков в секунду.
Сколько тиков делает StopWatch можно узнать, вызвав StopWatch.Frequency
Количество тиков, которые `Stopwatch` отсчитывает за единицу времени, может варьироваться в зависимости от системы. Это связано с тем, что `Stopwatch` опирается на частоту аппаратного таймера процессора, которая может отличаться от одной машины к другой.
Как сконвертировать тики в наносекунды:
```csharp
private static double TicksToNs(double ticks)
{
return ticks / (Stopwatch.Frequency / (double)(1000L * 1000L * 1000L));
}
```
### Измерение участков кода с маленьким временем выполнения
в Unity, операция, которая по факту занимает примерно 30 наносекунд, stopwatch (юнитевый) показывает значение от 0 до 2 тиков (от 0 до 200 нс).
### Тики StopWatch и тики TimeSpan
Если работаете с результатами Stopwatch в тиках, то не спутайте тики Stopwatch и тики TimeSpan.
Обратите внимание, что Stopwatch хранит результат в тиках по данному "адресу"
```csharp
tracker.ElapsedTicks
```
Когда вы используете свойство `Elapsed` класса `Stopwatch`, возвращаемый объект `TimeSpan` содержит информацию о времени, измеренном `Stopwatch`.
У `TimeSpan` имеются свои тики, где один тик равен 100 наносекундам. Это стандартное определение тика для `TimeSpan` во всей системе .NET.
```csharp
tracker.Elapsed.Ticks
```
### Как использовать
```csharp
//Инициализируем
var tracker = new Stopwatch();
```
Либо можно так инициализировать. Статический метод `StartNew()` создает новый экземпляр `Stopwatch` и сразу же начинает отсчет времени.
```csharp
var tracker = Stopwatch.StartNew(); // Создание и немедленный запуск
```
```csharp
//Запускаем секундомер
tracker.Start();
```
[[Stopwatch restart()|Пример]]
```csharp
//Можем сбросить значение секундомера без переинициализации
tracker.Restart();
```
```csharp
//Останавливаем секундомер
tracker.Stop();
//выводим полученное время.
var result = tracker.Elapsed.TotalMilliseconds;
Console.WriteLine("result: "+ result);
```
В каких единицах можно получить результат
```csharp
//Свойства ниже возвращают только компонент времени.
//Например, если скрипт выполнится за 1 sec и 100 ms, то будет выведено только 100ms
tracker.Elapsed.Microseconds;
tracker.Elapsed.Milliseconds;
//Свойства ниже возвращают итоговое время в единице времени в какой пожелаете.
tracker.Elapsed.TotalMicroseconds;
tracker.Elapsed.TotalNanoseconds;
//Два свойства ниже вернут одно и то же.
tracker.ElapsedMilliseconds;
tracker.Elapsed.Milliseconds;
```