Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Zero-allocation, native high-resolution timer for Unity. Suitable for micro-benchmarks and hot-path measurements

License

Notifications You must be signed in to change notification settings

HardCodeDev777/UltraTimerWindows

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

7 Commits

Repository files navigation

Unity C# C License Last commit Tag Top lang

πŸ”₯ UltraTimerWindows


πŸš€ Overview

UltraTimerWindows is a zero-allocation, native high-resolution timer for Unity, built on top of Windows QueryPerformanceCounter. Suitable for micro-benchmarks and hot-path measurements. Provides sub-millisecond and microsecond-level timing precision.

The overhead of the timer itself is negligible compared to typical Unity workloads.


✨ Features

  • ⚑ High-resolution native timing in pure C (WinAPI QueryPerformanceCounter)
  • 🧹 Zero GC allocations during measurement
  • πŸ”’ Deterministic and low-overhead
  • πŸ”₯ Suitable for micro-benchmarks and hot-path measurements
  • βš™οΈ IL2CPP & Mono compatible
  • 🧩 Scoped measurement via using
  • 🎞️ Profile sampling for each scope
  • πŸ”¬ Independent from Unity Profiler

πŸ“¦ Installation

Via UPM: https://github.com/HardCodeDev777/UltraTimerWindows.git?path=Unity


πŸ’» Usage

UltraTimerWindows provides very elegant and simple API:


πŸ’‘ Basic example of usage

using UnityEngine;
// Namespace
using HardCodeDev.UltraTimerWindows.Runtime;
public class TestTimer : MonoBehaviour
{
 // Timer
 private UltraTimerWindows _timer;
 private void Start() => _timer = new();
 
 private void Update()
 {
 using (_timer.Measure()) 
 {
 // Here you can call any methods you want to measure
 HeavyMethod();
 }
 // See results in the console
 Debug.Log($"Last elapsed: {_timer.State.lastElapsedMs} ms, " +
 $"total elapsed: {_timer.State.totalElapsedMs} ms, " +
 $"average: {_timer.State.averageMs} ms, " +
 $"called: {_timer.State.countOfCalling} times");
 }
 private void HeavyMethod()
 {
 for (int i = 0; i < 100000; i++)
 {
 float x = Mathf.Sqrt(i);
 }
 }
 
 // Don't forget about disposing!
 private void OnDestroy() => _timer?.Dispose(); 
}

🎞️ Profile Sampling

using (_timer.Measure("Name of Sample")) 
{
 // Here you can call any methods you want to measure
 HeavyMethod();
}

And then after running with enabled Profile you'll see:


🫑 Reset Timer

using (_timer.Measure()) 
{
 // Here you can call any methods you want to measure
 HeavyMethod();
}
if (_timer.State.countOfCalling == 1000) _timer.Reset();

Result:


That's it! Enjoy measuring your heavy stuff 😎


πŸ“„ License

This project is licensed under the MIT License. See the LICENSE.md file for full terms.

About

Zero-allocation, native high-resolution timer for Unity. Suitable for micro-benchmarks and hot-path measurements

Topics

Resources

License

Stars

Watchers

Forks

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /