C# Programming

إتقان الميلي ثانية: قياس دقيق للوقت في C#

Spread the love

يُعدّ ضبط الوقت بدقة أمرًا بالغ الأهمية في العديد من مهام البرمجة، بدءًا من تسجيل الأحداث ووصولًا إلى قياس الأداء. وفي حين أن الثواني غالبًا ما تكفي، إلا أن العديد من التطبيقات تتطلب دقة بالميلي ثانية لضمان توقيت دقيق. وتتناول هذه المقالة كيفية تحقيق ذلك في لغة C#.

محتويات

  1. الأساسيات المتعلقة بالتاريخ والوقت في C#
  2. الاستخدام العملي للميلي ثانية في C#
  3. أمثلة عملية: الحصول على قيمة الميلي ثانية
  4. اختيار الطريقة المناسبة

الأساسيات المتعلقة بالتاريخ والوقت في 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 فقط عندما تكون الدقة العالية (المايكروثانية أو النانو ثانية) ضرورية للغاية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *