锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍙﹀,淇炵泭宸炶佸笀鏉ユ垜浠鏍¤瀛︾殑鏃跺?鎴戠湅鍒頒粬涔熸病鍋氫粈涔堝噯澶?鐢佃剳涓婃湁涓涓猟emo鏂囦歡澶?閲岄潰鏀句簡鍚勭PPT鍜屾紨紺虹敤鐨勮棰?闅忔墜鎷挎潵灝辮,榪欎釜寰堝ソ,涔熻瀛?榪樻湁浠涔堜釜浜虹畝鍘?鍒涗笟璁″垝浠涔堢殑,鑳藉啓濂?鏁寸悊濂界殑,閮芥斁鍦ㄤ竴璧?浠涔堟椂鍊欒鍒頒釜蹇楀悓閬撳悎鐨?绔嬮┈鎷垮嚭鏉ヤ粙緇?鍝堝搱
涓漢緗戠珯鐨勮璁$洰鏍?棣栧厛蹇呴』瑕丠TML涓嶱HP鍒嗙,榪欏彲浠ユ柟渚縐I璁捐甯堢殑宸ヤ綔,涓嶇敤鍘葷湅瓚呯駭ugly鐨凱HP浠g爜,榪欏彲浠ラ潬smarty妯℃澘寮曟搸鍋氬埌,灝忚瘯浜嗕竴涓?鐢ㄨ搗鏉ヨ繕鏄緢鐩磋鐨?)
鍙﹀,鏈濂借繕闇瑕丳HP涓庨昏緫灞傚垎紱?榪欎釜娌℃湁浠旂粏鐮旂┒榪?搴旇鏄鐢ㄤ竴浜涙鏋?鍍廧end Framework,CakePHP浠涔堢殑,鍙g榪樹笉閿?紿佺劧鐪嬪埌涓ゅ紶鍥?璁叉庝箞寮鍙戝ソ鐨凱HP欏圭洰鐨?鐪嬭繃浠ュ悗璞佺劧寮鏈?share涓涓?
(鐐瑰嚮鐪嬪ぇ鍥?
DWORD WINAPI ThreadFunc(LPVOID lpParameter);
HANDLE hThread = CreateThread(NULL, NULL, ThreadFunc, NULL, NULL, NULL);
ClassA a;
DWORD WINAPI ThreadFunc(LPVOID lpParameter)

{
return ((ClassA*) lpParameter)->SomeMethod();
}
HANDLE hThread = CreateThread(NULL, NULL, ThreadFunc, &a, NULL, NULL);
template<typename T, PtrToMemThreadFun pFunc>
DWORD WINAPI ThreadFunc(LPVOID lpParameter)

{
return (((T*)lpParameter)->*pFunc)();
}
CreateThread(NULL, NULL, ThreadFunc<ClassA, &ClassA::SomeMethod>, &a, NULL, NULL);
template<typename T>
struct ThreadFac

{
typedef DWORD (T::*PtrToMemThreadFunc)();
typedef T ClassType;
template<PtrToMemThreadFunc pFunc>
static DWORD WINAPI ThreadFunc(LPVOID lpParameter)
{
return (((ClassType*)lpParameter)->*pFunc)();
}
};
// Globally
CreateThread(NULL, NULL, ThreadFac<ClassA>::ThreadFunc<&ClassA::SomeMethod>, &a, NULL, NULL);
// In methods of ClassA
CreateThread(NULL, NULL, ThreadFac<ClassA>::ThreadFunc<&ClassA::SomeMethod>, this, NULL, NULL);

LogManager::getSingleton().logImage(someImage)
鎴栬呯敤瀹忚繘涓姝ョ畝鍖?/p>
LOG(someImage)
灝卞畬鎴愪簡涓存椂鍥懼儚鐨勮嚜鍔ㄥ懡鍚嶏紝騫朵繚瀛橈紝鐒跺悗娣誨姞鍒版棩蹇楅噷錛岄偅灝嗘槸寰堟湁鍚稿紩鍔涚殑錛岀敓鎴愮殑鏃ュ織鏈夌偣鍍忎竴涓猂eport錛屽彲浠ョ洿鎺ュ彂緇橞oss鐪嬶紝褰撳伐浣滄眹鎶?:)
涓轟簡瀵筁OG榪涘幓鐨勫獟浣撳唴瀹規湁涓瀹氱殑澶勭悊錛屽鏄劇ず鐨勬椂鍊欑緝鏀懼埌鍚堥傜殑澶у皬絳夛紝闇瑕佸湪鏃ュ織鏂囦歡鐨勫ご閮ㄥ姞鍏ヤ竴浜汮avascript鐨勪唬鐮侊紝榪欓渶瑕佹棩蹇楃郴緇熺殑鏀寔錛岃兘鍦ㄥ紑濮嬭鏃ュ織鐨勬椂鍊欏垽鏂綋鍓嶆棩蹇楁枃浠舵槸鍚﹀凡緇忓瓨鍦紝鍙湪涓嶅瓨鍦ㄧ殑鏃跺欐墠鍔犲叆鐩稿簲鐨勯〉棣栦唬鐮併?/p>
褰撶劧錛屾洿榪涗竴姝ュ彲浠ュ仛鎴愮粨鏋勫寲鐨勬棩蹇楋紝榪欎釜榪樻湁寰呭皾璇?/p>
2.Comment - Report 鏈哄埗
濡傛灉鍐欑殑紼嬪簭緇忓父鍙戠敓鍙樺寲錛岄偅涔堟椂闂撮暱浜嗕互鍚庯紝鏃ュ織涓嬫潵鐨勬暟鎹槸鐢變粈涔堟牱鐨勪唬鐮佷駭鐢熺殑錛屽氨浼氫笉璁板緱浜嗭紝瀵艱嚧澶ч噺鐨勬暟鎹病鏈夊姙娉曞垎鏋愶紝榪欓噷鎴戠敤榪欐牱鐨勫姙娉?/p>
鍦ㄤ駭鐢熸暟鎹殑浠g爜闄勮繎鐢ㄨ繖鏍蜂竴涓鍙?/p>
COMMENT(subject)
subject鏄竴涓瓧絎︿覆鍊鹼紝琛ㄧず榪欎竴閮ㄥ垎鏁版嵁鐨勪富棰橈紝榪欎釜瀹忓睍寮浠ュ悗鏄繖鏍風殑
LogManager::getSingleton().addComment(subject, __FILE__, __LINE__);
榪欎釜鍑芥暟鍦℉TML鐨勬棩蹇楁枃浠墮噷鏂板涓琛岋紝騫剁敓鎴愪竴涓秴閾炬帴鐩殑鍦幫紝鍚屾椂LogManager璁頒笅榪欎釜(string, string, int)緇勫悎
鍦↙ogManager琚叧闂殑鏃跺欙紝浼氬鎵鏈夌殑 Comment鏍規嵁 Subject褰掔被錛岀敓鎴愪竴涓猅echinical Report錛屽儚涓嬮潰榪欐牱
Tech Report:
---------------------------------------------------------
* SubjectA:
Comment1 - FileName - LineNo
Code Segment of Comment1
Comment2 - FileName - LineNo
Code Segment of Comment2
...
* SubjectB:
...
---------------------------------------------------------
鍚屼竴涓猄ubject鍙互瀵瑰簲澶氫釜浠g爜孌碉紝鍗曞嚮Report閲岀殑 Comment 鍙互璺寵漿鍒板厛鍓?Comment鐢熸垚鐨勮秴閾炬帴鏃ョ殑鍦般?br />Code Segment鐢盠ogManager鏍規嵁__FILE__鍜宊_LINE__浠庢枃浠墮噷璇誨彇
3.鍙橀噺璁板綍瀹?/p>
涓浜涙湁鐢ㄧ殑瀹忓璁板綍鍙橀噺寰堟湁濂藉
#define LOGVAR(x) ToolLib::LOG(#x + std::string(" = ") + TOSTR(x))
#define LOGARR(x, i) ToolLib::LOG(#x + std::string("[") + TOSTR(i) + "] = " + TOSTR(x[i]))
鐢ㄤ簡榪欎簺瀹忓氨鍙互闅忓璁板綍鍙橀噺鐨勫?/p>
4.鐩存帴鏁版嵁璁板綍
LogManager闇瑕佹湁涓涓柟娉曠粰鍑烘墍鐢ㄧ殑鏂囦歡瀵硅薄,濡?ofstream鎴?FILE*錛岃繖鏍鳳紝瀵逛簬澶ф暟鎹噺鐨勬棩蹇楋紝姣斿鍑犲崈涓猧nt鍊鹼紝鍙互鐢ㄨ繖涓枃浠跺璞$洿鎺ヨ緭鍏ワ紝鑰岀渷鍘繪瘡涓琛岃褰曟棩鏈熸椂闂寸殑楹葷儲
5.鏇挎崲stdout鎴朿out
緇忓父鏈変簺絎笁鏂圭殑搴撶敤printf鎴栬卌out鏉ヨ緭鍑轟俊鎭紝闇瑕佹兂鍔炴硶鎶婅繖浜涘唴瀹逛篃catch鍒拌嚜宸辯殑鏃ュ織緋葷粺閲岋紝瀵逛簬printf妯″紡鐨勶紝鍙互鐢?/p>
FILE* fid = fopen();
*stdout = *fid;
鏉ュ疄鐜幫紝鑰屽浜巆out鍨嬬殑錛屼笉濂藉姙錛屽彲浠ヨ嚜宸卞啓涓涓柊鐨刼stream瀛愮被錛岀劧鍚庣敤瀹忔妸cout閲嶆柊define涓涓嬶紝璁炬垚鑷繁鐨刼stream錛屽茍閲嶅啓涓涓媠ync鍑芥暟鏉apture杈撳嚭銆?/p>
HBENCHMARK聽hid;
Tic(hid);
//
聽
聽some聽code
Toc(hid);
//
聽
聽show聽time
HBENCHMARK聽hid;
Tik(hid);
while(
)

{
聽聽聽聽//聽
聽some聽code
聽聽聽聽Trk(hid);
聽聽聽聽//聽
聽code聽to聽benchmark
聽聽聽聽Tsk(hid);
聽聽聽聽//聽
聽some聽code
}
Tok(hid);
//聽
聽show聽time
聽聽聽聽typedef聽LARGE_INTEGER聽HBENCHMARK;

聽聽聽聽/**///////////////////////////////////////////////////////////////////////////
聽聽聽聽//聽Single聽turn聽timer聽routine
聽聽聽聽//聽begin
聽聽聽聽void聽Tic(HBENCHMARK&聽node);
聽聽聽聽//聽end,聽display聽timer.
聽聽聽聽void聽Toc(HBENCHMARK&聽node,聽std::string聽prefix聽=聽"");

聽聽聽聽/**///////////////////////////////////////////////////////////////////////////
聽聽聽聽//聽Multiple聽turns聽timer聽routine
聽聽聽聽//聽initialize聽timer
聽聽聽聽void聽Tik(HBENCHMARK&聽node);
聽聽聽聽//聽resume聽timer
聽聽聽聽void聽Trk(HBENCHMARK&聽node);
聽聽聽聽//聽stop聽timer
聽聽聽聽void聽Tsk(HBENCHMARK&聽node);
聽聽聽聽//聽end,聽display聽timer
聽聽聽聽void聽Tok(HBENCHMARK&聽node,聽std::string聽prefix聽=聽"");
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Tic(HBENCHMARK&聽node)
聽聽聽聽
{
聽聽聽聽聽聽聽聽QueryPerformanceCounter(&node);
聽聽聽聽}
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Toc(HBENCHMARK&聽node,聽std::string聽prefix)
聽聽聽聽
{
聽聽聽聽聽聽聽聽static聽LARGE_INTEGER聽endtime;
聽聽聽聽聽聽聽聽QueryPerformanceCounter(&endtime);
聽聽聽聽聽聽聽聽node.QuadPart聽=聽endtime.QuadPart聽-聽node.QuadPart;
聽聽聽聽聽聽聽聽if(prefix.length()聽>聽0)
聽聽聽聽聽聽聽聽聽聽聽聽ToolLib::LogManager::getSingleton().logMessage(prefix);
聽聽聽聽聽聽聽聽ToolLib::LogManager::getSingleton().logMessage("Benchmark:聽"聽+聽
聽聽聽聽聽聽聽聽聽聽聽聽TOSTR(node.HighPart)聽+聽","聽+聽TOSTR(node.LowPart));
聽聽聽聽}
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Tik(HBENCHMARK&聽node)
聽聽聽聽
{
聽聽聽聽聽聽聽聽node.QuadPart聽=聽0;
聽聽聽聽}
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Trk(HBENCHMARK&聽node)
聽聽聽聽
{
聽聽聽聽聽聽聽聽static聽LARGE_INTEGER聽curTime;
聽聽聽聽聽聽聽聽QueryPerformanceCounter(&curTime);
聽聽聽聽聽聽聽聽node.QuadPart聽=聽curTime.QuadPart聽-聽node.QuadPart;
聽聽聽聽}
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Tsk(HBENCHMARK&聽node)
聽聽聽聽
{
聽聽聽聽聽聽聽聽static聽HBENCHMARK聽endTime;
聽聽聽聽聽聽聽聽QueryPerformanceCounter(&endTime);
聽聽聽聽聽聽聽聽node.QuadPart聽=聽endTime.QuadPart聽-聽node.QuadPart;
聽聽聽聽}
聽聽聽聽//-----------------------------------------------------------------------
聽聽聽聽void聽Tok(HBENCHMARK&聽node,聽std::string聽prefix)
聽聽聽聽
{
聽聽聽聽聽聽聽聽if(prefix.length()聽>聽0)
聽聽聽聽聽聽聽聽聽聽聽聽ToolLib::LogManager::getSingleton().logMessage(prefix);
聽聽聽聽聽聽聽聽ToolLib::LogManager::getSingleton().logMessage("Benchmark:聽"聽+聽
聽聽聽聽聽聽聽聽聽聽聽聽TOSTR(node.HighPart)聽+聽","聽+聽TOSTR(node.LowPart));
聽聽聽聽}