關(guān)于matlab程序運(yùn)行時(shí)間計(jì)算方法的思考
簡(jiǎn)介:在matlab中,為了驗(yàn)證比較兩個(gè)算法直接的效率,我們常常需要計(jì)算某段程序的運(yùn)行時(shí)間,而常用的也就是三種方法:
本文引用地址:http://m.butianyuan.cn/article/280048.htm1、tic和toc命令對(duì);格式如下面一段程序。
tic;
a=0;
for i1=1:100000
for j1=1:10000
a=a+1;
end
end
toc;
tic命令表示開啟一個(gè)matlab的計(jì)時(shí)器,toc則表示停止之前與之對(duì)應(yīng)的tic開啟的計(jì)時(shí)器,并得到最后的計(jì)時(shí)結(jié)果,上一段程序結(jié)果如下:
Elapsed time is 3.720372 seconds.
2、clock加etime函數(shù);程序結(jié)構(gòu)如下面一段。
t1=clock;
b=0;
for i2=1:100000
for j2=1:10000
b=b+1;
end
end
t2=clock;
etime(t2,t1)
其中,clock命令是獲取系統(tǒng)的時(shí)間矢量,而etime函數(shù)則是計(jì)算兩個(gè)時(shí)間矢量之間的差并以秒單位形式表示。clock作為時(shí)間矢量包含了年月日時(shí)分秒六個(gè)參數(shù),如在matlab單獨(dú)執(zhí)行這一命令可得到:
>> clock
ans =
1.0e+003 *
2.0120 0.0080 0.0180 0.0140 0.0180 0.0507
3、cputime命令計(jì)算運(yùn)行時(shí)間;
m1=cputime;
c=0;
for i3=1:100000
for j3=1:10000
c=c+1;
end
end
m2=cputime;
m=m2-m1
cputime命令是獲取matlab自啟動(dòng)后所占用cpu的運(yùn)行時(shí)間,這里需要詳細(xì)介紹下,cputime不是代表matlab的運(yùn)行時(shí)間,而是指matlab占用cpu的時(shí)間。大家知道,window系統(tǒng)的多進(jìn)程管理類似于我們所說的時(shí)分復(fù)用概念,即cpu完成多進(jìn)程是通過時(shí)間劃分來實(shí)現(xiàn)的,這一時(shí)刻運(yùn)行的是進(jìn)程一,下一時(shí)刻運(yùn)行的是進(jìn)程二,由于速度非???,所以對(duì)于用戶來說看起來就是同時(shí)運(yùn)行的。我們可以做個(gè)試驗(yàn),在一打開matlab的時(shí)候,執(zhí)行cputime命令得到:
>> cputime
ans =
13.1197
說明我們matlab打開用了13秒多的時(shí)間,大家可以自我感覺下是不是這個(gè)時(shí)間。
既然大概的原理我們知道了就可以來比較比較這三者的區(qū)別。首先,tic和toc的方法是最優(yōu)的,這也是matlab幫助中提倡的一種。從精度上來說,第一種方法精度最高,由于是matlab自身的計(jì)時(shí)器,精度上要比后兩者高,其次是cputime,最低的是clock只有毫秒級(jí)的精度。再者,從最接近實(shí)際電路運(yùn)行時(shí)間上來說,也是第一種方法最為接近,這點(diǎn)我們仔細(xì)分析下。
我們知道,想得到某段程序在matlab中運(yùn)行的時(shí)間,目的是在于對(duì)該程序所實(shí)現(xiàn)的算法在實(shí)際電路中處理的時(shí)間有個(gè)大概的估計(jì)與比較,所以我們最想要的是它在cpu運(yùn)行的時(shí)間。這一點(diǎn)第二種方法則不太適合了,因?yàn)樗捎玫氖窍到y(tǒng)時(shí)間作為計(jì)算參數(shù),在這個(gè)時(shí)間內(nèi)肯定還有著別的后臺(tái)運(yùn)行程序等。而對(duì)于第三種方法,cputime所對(duì)應(yīng)的測(cè)量對(duì)象是matlab整個(gè)程序,而并不是對(duì)于我們所測(cè)量的這段程序而言(matlab也可以看做是一個(gè)編譯器,對(duì)我們編寫的m代碼進(jìn)行編譯,所以它還需要進(jìn)行著別的操作)。再看看我們的第一種matlab推薦的方法,tic是啟動(dòng)一個(gè)matlab內(nèi)部的計(jì)時(shí)器,所以說它也是一種基于cpu時(shí)間的計(jì)時(shí),而且更重要的是,計(jì)時(shí)開始的時(shí)間是我們?cè)O(shè)定在代碼前的,可以說tic和toc中間對(duì)于matlab來說,大部分時(shí)間就是運(yùn)行這段代碼,所以時(shí)間上是最接近實(shí)際在電路中運(yùn)行的時(shí)間的。
關(guān)于上面的比較,個(gè)人閑來無事做了個(gè)實(shí)驗(yàn):同樣的代碼,將matlab在任務(wù)管理器中的進(jìn)程優(yōu)先級(jí)進(jìn)行改動(dòng),我們可以明顯看到運(yùn)行時(shí)間上的變化。
矢量控制相關(guān)文章:矢量控制原理
評(píng)論