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.
GFU-Schulungen  [Anzeige]

JavaScript für .NET-Entwickler

Sie sind .NET-Entwickler und nun stehen Sie vor der Aufgabe, JavaScript in Ihre Arbeit einzubinden. Die Schulung vermittelt Ihnen die JavaScript Grundlagen und die Funktionen der Scriptsprache. Sie wissen, wie objektorientierte Programmierung in JavaScript funktioniert und lernen abschließend Best Practicies Fälle kennen.

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

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!