@msdn=http://search.microsoft.com/search/results.aspx?qu=$$$ @pinvoke=http://pinvoke.net/$$$.htm Summary: The QueryPerformanceCounter API !!!!C# Signature: [DllImport("kernel32.dll", SetLastError=true)] static extern bool QueryPerformanceCounter(out long lpPerformanceCount); !!!!VB.NET Signature: <DllImport("kernel32.dll", SetLastError:=True)> _ Shared Function QueryPerformanceCounter(ByRef lpPerformanceCount As Long) As Boolean End Function !!!!Manage C++ Signature: [DllImport("Kernel32.dll", SetLastError=true)] extern bool QueryPerformanceCounter(long *lpPerformanceCount); !!!!User-Defined Types: None. !!!!Notes: Arguably one of the most frequently used and most important PInvokes used, this is the only way in .NET to get a high performance counter for measurement, unique seeding of Random Variables (although you could perhaps transfer a GUID to a numeric equivalent), and in general what this global consultant would consider a 'must include' in almost any application where Instrumentation is a must. !!!!Tips & Tricks: For this particular method, execution time is often critical. Security can be traded for additional speed by applying the SuppressUnmanagedCodeSecurity attribute to the method declaration. This will prevent the runtime from doing a security stack walk at runtime. [DllImport("kernel32.dll"),SuppressUnmanagedCodeSecurity] static extern bool QueryPerformanceCounter(out long lpPerformanceCount); If you are interested in this API you are probably also looking for the QueryPerformanceFrequency API. !!!!VB.NET Sample Code: Imports System.Runtime.InteropServices Imports System.Security Friend Enum TimeState Started Stopped End Enum Public Class HighResTimer <DllImport("kernel32.dll"), SuppressUnmanagedCodeSecurity()> _ Private Shared Function QueryPerformanceCounter(ByRef lpPerformanceCount As Long) As Boolean End Function <DllImport("kernel32.dll"), SuppressUnmanagedCodeSecurity()> _ Private Shared Function QueryPerformanceFrequency(ByRef lpPerformanceFreq As Long) As Boolean End Function Private Shared freq As Long Shared Sub New() If Not QueryPerformanceFrequency(freq) Then Throw New System.ComponentModel.Win32Exception End If End Sub Private startTime, endTime As Long Private _duration As Double Private state As TimeState = TimeState.Stopped Public Sub Start() If state = TimeState.Started Then Throw New ApplicationException("Cant' start, already started") End If state = TimeState.Started QueryPerformanceCounter(startTime) End Sub Public Function [Stop]() As Double QueryPerformanceCounter(endTime) If state = TimeState.Stopped Then Throw New ApplicationException("Cant' start, already started") End If state = TimeState.Stopped _duration = ((endTime - startTime) / freq) Return _duration End Function Public ReadOnly Property Duration() As Double Get If state = TimeState.Started Then Throw New ApplicationException("Must call Stop() first") End If Return _duration End Get End Property End Class !!!!C# Sample Code: using System; using System.Runtime.InteropServices; public class HighResTimer { [DllImport("kernel32.dll", SetLastError = false)] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); [DllImport("kernel32.dll", SetLastError = false)] private static extern bool QueryPerformanceFrequency(out long lpPerformanceFreq); private static long freq; static HighResTimer() { if (!QueryPerformanceFrequency(out freq)) { throw new System.ComponentModel.Win32Exception(); } } private long startTime, endTime; private double duration; private bool timerStarted; public void Start() { if (timerStarted) { throw new ApplicationException("Cant' start, already started"); } timerStarted = true; QueryPerformanceCounter(out startTime); } public void Stop() { QueryPerformanceCounter(out endTime); if (!timerStarted) { throw new ApplicationException("Cant' start, already started"); } duration = (((endTime - startTime) / (double)freq)); timerStarted = false; } public double Duration { get { if (timerStarted) { throw new ApplicationException("Must call Stop() first"); } return duration; } } } static void Main(string[] args) { HighResTimer hrtimer = new HighResTimer(); hrtimer.Start(); //some code... For example: System.Threading.Thread.Sleep(1000); //End example hrtimer.Stop(); double time = hrtimer.Duration * 1000; Console.WriteLine("Time in miliseconds " + time.ToString()); } !!!!Alternative Managed API: There is a class named StopWatch (namespace System.Diagnostics) who uses the Performance Counter and Frequency functions. This class is within the 2.0 version of the .NET Framework. Documentation: QueryPerformanceCounter@msdn on MSDN, SuppressUnmanagedCodeSecurityAttribute@msdn on MSDN
Edit kernel32.QueryPer...
You do not have permission to change this page. If you feel this is in error, please send feedback with the contact link on the main page.