पर कॉल करते समय सीएलआर मेरे मुकाबले तेजी से कैसा है, जब मुझे कुछ आश्चर्यजनक (मुझे) मिला तो मैंने टाइमस्टैम्प उत्पन्न करने के विभिन्न तरीकों का परीक्षण किया।विंडोज एपीआई
विंडोज के GetSystemTimeAsFileTime
पी का उपयोग कर कॉलिंग/आह्वान DateTime.UtcNow
कि आंतरिक रूप से एक ही GetSystemTimeAsFileTime
के लिए CLR के आवरण का उपयोग करता बुला की अपेक्षा 3 गुना के बारे में धीमी है।
यह कैसे हो सकता है?
यहाँ DateTime.UtcNow
's implementation है:
public static DateTime UtcNow {
get {
long ticks = 0;
ticks = GetSystemTimeAsFileTime();
return new DateTime(((UInt64)(ticks + FileTimeOffset)) | KindUtc);
}
}
[MethodImplAttribute(MethodImplOptions.InternalCall)] // Implemented by the CLR
internal static extern long GetSystemTimeAsFileTime();
कोर CLR के wrapper for GetSystemTimeAsFileTime
:
FCIMPL0(INT64, SystemNative::__GetSystemTimeAsFileTime)
{
FCALL_CONTRACT;
INT64 timestamp;
::GetSystemTimeAsFileTime((FILETIME*)×tamp);
#if BIGENDIAN
timestamp = (INT64)(((UINT64)timestamp >> 32) | ((UINT64)timestamp << 32));
#endif
return timestamp;
}
FCIMPLEND;
मेरे परीक्षण कोड BenchmarkDotNet उपयोग:
public class Program
{
static void Main() => BenchmarkRunner.Run<Program>();
[Benchmark]
public DateTime UtcNow() => DateTime.UtcNow;
[Benchmark]
public long GetSystemTimeAsFileTime()
{
long fileTime;
GetSystemTimeAsFileTime(out fileTime);
return fileTime;
}
[DllImport("kernel32.dll")]
public static extern void GetSystemTimeAsFileTime(out long systemTimeAsFileTime);
}
और परिणाम:
Method | Median | StdDev |
------------------------ |----------- |---------- |
GetSystemTimeAsFileTime | 14.9161 ns | 1.0890 ns |
UtcNow | 4.9967 ns | 0.2788 ns |
CLR यह सीधे कॉल कर सकते हैं। Pinvoke marshalling परत के माध्यम से चला जाता है। –
@ डेविड हेफरनन जब भी पैरामीटर को मार्शलिंग की आवश्यकता नहीं है? – i3arnon
@ i3arnon: इसे साबित करने के लिए उन्हें कुछ विश्लेषण करना है। –