}
解決:C語言中malloc和free函數要配對使用。
void foo()
{
//定義string1指針,其指向一個堆上的100個字節的內存空間
char *string1 = (char*)malloc(100*sizeof(char));
//定義string2指針,其指向一個堆上的200個字節的內存空間
char *string2 = (char*)malloc(200*sizeof(char));
scanf("%s", string2);
string1=string2;/*string1原先指向的100個字節的內存沒有被釋放*/
/*而后又被指向string2所指的內存塊,造成前面100個字節的內存泄漏*/
free(string2);
free(string1); /* 這個free()調用會失敗,因為string1指向的內存地址與string2的相同,而那塊內存已經被釋放了 */
return 0;
}
解決:在程序堆上分配內存后,要在使用完后及時釋放,同時避免野指針的產生,比如string1。
原理:內存是軟件運行的重要的空間資源,內存泄漏實際上是浪費了軟件的空間資源。因此,內存泄漏對軟件的性能影響十分重要。
另外,對于程序在時間上的浪費,我們通常是采用優化算法和數據結構的解決策略。
最近幾年,很多知名軟件公司在招聘軟件測試人員,考察代碼能力的時候,內存泄露和算法優化是經常的試題之一。這說明了用戶對軟件性能的要求越來越嚴格,已經傳遞到了軟件公司。
2.以空間換時間
軟件的高性能并不是憑空產生的,在解決了空間和時間浪費的問題之后,如果用戶還有更高的性能要求,我們軟件人員只好“偷梁換柱”,做一下調整,而這種調整往往是很靈活的。
空間換時間是軟件人員解決性能問題最常見的方法。是在系統功能正常的前提下增大軟件空間開銷的方法來縮減運行的時間。一般的方法有算法調整、并行計算方法、體系結構方法和一些不是“辦法”的辦法。
通常的解決方案有Cache緩存、數據庫的index等。
一個動態網站服務器總發生CPU耗盡的問題,因此造成給用戶的響應緩慢或者長時間沒有響應,進而引起Server的宕機。經調查分析,網站首頁是個PHP 程序,每次用戶訪問都要多次查詢數據庫,也沒有Cache機制,數據庫查詢負荷過高,耗盡CPU。
解決:改寫網站首頁以及部分頻繁訪問的程序,增加Cache機制,減少數據庫訪問。
原理:將常用數據放在服務器的內存中,雖然增加了內存的開銷,但帶來了時間上的優化,對用戶而言,提高了處理速度。
3.以時間換空間
時間換空間的方案解決性能問題的情形比較少。有時會出現在對內存要求十分苛刻的地方,比如嵌入式操作系統中。
程序設計的要求是不設中間變量,交換兩個變量的值。
我們通常的中間變量的解決方案是:
Void swapOne(int *a, int *b)
{
Int temp;
Temp = *a;
*a = *b;
*b= temp;
}
但這里需要在程序中為temp變量在棧上分配一個空間??刹豢梢圆挥眠@個temp變量呢?
解決:
修改程序如下:
void swapTwo(int *a,int *b)
{
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
原理:修改之后,多了運算復雜度,但沒有使用第三方變量,減少了空間的占用。
以上是我們從簡單的程序例子來理解性能解決方案,但現實要遠遠復雜得多,因為隨著軟件系統功能的復雜強大,軟件的規模也在不斷擴大,我們不可能完全自己開發程序,很多時候是利用已有的平臺和中間件資源。在這種場景下,我們應該怎樣考慮性能問題呢?
第一,軟件系統設計的架構及技術平臺
軟件在設計階段一旦決定采用哪種架構和技術,其性能也就注定只能在一定的范圍內變動了。這就是“先天”因素。比如在上節講到的一個刪除/增加數據的業務操作,如果用戶對時間非??量?,密集型計算、在線的大數據量統計和分析等應用,這些場景通常J2EE不能夠很好地解決,使用C++或者其他平臺搭建會更合理些。如果在這些場景下硬要采用J2EE架構,那么開發和設計人員如何絞盡腦汁,優化設計和程序,也不會滿足用戶的性能要求。