您的位置:首页 > 其它

Thread.Sleep和Timer性能比较

2015-11-24 11:23 295 查看
今天比较一下Timer和Sleep.

结果:Thread.sleep,问天下谁于争峰。

空间:

Type         work set      virtual bytes    page file bytes  Thread Count Handle  

Timer        8.990.720     114.978.816      11.444.224       4       115 

Thread.Sleep 6.590464      104.296.448      7.143.424        3        95

Thread.Sleep全胜

时间:

Type         start Time    Interval times   finish time 

Timer        11:53:37:416  10ms 100000      12:19:37:555 

Thread.Sleep 11:53:37:432  10ms 100000      12:19:36:713

Timer和Thread.Sleep打个平手,但Thread.sleep还是要强那么一点

分析:

Thread.sleep直接调用内核的指令,所在线程挂起,CPU执行队列的重排序。

Timer每次Elapsed会在线程池中取新的线程来执行,存在多次访问线程池的损耗。

测试代码:

[c-sharp] view
plaincopy

class Program  

{  

    private static System.Timers.Timer _timer;  

    private static volatile int _Max = 100000;  

    private static volatile int _ThreadMax = 100000;  

      

    static void Main(string[] args)  

    {  

        Console.WriteLine(System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  

        StartTimer();  

        Console.WriteLine(System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  

        StartThread();  

        Console.ReadLine();  

    }  

    static private void StartThread()  

    {  

        Thread s = new Thread(ThreadGo);  

        s.Start();  

    }  

    static private void ThreadGo()  

    {  

        while (true)  

        {  

            Thread.Sleep(10);  

            _ThreadMax--;  

            if (_ThreadMax < 0) break;  

        }  

        Console.WriteLine("ThreadGo" + System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  

        Thread.CurrentThread.Abort();  

    }  

    static private void StartTimer()  

    {  

        _timer = new System.Timers.Timer();  

        _timer.AutoReset = true;  

        _timer.Interval = 10;  

        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);  

        _timer.Start();  

    }  

  

    static void _timer_Elapsed(object sender, ElapsedEventArgs e)  

    {  

        _Max--;  

        if(_Max<0)  

        {  

            Console.WriteLine("_timer_Elapsed" + System.DateTime.Now.ToString() + System.DateTime.Now.Millisecond.ToString());  

            _timer.Stop();  

            _timer.Dispose();  

        }  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: