c# – .Net中的计时器和循环是否准确?
在开发一个程序来计算由555定时器IC产生的脉冲的频率和脉冲宽度时,通过PC并行端口进入PC.我注意到每次运行代码时它都显示不同的值,所以我开始测试循环和定时器的准确性.我运行了以下代码,并指出它们不准确(我可能错了,请纠正我,如果我是!):
对于计时器: int sec = 0; private void button2_Click(object sender,EventArgs e) { sec = DateTime.Now.Second; i = 0; timer1.Enabled = true; } private void timer1_Tick(object sender,EventArgs e) { if (sec == DateTime.Now.Second) { i++; } else { timer1.Enabled = false; MessageBox.Show(i.ToString(),"Timer Output"); } } OUTPUT: 对于LOOP: private void button1_Click(object sender,EventArgs e) { i = 0; CheckForIllegalCrossThreadCalls = false; Thread t1 = new Thread(LoopTest); t1.Start(); } void LoopTest() { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); this.Cursor = Cursors.WaitCursor; while (true) { if (sw.ElapsedMilliseconds != 1000) { i++; } else { break; } } sw.Stop(); this.Cursor = Cursors.Default; MessageBox.Show(i.ToString(),"Loop Output"); } OUTPUT:
我认为这是在这个问题上给我错误的价值观的基本原因:Count Parallel port input frequency – C# 解决方法
1)不要使用DateTime.Now进行性能测量,请使用StopWatch.
2)“输出:应该相同,但是……” 为什么他们呢?您正在非RTOS(实时操作系统)上运行托管/ JIT代码.如果操作系统感觉像你那么代码可以随时被反弹.是什么让你相信在这种环境中运行相同的代码N次应该总是产生相同的结果到如此小的程度? 3)Windows上的定时器分辨率约为15ms.对于非常准确的时序,最好的选择是支持它的系统(CPU)上的HighPerformanceTimer API.你甚至没有向我们展示计时器的间隔. 你在这里没有考虑很多变量而你的预测基于错误的假设.你甚至测量过这段代码多少次?你是否考虑过第一次编译它所需的时间?你在发布模式下运行吗?通过VS?是否有许多任务在后台运行?我可以继续 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |