Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 使用Tic Toc控制回路速度_Performance_Matlab - Fatal编程技术网

Performance 使用Tic Toc控制回路速度

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比

我正在编写一个代码,输出到控制设备的DAQ。我想让它精确地每1秒发出一个信号。根据我的处理器的性能,代码有时需要更长或更短的1秒。有没有办法改进这段代码? 运行时间为1.000877秒。 运行时间为0.992847秒。 运行时间为0.996886秒

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()的目的是什么?很好,那是我尝试其他东西时忘记删除的