需要.NET应用程序微秒延迟节流UDP多播传输速率(Need microsecond delay i

2019-09-01 14:39发布

我正在写在C#UDP组播客户端/服务器对我需要的50-100微秒(微秒)的数量级上的延迟,以节流服务器传输速率。 这有助于避免显著数据包丢失,也有助于从超载是磁盘I / O密集型的客户不断。 请不要建议的Thread.Sleep或Thread.SpinWait。 如果我需要这类原因我不会问。

我首先想到的是使用某种高性能计数器,并做了简单的while()循环检查所经过的时间,但我想避免这种情况,因为它感觉kludgey。 那不是还挂在服务器进程的CPU利用率是多少?

积分为一个跨平台解决方案,即不特定于Windows。 在此先感谢你们!

Answer 1:

我会用秒表但需要一个循环

阅读这更多的扩展添加到秒表一样ElapsedMicroseconds

或者类似的东西,这可能工作太

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();


    }


Answer 2:

非常短的睡眠时间一般最好由CPU自旋循环来实现(像那种你描述)。 通常你要避免使用高精度计时器呼吁,因为他们自己可能需要的时间和扭曲的结果。 我不会太担心CPU挂服务器对于这么短的等待时间上。

我会在封装类的行为,如下所示:

  • 创建一个类,其静态构造函数运行的自旋循环数百万次迭代,并且捕获需要多长时间。 这给你一个循环周期需要多长时间底层硬件上的想法。
  • 计算,你可以用它来计算任意的睡眠时间美国/迭代值。
  • 当问睡的特定时间段,分裂我们的先前计算,以确定有多少循环迭代来执行美国/迭代值睡觉。
  • 旋使用while循环,直到估计时间过去。


Answer 3:

当我需要更精确与我的组播应用,我该要求有经验。

我发现,最好的解决办法居住与多媒体计时器在看到这个例子 。

我用这个实现,并添加TPL异步调用它。 你应该看看我SimpleMulticastAnalyzer项目的更多信息。



Answer 4:

你有没有看着多媒体计时器 ? 你也许可以找到一个.NET库的地方,包装API调用的地方。



Answer 5:

我不鼓励使用自旋循环,因为它消耗和产生阻塞线程。 Thread.sleep代码是更好的,它不会在睡眠时使用处理器资源,它只是切片的时间。 试试吧,你会从任务管理器中看到的CPU使用率尖峰与自旋循环。



Answer 6:

    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);
        }
    }


文章来源: Need microsecond delay in .NET app for throttling UDP multicast transmission rate