這本書買了挺久了,但卻一直沒認真看過。最近花費在遊戲上的時間相對比較多。不過暫時也告一段落了,開始把一些時間轉移到看書上面來。周末看了 最佳化的部分,書裡主要舉的是一個迴圈的取值運算的例子,確實也有不少的效能瓶頸在迴圈迭代上面。
簡單的例如:
for(int i ; i < Max; i++)
{
float f = f * f * f ; (1)
float sum += j[i] + f;
}
相對於 把(1)提到迴圈外面,很明顯的效能浪費。這是比較明顯的最佳化
還有就是從彙編角度去分析寄存器的讀寫次數來觀察。例如:
fun(int * p)
{
int sum;
for(int i ; i < Max; i++)
{
sum = i + *p; // 這裡每次都需要對指標p取值,會發生多一次讀寄存器的操作
}
}
相對於:
fun(int * p)
{
int sum;
int temp = *p;
for(int i ; i < Max; i++)
{
sum = i + temp ; //這樣節省了操作
}
}
現代新的cpu都是亂序執行指令的,就是說cpu從解碼成指令,放到指令高速緩衝區,再發送多對應的執行單元處理並非一定是順序的
<2>進程式控制制
獲得進程ID: getpid
獲得父進程ID:getppid
退出進程: exit
建立子進程:fork 比較有意思一次調用返回兩次,在子進程中返回0,父進程則返回子進程的ID
等待子進程終止: waitpid :通過status可以判斷出子進程的退出狀態了(是正常退出,或者因為異常等:例子:
while( pid = waitpid(-1, &status, 0)) >0)
if(WIFEXITED(status)) //如果子進程是正常終止返回真
....
接下來是讓執行中的進程休眠:調用常用的 sleep(x) 可以讓進程掛起一段時間:或者直接調用pause讓進程一直休眠,直到收到一個訊號為止
*載入並運行程式: execve(filename, argv, envp);
*訊號:更高層形式的異常,允許進程中斷其它進程。不同於之前的 環境切換(建立在以前說的:中斷 故障 終止等較底層的異常之上的,作業系統利用上下文來實現多任務,就是保留一個進程的狀態,切換處理另外的進程再回來)
linux系統有30種不同類型的訊號:SIGHUP 掛起
*發送訊號: kill -9 15213 發送訊號9到進程ID:15213
alarm(x)每隔一段時間發送一個 SIGALRM訊號給調用進程。如何接收訊號呢:
看下面這個函數就明白了:
typedef void handler_t(int);
handler_t* signal(int signum, handler_t* handler);