Feedback

C# - Kernel Timer für Performancetests

Veröffentlicht von am 15.11.2007
(2 Bewertungen)
Für genaue Performancetests eignet sich der System.Threading.Timer ggf. nicht, da die TimerEvents nur dann kommen, wenn Windows nix anderes zu tun hat, also bei Idle.
Hier eine Möglichkeit den genaueren Timer des Kernels zu verwenden.
using System;
using System.Runtime.InteropServices;

namespace OperationalManagement
{
	/// <summary>
	/// FxCop Rule CA1060.
	/// This type contains members with the DllImport attribute. 
	/// Members with the DllImport attribute should be contained 
	/// in classes named NativeMethods, SafeNativeMethods, 
	/// or UnsafeNativeMethods.
	/// </summary>
	internal sealed class NativeMethods
	{
		/// <summary>
		/// private Ctor for static Class.
		/// </summary>
		private NativeMethods()
		{
		}

		/// <summary>
		/// DllImport von KERNEL32.
		/// </summary>
		/// <param name="nPfCt">Performancecounter.</param>
		/// <returns>true oder false.</returns>
		[DllImport("KERNEL32")]
		[return : MarshalAs(UnmanagedType.Bool)]
		internal static extern bool QueryPerformanceCounter(ref Int64 nPfCt);

		/// <summary>
		/// DllImport von KERNEL32.
		/// </summary>
		/// <param name="nPfFreq">Ferequenz.</param>
		/// <returns>true oder false.</returns>
		[DllImport("KERNEL32")]
		[return : MarshalAs(UnmanagedType.Bool)]
		internal static extern bool QueryPerformanceFrequency(ref Int64 nPfFreq);
	}

	/// <summary>
	/// For Performancetestings
	/// </summary>
	public sealed class KernelTimer
	{
		private Int64 _i64Frequency;
		private Int64 _i64Start;

		/// <summary>
		/// startet den Timer
		/// </summary>
		public void Start()
		{
			Reset();
			NativeMethods.QueryPerformanceCounter(ref _i64Start);
		}

		/// <summary>
		/// Zurücksetzen
		/// </summary>
		public void Reset()
		{
			NativeMethods.QueryPerformanceFrequency(ref _i64Frequency);
			_i64Start = 0;
		}

		/// <summary>
		/// stopt den Timer und liefert das Resultat
		/// </summary>
		/// <returns>double-Wert.</returns>
		public double End()
		{
			Int64 i64End = 0;
			NativeMethods.QueryPerformanceCounter(ref i64End);
			return ((i64End - _i64Start)/(double) _i64Frequency);
		}
	}
}
Abgelegt unter Timer, Kernel, Genau, Performance.

2 Kommentare zum Snippet

Stefan Knoll schrieb am 16.11.2007:
Dafür gibt es doch bereits eine Framework-Klasse:
System.Diagnostics.Stopwatch
Daniel K. schrieb am 03.12.2007:
System.Diagnostics.Stopwatch existiert z.B. für .NET 1.1 nicht.
Hier noch eine weitere Übersicht:
http://gpwiki.org/index.php/VB:Timers

und ein KB-Artikel:
http://support.microsoft.com/?scid=kb%3Ben-us%3B274323&x=6&y=16
 

Logge dich ein, um hier zu kommentieren!