寫日誌函數和持續最佳化,日誌函數持續
首先看下面的函數
<span style="font-size:18px;">void writelog(char* file, char* msg){FILE*fp=NULL; int nDataLen = strlen(msg);fp=fopen(file,"ab+");//只供讀取 if(fp!=NULL){fwrite(msg, nDataLen, 1, fp); } fclose(fp);//關閉檔案}</span>
這個有什麼問題呢?當fp為空白的時候,是不是也會執行fclose(fp)?
修改如下:
<span style="font-size:18px;">void writelog(char* file, char* msg){FILE*fp=NULL; int nDataLen = strlen(msg);fp=fopen(file,"ab+");//只供讀取 if(fp!=NULL){fwrite(msg, nDataLen, 1, fp); fclose(fp);//關閉檔案}}</span>
這樣是不是就沒問題了呢?
當多線程中調用這個日誌函數的時候,會不會有問題?
所以有一種方法就是加鎖,但這樣效率可能會低一些。
另外一種方法就是用一個線程來接收其他線程的寫日誌的訊息,有一個線程來專門寫日誌。
這樣背景工作執行緒不會阻塞,可提高並發效率。
編程和設計的過程,就是一個逐步完善的過程,沒有人一開始會想的很全面,也沒有絕對的錯誤的代碼和設計。如果有明顯的功能錯誤,在設計過程中,就會改正。就比如最開始的那個函數,fp為空白的機率有多少?所以一般不會出錯。當日誌函數只在單線程中使用,那考慮加鎖和多線程訊息也是多餘。所以,要看應用情境。
程式員都很反感需求的變化。需求,就是應用情境。只有在需求確認了,才可以設計出相對匹配的方案出來,不一定是完美的,但肯定是在綜合各種因素的情況下,是最優的。周期是要考慮的,成本是要考慮的。
轉載請註明原創連結:http://blog.csdn.net/wujunokay/article/details/38310669
對於編寫Matlab函數的最佳化問題
關鍵要看f是什麼樣的函數
===========================
M = magic(5);
X = M(2:end,:);
Y = M(1:end-1,:);
ii = 1:size(X,2);
jj = 1:size(X,1);
[II,JJ] = meshgrid(ii,jj);
F = zeros(size(X));
I = find(II+2*JJ>0);
F(I) = 2*X(I)+Y(I);
I = find(II-JJ>0);
F(I) = X(I);
這裡有兩個問題,一個是你的迴圈是i=1:n,而迴圈裡引用了M(i-1,j),會造成數組越界;另一個是f的運算式中i+2*j>0是恒成立的,這樣後面兩個等於白寫了。
什是函數最佳化
函數最佳化是指運行效率的最佳化,最佳化後的函數執行速度應高於最佳化之前。
比如,這函數執行的是從指定數v累加計算一直到指定max的計算結果。
但這個寫法效率上講並不高,因為是用for迴圈逐步累加的。對於有
較好數學底子的人來說,只要一行代碼一個算式即解決。
function test(v:Int,max:Int){
for (i=0;i<max;i++){
v = v + i;
}
return v;
}
諸如此類的函數,如果max數值不是很大的話或者調用頻率很高的話對主程式速度影響不大。但如果max數值很大,而且函數每秒要調用好多次就會顯現出最佳化與不最佳化成倍的執行效率差異。