在开发一个程序来计算由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:
应该是一样的,但是:
What should I do to make loops and timer accurate, Is there any way to do it? Or I have to go to hard and complex C code and DOS?
我认为这是在这个问题上给我错误的价值观的基本原因:Count Parallel port input frequency – C#
1)不要使用DateTime.Now进行性能测量,请使用StopWatch.2)“输出:应该相同,但是……”
为什么他们呢?您正在非RTOS(实时操作系统)上运行托管/ JIT代码.如果操作系统感觉像你那么代码可以随时被反弹.是什么让你相信在这种环境中运行相同的代码N次应该总是产生相同的结果到如此小的程度?
3)Windows上的定时器分辨率约为15ms.对于非常准确的时序,最好的选择是支持它的系统(CPU)上的HighPerformanceTimer API.你甚至没有向我们展示计时器的间隔.
你在这里没有考虑很多变量而你的预测基于错误的假设.你甚至测量过这段代码多少次?你是否考虑过第一次编译它所需的时间?你在发布模式下运行吗?通过VS?是否有许多任务在后台运行?我可以继续