鑑於專案之前排查乙個偶發的問題,最後居然定位在區域性靜態變數導致,所以記錄一下,同時要明白靜態變數的作用, 及使用的場景,否則很容易出錯!
具體模擬**如下:
void function()
static int nindbac = -1;
if(-1 == nindbac )
nindbac = m_vectables.size();
m_vectables.at(nindbac-1); ///獲取容器的東西,最好封裝乙個介面或者做個判斷,不要導致越界
///上述介面在不同呼叫下, m_vectables的個數不一樣,導致越界!
類似的問題之前還遇到如下:
void function()
static cstring strurl ; ///估計本身是好意,避免多次呼叫geturl(), 同時在很多優化中使用此方法快取資料,避免呼叫
if(strurl .isempty()) ///也是效能優化的乙個點
strurl += _t("newdata=stock"); ///此處會不斷增加_t("newdata=stock")
requestdata(strurl ); // get的請求下(引數有限制),並且是在乙個定時器裡面呼叫函式,最終導致請求失敗!
以上均由於靜態變數不當使用,導致程式莫名其名的現象出現, 為此回顧一下知識點,如下:
關於靜態成員初始化問題,如下模擬**:
/檔案class a; //此處為前置宣告, 而不是#include"a.h"
class b
static a* m_pa; /// 此處僅僅是宣告乙個a類靜態成員,次時編譯並未分配記憶體,因為僅僅是宣告,所以編譯不需要知道b /// 是什麼結構和記憶體大小, 也無需分配記憶體,僅需前置宣告即可
static int m_nindex;
/a* b:: m_pa= null;
int b::m_nindex= 0;
a.**件
class a
void function()
cstring strtmp;
strtmp.format(_t("%d"), m_nindex); /// 此處如果沒有「int b::m_nindex= 0」, 編輯報錯: lnk2001
if(null == m_pa) /// 如果未有上面的,也類同報錯
m_pb = new a;
///關於前置宣告的使用:
1,首先使用#include 「」時,如果兩個類之間相互耦合,會出現編輯不錯;
2,採用前置宣告可以避免上述情況,同時前置宣告必須為指標和引用, 建議採用指標,個人喜好,
這樣的好處,如果對乙個成員變數來說, 如果宣告指標,則不需要額外的記憶體, 同時可以將額外的記憶體申請延長到具體使用 的時刻,避免非指標的成員物件,在初始化時,即分配記憶體,如果該成員物件類是乙個複雜的物件,此時更是明顯!
程式優化中,很多將具體的業務,延長到具體使用時在載入,初始化,如下:
1, 樹形控制項的載入,可以先載入一層節點,後續在使用時,在動態載入,避免以上就載入所有,尤其整棵樹層級比較多時,導致程式初次開啟比較慢等!
2, 自繪控制項時,出現滾動條很正常, 如果每一次全部自繪,資料量稍微大時,就會導致整個介面很卡,優化點出去之前業務優化,重點關注:在滾動時, 只自繪使用者可見區域的資料,這樣對效能的提公升很大!
以上兩點,後續會跟上相關重要的**邏輯!
c++物件根據定義的位置不同, 具有不同的作用域和不同的記憶體分配, 這些知識要點詳見:
靜態區域性變數的執行緒安全性,詳見下列:
程式效能與穩定優化 GDI
寫這邊初衷是記錄效能優化開發過程的點滴,以及期間的各種問題排查,修正等,也為後續同仁減少不必的期間痛苦,鑑於經驗和水平,以及寫作能力,如果有問題,望及時糾正 下面開始記錄點滴 最近測試反饋,程式用著用著就莫名的異常,沒有具體點規律,做為開發,就討厭這種莫名的問題,後面排查,通過任務管理器檢視相關資訊...
程式效能的優化
現代編譯器使用精妙的演算法去確定哪些變數需要去計算以及這些變數的怎麼去使用,這樣就可以去簡化表示式,減少某個計算任務所需要的時間。大部分的編譯器,包括gcc,會給程式設計師一些介面去控制優化的程度,比如 gcc o1 就是給程式一些基本的優化,當帶上的引數為 o2,o3的時候,就會給程式更深層次的優...
lua程式效能優化 區域性變數使用
1 區域性變數優化 一for i 1,1000000 do local x math.sin i end 編譯後 1 1 loadk 0 1 1 2 1 loadk 1 2 1000000 3 1 loadk 2 1 1 4 1 forprep 0 4 to 9 5 2 getglobal 4 3 ...