Performance 使用Tic Toc控制回路速度
我正在编写一个代码,输出到控制设备的DAQ。我想让它精确地每1秒发出一个信号。根据我的处理器的性能,代码有时需要更长或更短的1秒。有没有办法改进这段代码? 运行时间为1.000877秒。 运行时间为0.992847秒。 运行时间为0.996886秒Performance 使用Tic Toc控制回路速度,performance,matlab,Performance,Matlab,我正在编写一个代码,输出到控制设备的DAQ。我想让它精确地每1秒发出一个信号。根据我的处理器的性能,代码有时需要更长或更短的1秒。有没有办法改进这段代码? 运行时间为1.000877秒。 运行时间为0.992847秒。 运行时间为0.996886秒 for i= 1:100 tic pause(.99) toc end 众所周知,使用暂停相当不精确(大约10毫秒)。Matlab在最新版本中优化了tic-toc,以尽可能降低开销和精度(请参阅) 您可以使用tic toc比
for i= 1:100
tic
pause(.99)
toc
end
众所周知,使用
暂停
相当不精确(大约10毫秒)。Matlab在最新版本中优化了tic-toc
,以尽可能降低开销和精度(请参阅)
您可以使用tic toc
比使用以下代码暂停更精确:
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
for i= 1:ntimes
outer = tic;
while toc(outer) < time_dur
end
times(i) = toc(outer);
end
mean(times)
std(times)
ntimes=100;
时间=零(n次,1);
时间=0.99;
对于i=1:n次
外部=抽搐;
而toc(外部)
以下是我50次测量的结果:平均值=0.9900
,标准值=1.0503e-5,比使用暂停更精确
使用带有暂停的原始代码,对于50次测量,我得到:
mean=0.9981
带有std=0.0037
使用pause
是非常不精确的(大约10毫秒)。Matlab在最新版本中优化了tic-toc
,以尽可能降低开销和精度(请参阅)
您可以使用tic toc
比使用以下代码暂停更精确:
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
for i= 1:ntimes
outer = tic;
while toc(outer) < time_dur
end
times(i) = toc(outer);
end
mean(times)
std(times)
ntimes=100;
时间=零(n次,1);
时间=0.99;
对于i=1:n次
外部=抽搐;
而toc(外部)
以下是我50次测量的结果:平均值=0.9900
,标准值=1.0503e-5,比使用暂停更精确
仅暂停使用原始代码,对于50次测量,我得到:
mean=0.9981
和std=0.0037
这是清水答案的改进版本。主要问题是最小的时钟漂移。每次迭代取时间戳,然后重置计时器。时钟随着这两个命令的执行时间而漂移
第二个次要改进结合了暂停和tic-toc技术来降低cpu负载
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
t = tic;
for ix= 1:ntimes
pause((time_dur*ix-toc(t)-0.1))
while toc(t) < time_dur*ix
end
times(ix) = toc(t);
end
mean(diff(times))
std(diff(times))
ntimes=100;
时间=零(n次,1);
时间=0.99;
t=tic;
对于ix=1:n次
暂停((时间*ix toc(t)-0.1))
而toc(t)
这是清水回答的改进版本。主要问题是最小的时钟漂移。每次迭代取时间戳,然后重置计时器。时钟随着这两个命令的执行时间而漂移
第二个次要改进结合了暂停和tic-toc技术来降低cpu负载
ntimes = 100;
times = zeros(ntimes,1);
time_dur = 0.99;
t = tic;
for ix= 1:ntimes
pause((time_dur*ix-toc(t)-0.1))
while toc(t) < time_dur*ix
end
times(ix) = toc(t);
end
mean(diff(times))
std(diff(times))
ntimes=100;
时间=零(n次,1);
时间=0.99;
t=tic;
对于ix=1:n次
暂停((时间*ix toc(t)-0.1))
而toc(t)
如果希望DAQ每秒准确更新,请使用带有FIFO缓冲区和时钟的DAQ,并配置为每秒准确读取FIFO中的值一次
即使MATLAB任务迭代运行间隔仅为1秒,与DAQ通信的不一致延迟也会打乱计时。如果希望DAQ每秒更新一次,请使用带有FIFO缓冲区和时钟的DAQ,并将其配置为每秒从FIFO读取一次值
即使您的MATLAB任务迭代运行间隔仅为1秒,与DAQ通信中的不一致延迟也会打乱您的计时。对您的问题的简短回答是否定的。精确计时非常困难,除非您有专门用于单个任务且仅用于该任务的系统。当你运行MATLAB时,你的东西会被添加到“线程队列”中,当你的处理器有时间运行它时,它会。请记住,它正在同时管理数千个其他进程,因此保证它将在前一个进程的1秒钟内发生几乎是不可能的。使用术语“精确地每1秒钟”是一个兔子洞,因为将它精确地设置为1而不是0.99999或1.00001秒是一个白日梦。如果你非常关心时间,你很可能不会使用MATLABmaybe或帮助你。如果你想将事件与某个外部时钟(或触发器)同步,我不会使用暂停。查看此文档:您的问题的简短答案是“否”。除非您有专门用于单个任务且仅用于该任务的系统,否则精确计时非常困难。当你运行MATLAB时,你的东西会被添加到“线程队列”中,当你的处理器有时间运行它时,它会。请记住,它正在同时管理数千个其他进程,因此保证它将在前一个进程的1秒钟内发生几乎是不可能的。使用术语“精确地每1秒钟”是一个兔子洞,因为将它精确地设置为1而不是0.99999或1.00001秒是一个白日梦。如果你非常关心时间,你很可能不会使用MATLABmaybe或帮助你。如果你想将事件与某个外部时钟(或触发器)同步,我不会使用暂停。查看本文档:
start_time=clock()的用途是什么代码>?很好的捕捉,那是当我尝试其他东西时忘记删除那一行。+1用于识别tic toc允许非常精确的计时。由于重置计时器,此解决方案的时钟漂移较小(我的电脑上的平均值=0.99+4.3563e-05),我的答案解决了此问题。感谢您的回答!真的很有帮助!start_time=clock()的目的是什么代码>?很好,那是我尝试其他东西时忘记删除的