在开发一个程序时,计算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:应该是一样的,但是:
对于循环:
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:应该是一样的,但是:
我应该怎么做才能使循环和计时器准确,有什么方法可以做到吗?或者我必须去学习困难而复杂的C 代码和DOS?
我认为这是我在这个问题上得到错误价值观的根本原因:计算并行端口输入频率 - C# https://stackoverflow.com/questions/11499113/count-parallel-port-input-frequency-c-sharp
1)不要使用DateTime.Now
对于性能测量,使用StopWatch
.
2) "OUTPUT: Should be same, but ..
"
他们为什么要这么做?您正在非 RTOS(实时操作系统)上运行托管/JIT 代码。如果操作系统愿意的话,您的代码可以随时被退回。是什么让您相信在这种环境中运行相同的代码 N 次应该总是产生如此小的相同结果?
3) Windows 上的计时器的分辨率约为 15 毫秒。要获得非常准确的计时,最好的选择是支持它的系统 (CPU) 上的 HighPerformanceTimer API。您甚至没有向我们展示计时器的间隔。
您在这里没有考虑许多变量,并且您的预测基于错误的假设。您甚至测量了多少次此代码?您是否考虑了第一次编译所需的时间?您是否在发布模式下运行?通过VS?后台是否有很多任务在运行?我还可以继续说下去。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)