c# - c# 中信号线程的性能

标签 c# performance stopwatch autoresetevent

我一直在尝试了解“唤醒”正在等待诸如 AutoResetEvent 之类的阻塞构造的线程需要多长时间 - 根据我在阅读多次讨论后的理解,Windows 有一些一种内部时钟,每 15.6 毫秒(左右)“滴答”一次,然后决定接下来要运行哪些线程,所以我希望在线程唤醒之前向线程发送信号之间的时间差将在 0 之间随机时间-15.6 毫秒。 所以我写了这个小程序来测试我的理论:

static void Main(string[] args)
        {
            double total = 0;
            int max = 100;
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int i = 0; i < max; i++)
            {                
                AutoResetEvent eventHandle = new AutoResetEvent(false);
                double time1 = 0;
                double time2 = 0;
                Thread t1 = new Thread(new ThreadStart(() => time1 = f1(stopwatch, eventHandle)));
                Thread t2 = new Thread(new ThreadStart(() => time2 = f2(stopwatch, eventHandle)));
                t1.Start();
                t2.Start();
                t1.Join();
                t2.Join();
                double diff = time2 - time1;
                total += diff;
                Console.WriteLine("Diff = " + diff.ToString("F4"));
            }
            double avg = total / max;
            Console.WriteLine("Avg = " + avg.ToString("F4"));

            Console.ReadKey();
        }

        static double f1(Stopwatch s, AutoResetEvent eventHandle)
        {
            Thread.Sleep(500);
            double res = s.Elapsed.TotalMilliseconds;
            eventHandle.Set();
            return res;
        }

        static double f2(Stopwatch s, AutoResetEvent eventHandle)
        {
            eventHandle.WaitOne();
            return s.Elapsed.TotalMilliseconds;                        
        }

令我惊讶的是,平均唤醒时间约为 0.05 毫秒 - 所以显然我错过了一些东西,但我不知道是什么......

最佳答案

不是,15.625 毫秒是时钟节拍中断的周期。如果一个线程一直在运行而没有阻塞,它允许调度程序中断一个线程,并且调度程序决定另一个线程应该轮到。

阻塞的线程将在调用 WaitXxx() 时被抢占。或者 Sleep() 调用。不管时钟滴答中断。

同样值得注意的是,休眠线程只能在时钟中断滴答时恢复运行,这就是 Thread.Sleep(1) 实际上休眠 15.6 毫秒的原因。计时器、DateTime.Now 和 Environment.TickCount 也具有这种精度,时钟由中断递增。

关于c# - c# 中信号线程的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468296/

相关文章:

c# - DbContext 在不同类中的行为不同

c# - LINQ 查询以识别系列中的片段

c# - 在 aspx 上获取 ascx

c# - 如何检查 C# 中的性能计数器?

c# - 如何从 sql server 播放 mp3 字节 block ,使用 C# 传输到桌面客户端(通过 wcf)?

php字符串是值类型?

javascript - JQuery 1.3+ 选择器性能

c# - 每 3 秒显示一次程序运行时间

.Net 秒表和 Powershell

Android Chronometer 启动和停止但在停止时继续计数