يُعدّ ضبط الوقت بدقة أمرًا بالغ الأهمية في العديد من مهام البرمجة، بدءًا من تسجيل الأحداث ووصولًا إلى قياس الأداء. وفي حين أن الثواني غالبًا ما تكفي، إلا أن العديد من التطبيقات تتطلب دقة بالميلي ثانية لضمان توقيت دقيق. وتتناول هذه المقالة كيفية تحقيق ذلك في لغة C#.
محتويات
- الأساسيات المتعلقة بالتاريخ والوقت في C#
- الاستخدام العملي للميلي ثانية في C#
- أمثلة عملية: الحصول على قيمة الميلي ثانية
- اختيار الطريقة المناسبة
الأساسيات المتعلقة بالتاريخ والوقت في C#
توفر لغة C# إمكانيات متينة للتعامل مع التاريخ والوقت من خلال هيكليّ DateTime
و DateTimeOffset
. فهذان الهيكلان يوفران خصائص وطرقًا متنوعة للتحكم في معلومات التاريخ والوقت. ومع ذلك، يتطلب الوصول المباشر للميلي ثانية فهمًا أعمق لهذه الأدوات.
الاستخدام العملي للميلي ثانية في C#
يكمن المفهوم الأساسي في فهم خاصية Ticks
. يمثل هيكل DateTime
نقطة زمنية، وترجع Ticks
عدد فترات الـ 100 نانوثانية منذ منتصف الليل، 1 يناير، عام 0001. للحصول على قيمة الميلي ثانية، نقسم قيمة Ticks
على TimeSpan.TicksPerMillisecond
(10,000).
أمثلة عملية: الحصول على قيمة الميلي ثانية
الطريقة الأولى: استخدام DateTime.Now.Ticks
هذا هو النهج الأكثر مباشرة للحصول على الوقت الحالي بالميلي ثانية:
using System;
public class MillisecondsExample
{
public static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
long milliseconds = ticks / TimeSpan.TicksPerMillisecond;
Console.WriteLine($"الوقت الحالي بالميلي ثانية: {milliseconds}");
}
}
الطريقة الثانية: استخدام Stopwatch
لقياس الوقت المنقضي
تتميز فئة Stopwatch
بقياس الوقت المنقضي، مما يوفر دقة أفضل للمدَد القصيرة مقارنةً باستخدام DateTime.Now
مباشرةً. وهذا مثالي لاختبار الأداء.
using System;
using System.Diagnostics;
public class StopwatchExample
{
public static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// التعليمات البرمجية التي سيتم توقيت تنفيذها...
System.Threading.Thread.Sleep(500); // محاكاة بعض العمل
stopwatch.Stop();
long milliseconds = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"الوقت المنقضي بالميلي ثانية: {milliseconds}");
}
}
الطريقة الثالثة: مؤقت عالي الدقة (للاحتياجات المتقدمة)
من أجل الدقة العالية، ضع في اعتبارك استخدام واجهة برمجة التطبيقات QueryPerformanceCounter
. ومع ذلك، تذكر أن هذا يعتمد على النظام الأساسي، وتختلف الدقة حسب الأجهزة. وعادةً ما لا يكون هذا ضروريًا إلا إذا كنت تحتاج إلى دقة دقيقة بالمايكروثانية أو النانو ثانية.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class HighResolutionTimerExample
{
public static void Main(string[] args)
{
long frequency;
long startTime;
long endTime;
QueryPerformanceFrequency(out frequency);
QueryPerformanceCounter(out startTime);
// التعليمات البرمجية التي سيتم توقيت تنفيذها...
System.Threading.Thread.Sleep(500); // محاكاة بعض العمل
QueryPerformanceCounter(out endTime);
long elapsedTicks = endTime - startTime;
double elapsedMilliseconds = (double)elapsedTicks / frequency * 1000;
Console.WriteLine($"الوقت المنقضي بالميلي ثانية: {elapsedMilliseconds}");
}
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
}
اختيار الطريقة المناسبة
اختر الطريقة الأنسب لاحتياجات تطبيقك. بالنسبة لمعظم السيناريوهات، توفر DateTime.Now.Ticks
أو Stopwatch
دقة كافية. استخدم QueryPerformanceCounter
فقط عندما تكون الدقة العالية (المايكروثانية أو النانو ثانية) ضرورية للغاية.