Type a page name and press Enter. You'll jump to the page if it exists, or you can create it if it doesn't.
To create a page in a module other than kernel32, prefix the name with the module name and a period.
QueryPerformanceCounter (kernel32)
.
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
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.
<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;
namespace ConsoleApplication1 {
class Program {
public class HighResTimer {
[DllImport("kernel32.dll", SetLastError = false)]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
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());
}
}//end class Program
}
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.
The mechanism provided by the CLR that enables managed code to call static DLL exports.k
10/27/2022 9:24:28 PM - 114.37.143.20
Click to read this page
3/16/2007 7:58:32 AM - keneth_w23@yahoo.es-213.157.13.214
Please edit this page!
Do you have...
helpful tips or sample code to share for using this API in managed code?
corrections to the existing content?
variations of the signature you want to share?
additional languages you want to include?
Select "Edit This Page" on the right hand toolbar and edit it! Or add new pages containing supporting types needed for this API (structures, delegates, and more).