|
matlab是一款數(shù)學(xué)工具,所以使用這個工具,可以幫助解決大多數(shù)的科學(xué)問題。馬克思說,如果一門科學(xué)還沒有用到數(shù)學(xué),那它不能稱之為科學(xué)(大意是這樣的,哈哈)。這是本人第一次寫博文,文字功底實在有限(不是自謙,我是一個驕傲的人,嘿嘿),請見諒?催^很多專業(yè)性的文章,都會涉及很多專業(yè)名詞,第一眼就看上去就很牛B,但因此也有了距離感(不敢繼續(xù)往下讀)。本人的目的是用淺顯的語言,清晰的結(jié)構(gòu),與有共同愛好的人,一起溝通學(xué)習(xí),一起進(jìn)步。下面就開始言歸正傳,說說Matlab。
Matlab是一個運行程序的平臺,那首先得清楚程序運行的基準(zhǔn),也就是時鐘(這個跟學(xué)習(xí)單片機里的時鐘是一樣的),或者稱之為時間軸。時鐘頻率當(dāng)然是CPU內(nèi)核頻率(保證在全速運行的情況下),這貌似跟一個Programmer無關(guān),而更加關(guān)心的可能是‘代碼實際執(zhí)行的時間’和‘如何提交代碼效率’。matlab已經(jīng)提供了計時函數(shù)(在MCU里叫做計時器,本人從事過嵌入式,所以不免將其對比學(xué)習(xí),這也不失為一種好的方法,哈哈)。
1’tic/toc函數(shù),tic用在程序的開始,作用是啟動一個計時器,實際是保存了當(dāng)前的時間值,toc放在程序尾部,表示終止計數(shù)器,返回從計時器開啟到此刻的流逝時間(elapsed time).這就可以測量代碼試行時間,注意返回值單位已換算成seconds(秒);
x = rand(800000, 1);
t1 = tic; fft(x); toc(t1) % Recommended
Elapsed time is 0.097665 seconds.
2’clock/etime函數(shù),clock函數(shù),返回一個1*6的double類型的當(dāng)前時間值,年月日時分秒,etime(t2,t1)用來計算兩個日期向量t1,t2的時間差,單位也是seconds。
t = clock; fft(x); etime(clock, t)
ans =
0.1250
3' cputime函數(shù),返回matlab啟動以來CPU時間,沒有單位。在程序前后保證cpu時間,然后比較大小。這種方法個人不是很好用,畢竟我們都是生活在標(biāo)準(zhǔn)時鐘下,如果不以秒作為計量單位,有些不知所措的感覺。因為不知道過了多長時間,當(dāng)前的時間又是什么,是不是很可怕,哈哈···。
以上就是測量代碼執(zhí)行時間的幾種方法,推薦是使用第一種方法,簡單、準(zhǔn)確。如果有更好的方法,歡迎提出來,一起學(xué)習(xí)。關(guān)于'如何提高代碼效率',寫出優(yōu)質(zhì)的代碼,這是一個非常值得研究的問題了,也是一個優(yōu)秀的程序員一生都在思考的。在這里我提升到幾條原則,與其說明哪條程序該怎么寫,效率更高,這樣永遠(yuǎn)也說不完的話題,還不如提煉出實用的編程原則,作為編寫程序時的方向指導(dǎo)。哲學(xué)家不就是這樣嗎,用幾句精髓的句子,概括了蕓蕓眾生苦苦尋覓的生活,驀然回首,那人已在燈火闌珊處。
1’ 把相同的事情一起做了。比如說定義特別大的數(shù)組或矩陣,matlab進(jìn)行動態(tài)內(nèi)容分配和取消時,可能產(chǎn)生內(nèi)存碎片,導(dǎo)致大量內(nèi)存閑置,程序必然會耗時,在程序開頭預(yù)分配這樣的大數(shù)組,則避免了這個問題。
2‘自己手里有的,干嘛還向別人借呢。盡可能使用matlab內(nèi)部提供的函數(shù),它提供的函數(shù)絕對是各種問題的最優(yōu)算法,那些可都是大師級人物寫出來的,程序肯定是相當(dāng)高效,有現(xiàn)成的為什么不用呢;谀P驮O(shè)計,自動生成可執(zhí)行的嵌入式代碼,也是這樣的道理。
3’借力用力。matlab語言是為矩陣操作而設(shè)計,這方面有獨到的優(yōu)勢,但也不是萬能,可以說任何一種語言都是為解決某一需求而孕育的,不是為了拯救世界和平,消除所有問題。自己不擅長的事情,就交給別人去做吧。MEX 工具可編譯C、C++、Fortran等多種計算語言,生成MEX文件(.mexw32/.mexw64格式的文件),類似windows 的dll文件,能夠動態(tài)鏈接到程序中。比如循環(huán)操作,用C編寫豈不是小兒科。
今天就寫這么多吧,希望有同志一起交流學(xué)習(xí),并繼續(xù)關(guān)注以后的博文,
|
|