تحتاج إلى تأخير ميكروثانية في تطبيق .NET لتقييد معدل إرسال البث المتعدد UDP

StackOverflow https://stackoverflow.com/questions/1631501

سؤال

أنا أكتب زوجًا من عميل/خادم UDP متعدد البث في C# وأحتاج إلى تأخير يتراوح بين 50-100 ميكروثانية (ميكروثانية) لتقليل معدل نقل الخادم.يساعد هذا على تجنب فقدان كبير للحزم ويساعد أيضًا في تجنب التحميل الزائد على العملاء المرتبطين بالإدخال/الإخراج على القرص.من فضلك لا تقترح Thread.Sleep أو Thread.SpinWait.لن أسأل إذا كنت بحاجة إلى أي منهما.

كانت فكرتي الأولى هي استخدام نوع ما من العداد عالي الأداء وإجراء حلقة بسيطة أثناء () للتحقق من الوقت المنقضي ولكني أرغب في تجنب ذلك لأنه يبدو مبتذلاً.ألن يؤدي ذلك أيضًا إلى ربط استخدام وحدة المعالجة المركزية لعملية الخادم؟

نقاط المكافأة للحل عبر منصة، أي.ليست محددة ويندوز.شكرا مقدما يا شباب!

هل كانت مفيدة؟

المحلول

سأستخدم ساعة التوقيف ولكن سوف تحتاج إلى حلقة

يقرأ هذا لإضافة المزيد من الامتدادات إلى ساعة الإيقاف، مثل ElapsedMicrothans

أو شيء من هذا القبيل قد يعمل أيضا

System.Diagnostics.Stopwatch.IsHighResolution يجب كن صادق

    static void Main(string[] args)
    {
        Stopwatch sw;
        sw = Stopwatch.StartNew();
        int i = 0;

        while (sw.ElapsedMilliseconds <= 5000)
        {
            if (sw.Elapsed.Ticks % 100 == 0)
            { i++; /* do something*/ }
        }
        sw.Stop();


    }

نصائح أخرى

من الأفضل عمومًا تحقيق أوقات نوم قصيرة جدًا من خلال حلقة دوران وحدة المعالجة المركزية (مثل النوع الذي تصفه).تريد عمومًا تجنب استخدام مكالمات المؤقت عالية الدقة لأنها قد تستغرق وقتًا طويلاً وتحرف النتائج.لن أقلق كثيرًا بشأن تثبيت وحدة المعالجة المركزية على الخادم لأوقات الانتظار القصيرة هذه.

أود تلخيص السلوك في الفصل على النحو التالي:

  • قم بإنشاء فصل يقوم منشئه الثابت بتشغيل حلقة دوران لعدة ملايين من التكرارات ويلتقط الوقت الذي يستغرقه.يمنحك هذا فكرة عن المدة التي ستستغرقها دورة حلقة واحدة على الأجهزة الأساسية.
  • قم بحساب قيمة uS/iteration التي يمكنك استخدامها لحساب أوقات النوم العشوائية.
  • عندما يُطلب منك النوم لفترة زمنية معينة، قم بتقسيم uS للنوم على قيمة uS/التكرار المحسوبة مسبقًا لتحديد عدد تكرارات الحلقة المطلوب تنفيذها.
  • قم بالتدوير باستخدام حلقة while حتى ينقضي الوقت المقدر.

ولقد شهدت مع هذا الشرط عندما كنت في حاجة إلى المزيد من الدقة مع طلبي المتعدد.

ولقد وجدت أن أفضل حل يقيم مع توقيت الوسائط المتعددة كما رأينا في <لأ href = "http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer" يختلط = "نوفولو"> هذا المثال .

ولقد استعملت هذا التنفيذ وأضاف TPL استدعاء المتزامن لذلك. يجب أن أرى SimpleMulticastAnalyzer مشروع لمزيد من المعلومات.

    static void udelay(long us)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        long v = (us * System.Diagnostics.Stopwatch.Frequency )/ 1000000;
        while (sw.ElapsedTicks < v)
        {
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine("" + i + " " + DateTime.Now.Second + "." + DateTime.Now.Millisecond);
            udelay(1000000);
        }
    }

هل نظرت إلى توقيت الوسائط المتعددة ؟ وربما كنت قد تجد في مكان ما مكتبة NET التي يلتف API يدعو في مكان ما.

وأود أن تثبط باستخدام تدور حلقة كما أنها تستهلك ويخلق عرقلة الموضوع. thread.sleep هو أفضل، وأنه لا يستخدم موارد المعالج أثناء النوم، انها مجرد شريحة الوقت. تحاول ذلك، وسترى من مدير المهام كيف CPU استخدام مسمار مع حلقة تدور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top