導航:首頁 > 研究方法 > 常用代碼分析方法

常用代碼分析方法

發布時間:2022-12-31 19:07:12

如何分析代碼

現在一般的封包都是加密的
如果找不到IP段,就必須自行解密
推薦把截到的內容復制粘貼到十六進制編輯器中然後再進行編輯
有些時候那些工具可以幫助你看到封包中的文本,數據等
有些程序的封包加密程度很高,破解起來會覺得很棘手
你可以到黑客基地下載封包還原成數據的軟體,然後試試它的效果

⑵ 原的代碼分析方法論知識

如何看懂源代碼--(分析源代碼方法) 由於今日計劃著要看Struts 開源框架的源代碼

昨天看了一個小時稍微有點頭緒,可是這個速度本人表示非常不滿意,先去找了下資料, 覺得不錯...

摘自(繁體中文Traditional Chinese):http://www.ithome.com.tw/itadm/article.php?c=47717

下文為經過Google翻譯過的簡體中文版:

--------------------------------------------------------------------------------

我們在寫程式時,有不少時間都是在看別人的代碼。
例如看小組的代碼,看小組整合的守則,若一開始沒規劃怎麼看,

⑶ 常見的數據分析工具和方法 常見的數據分析工具和方法有哪些

1、常用的數據分析方法(模型)有:事件分析、漏斗分析、用戶路徑分析、留存分析、session分析、熱力分析、歸因分析、間隔分析、分布分析、LTV分析、用戶行為序列分析、用戶屬性分析、用戶分群分析。

2、常用的數據分析工具主要分為四類:網站統計分析工具常聽說的有CNZZ統計、站長工具、愛站網等,主要是為網站運營者提供代碼統計數據支持,網站運營者可以在上述提到的相關網站注冊賬號,然後申請統計代碼,獲得代碼後再植入到網站對應位置即可。大約過幾天就可以在你注冊的平台看到網站的相關數據了。自媒體分析工具自媒體分析工具不需要佔用運營者太多的時間去整理代碼,所有的數據都是直接後台形成的,不管是微博、微信公眾號還是今日頭條等自媒體平台,都具有完整的數據統計功能,作為運營者只需要通過後台自帶的分析工具就可以直觀的看到用戶增長等相關數據了。第三方分析工具這種工具通常是指非官方平台自帶的統計工具,需要官方授權後才可以使用的數據分析工具,畢竟不是所有平台都有自帶統計工具,第三方分析工具需要運營者單獨注冊賬號,且需要相關平台的授權才可以使用,不過一旦授權成功,那看數據的操作就與自媒體分析工具一樣方便簡單和直觀了。表格這種方式比較適合excel玩得好的人了,數據來源通常要麼是後台導出,要麼是人工統計。人工統計的數據一般會包括每天發布文章的數量、後台互動的數量與類別、同行口碑的分析等,因為這些數據統計是一般平台都不含有的,那麼自然就需要人工親自查閱相關數據進行統計了。

⑷ VS2013中程序怎麼做代碼分析

操作方法:
1
首先,用VS打開待分析的工程,再點菜單「分析」-「性能和診斷」。

2
這時,將會打開向導窗口。請注意,在向導窗口中,默認「性能向導」一項是灰色的,無法勾選。若是想勾選此項,請先取消「CPU使用率」一項的勾選。取消以後,「性能向導」項就可以選擇了。不過,我們在此一般使用默認的選項即可。

3
在向導窗口中選好後,最後點擊「應用」按鈕便立即開始自動執行程序代碼,同時進行監測分析。

4
隨後,我們按照事先設計好的功能使用應用程序,以便得到性能分析的結果。使用完畢後,關閉應用程序。

5
應用程序關閉後,後續的代碼分析立即開始出結果。這個耗時略微有點長,請耐心等待。

6
結果出來以後,如果想更進一步的查看詳情,可以再點擊「創建詳細的報告」。

7
詳細報告創建以後,我們就可以使用多個視圖來對代碼的各項指標進行全方位的考查。

⑸ 常見電腦錯誤代碼解釋及解決方法

以下這些藍屏代碼可以提供參考一下:
1)0×0000001E(0×c0000005 0×FDE38AF9 0×00000001 0×7E8B0EB4)KMODE_EXCEPTION_HANDLED ****其中錯誤的第一部分是停機碼(Stop Code)也就是0×0000001E,用於識別已發生的類型.錯誤的第二部分是被括弧括起來的四個數字集,表示隨機的開發人員定義的參數.解讀藍屏停機碼:
(1)0×0000000A:IRQL_NOT_LESS_OR_EQUAL主要是由有問題的驅動程序,有缺陷或不兼容的硬體與軟體造成的.表明在內核模式中存在以太高的進程內部請求級別(IRQL)訪問其沒有許可權訪問的內存地址。
(2)0×00000012:TRAP_CAUSE_UNKNOWN如果遇到這個錯誤信息,那麼很不幸,因為KeBugCheck分析的結果是錯誤原因未知.(安裝創新音效卡有可能引發) 。
(3)0×0000001A:MEMORY_MANAGEMENT這個內存管理錯誤往往是由硬體引起的,比如新安裝的硬體,內存本身有問題。
(4)0×0000001EKMODE_EXCEPTION_NOT_HANDLEDWindows內核檢查帶一個非法或未知的進程指令,這個停機碼一般由有問題的內存或與(1)相似的原因造成。
(5)0×00000023:FAT_FILE_SYSTEM0×00000024:NTFS_FILE_SYSTEM0×00000023通常發生在讀寫使用FAT16或FAT32文件系統的系統分區時,而0×00000024則由於NTFS.SYS文件出現錯誤.兩個藍屏錯誤很可能是磁碟本身存在物理損壞,或是中斷要求封包(IRP)損壞而導致的,其它原因還包括:硬碟磁碟碎片過多;文件讀寫操作過於頻繁,並且數據量非常大或者由於一些磁碟鏡像軟體或殺毒軟體引起的。
(6)0×00000027:RDR_FILE_SYSTEM這個錯誤產生的原因很難判斷,不過,Windows內存管理出了問題很可能會導致這個停機碼的出現. //本文引用自電腦軟硬體應用網。
(7)0×0000002E:DATD_BUS_ERROR系統內存存儲器奇偶效驗產生錯誤,通常是因為有缺陷的內存(包括物理內存,二級緩存或顯卡內存)設備驅動訪問不存在的內存地址等原因引起的,另外,硬碟被病毒或其他問題損傷,也會出現這個停機碼//本文引用自 www.45it.com 電腦軟硬體應用網。
(8)0×00000035:NO_MORE_IRP_STACK_LOCATIONS這個停機碼的原因是驅動程序本身存在問題,或是內存有質量問題。
(9)0×0000003F:NO_MORE_SYSTEM_PTES一個與系統內存管理相關的錯誤,比如:由於執行了大量的I/O操作,造成內存管理出現問題,有缺陷的驅動程序不正確的使用內存資源;某個應用程序被分配了大量的內核內存等。
(10)0×00000044:MULTIPLE_IRP_COMPLETE_REQUESTS通常是由硬體驅動程序引起的(這個停機碼不常見其中是有新安裝的驅動中Falstaff.sys文件引起)。
(11)0×00000050:PAGE_FAULT_IN_NONPAGED_AREA有問題的內存(包括:物理內存,二級緩存,顯存),不兼容的軟體(主要是遠程式控制制和殺毒軟體),損壞的NTFS卷以及有問題的硬體。
(12)0×00000051:REGISTRY_ERROR這個停機碼說明注冊表或系統配置管理器出現作物,由於硬碟本身有物理壞道或文件系統存在問題,從而造成在讀寫注冊表文件是出現I/O錯誤。
(13)0×00000058:FTDISK_INTERNAL_ERROR說明在容錯集的主驅動器發生錯誤。
(14)0×0000005A:CRITICAL_SERVICE_FAILED某個非常重要的系統服務啟動失敗造成。
(15)0×0000006F:SESSION3_INITIALIZATION_FALED這個錯誤通常出現Windows啟動時,一般是由有問題的驅動程序或損壞的系統文件引起的。
(16)0×00000076:PROCESS_HAS_LOCKED_PAGES通常是因為某個驅動程序在完成了一次I/O操作後,沒有正確釋放所佔用的內存。
(17)0×00000077:KERNEL_STACK_INPAGE_ERROR說明需要使用的內核數據沒有在虛擬內存或物理內存中找到.這個錯誤常常預示著硬碟有問題,相應數據損壞或受病毒侵襲。
(18)0×0000007A:KERNEL_DATA_INPAGE_ERROR這個錯誤往往是虛擬內存中的內核數據無黨派人士讀入造成的.原因可能是虛擬內存頁面文件中存在壞簇,病毒.磁碟控制器出錯,內存有問題。
(19)0×0000007B:INACCESSIBLE_BOOT_DEVICEWindows在啟動過程中無法訪問系統分區或啟動卷.一般發生在更換主板後第一次啟動.主要是因為新主板和舊主板的IDE控制器使用不同的晶元造成的.有時也可能是病毒或硬碟損傷所引起的。
(20)0×0000007E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED系統進程產生錯誤,但Windows錯誤處理器無法捕獲.其產生原因很多.包括:硬體兼容性,有問題的驅動程序或系統服務,或者某些軟體。
(21)0×0000007F:UNEXPECTED_KERNEL_MODE_TRAP一般是由於有問題的硬體或某些軟體引起的,有是超頻也會產生這個錯誤。
(22)0×00000080:NMI_HARDWARE_FAILURE通常有硬體引起的。
(23)0×0000008E:KERNEL_MODE_EXCEPTION_NOT_HANDLED內核級應用程序產生錯誤,但Windows錯誤處理器沒有捕獲,通常是硬體兼容性問題 。
(24)0×0000009C:MACHINE_CHECK_EXCEPYION通常是由硬體引起的,一般是因為超頻或硬體存在問題(內存.CPU.匯流排.電源) 。
(25)0×0000009F:DRIVER_POWER_STSTE_FAILURE往往與電源有關系,常常發生在與電源相關操作.(關機.待機.修眠) 。
(26)0×000000A5:ACPI_BIOS_ERROR通常是因為主板BIOS不能全面支持ACPI規范。
(27)0×000000B4:VIDEO_DRIVER_INIT_FAILURE這個停止信息表示Windows因為不能啟動顯卡驅動,從而無法進入圖形界面,或是存在與顯卡的硬體沖突(並行或串列埠沖突) 。
(28)0×000000BE:ATTEMPTED_WRITE_TO_READONLY_MEMORY某個驅動程序試圖向只讀內存寫入數據造成的,通常是在安裝了新的驅動程序.系統服務或升級了設備的固件程序後.。
(29)0×000000C2:BAD_POOL_CALLER一個內核層的進程或驅動程序錯誤的試圖進行內存操作,通常是驅動程序或存在BUG的軟體造成 。
(30)0×000000CE:DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS通常是由有問題的驅動程序或系統服務造成的硬體的可能性比較大。試試把新安裝的硬體先去掉,開機試試。 硬體過熱也有問題,開機情況下注意一下風扇,試試散熱片的溫度。 灰塵太多,積攢的油灰造成某些板卡電路短路。

⑹ 如何快速看懂別人的代碼

讀程序的能力要靠基本功和經驗幫忙,一般多寫寫代碼就可以提高了。
1. 每個人都有自己的思維習慣,因此再亂的代碼也有自己的風格。比如命名, 比如UI的時候習慣先寫Insert動作等等. 找到這些地方可以幫助閱讀代碼。
2. 一般情況都可以從界面錄入著手讀代碼, 先搞清楚有那些輸入,做了什麼, 有什麼輸出。之後在看代碼的細節會比較容易。
3. 多多利用錯誤調試的技巧,通過斷點,日誌可以幫助找到出問題所在的位置。
4. 如果一段代碼很亂,又有問題,對邏輯有把握的話,最好重寫。浪費時間去讀懂不如重新寫一遍來的效率。
5. 基本功如果不扎實的話,建議一邊補課一邊讀程序。

⑺ 拿到一個 PHP 網站的代碼,如何快速分析項目結構與各函數關系

理解代碼結構的直接方法是「調」,想通過「看」來獲得認識容易失去焦點,對於復雜項目或者架構不清晰的也不太實際。拿到代碼,先在本地完成配置,讓網站能順利跑起來把源代碼納入版本控制,比如做成一個git repository,這樣後續無論如何修改都可以回到原始找一個用例(比如首頁)作為調試焦點找到這個用例的入口文件,通常都有明顯特徵,比如index.php在代碼內你想要的節點插入echo/var_export/var_mp/error_log調試語句,配合適當的return護著edit,在頁面上看到實時輸出碰到自定義類或者函數調用,用grep -R ... 或者 IDE的代碼搜索用能找到類或者函數的定義,配合上述調試函數觀察輸出這樣,通常半小時以內就可以對網站的結構和層次有一個很大概而直觀的理解。

⑻ Java代碼優化有哪些常用的方法

1、 盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。
在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。
2、 盡量重用對象。
特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
3、 盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。
其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。
4、 不要重復初始化變數
默認情況下,調用類的構造函數時, Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
5、 在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
6、 Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。
因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果。
7、 由於JVM的有其自身的GC機制,不需要程序開發者的過多考慮,從一定程度上減輕了開發者負擔,但同時也遺漏了隱患,過分的創建對象會消耗系統的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。
JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。
8、 在使用同步機制時,應盡量使用方法同步代替代碼塊同步。
9、 盡量減少對變數的重復計算
例如:for(int i = 0;i < list.size; i ++) {

}
應替換為:
for(int i = 0,int len = list.size();i < len; i ++){

}
10、盡量採用lazy loading 的策略,即在需要的時候才開始創建。

例如: String str = 「aaa」;
if(i == 1) {
list.add(str);
}
應替換為:
if(i == 1) {
String str = 「aaa」;
list.add(str);
}

11、慎用異常

異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。 異常只能用於錯誤處理,不應該用來控製程序流程。
12、不要在循環中使用:

Try {
} catch() {
}
應把其放置在最外層。
13、StringBuffer 的使用:

StringBuffer表示了可變的、可寫的字元串。
有三個構造方法 :
StringBuffer (); //默認分配16個字元的空間
StringBuffer (int size); //分配size個字元的空間
StringBuffer (String str); //分配16個字元+str.length()個字元空間
你可以通過StringBuffer的構造函數來設定它的初始化容量,這樣可以明顯地提升性能。
這里提到的構造函數是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象創建之後設置它的容量。首先我們看看StringBuffer的預設行為,然後再找出一條更好的提升性能的途徑。
StringBuffer在內部維護一個字元數組,當你使用預設的構造函數來創建StringBuffer對象的時候,因為沒有設置初始化字元長度,StringBuffer的容量被初始化為16個字元,也就是說預設容量就是16個字元。當StringBuffer達到最大容量的時候,它會將自身容量增加到當前的2倍再加2,也就是(2*舊值+2)。如果你使用預設值,初始化之後接著往裡面追加字元,在你追加到第16個字元的時候它會將容量增加到34(2*16+2),當追加到34個字元的時候就會將容量增加到70(2*34+2)。無論何事只要StringBuffer到達它的最大容量它就不得不創建一個新的字元數組然後重新將舊字元和新字元都拷貝一遍――這也太昂貴了點。所以總是給StringBuffer設置一個合理的初始化容量值是錯不了的,這樣會帶來立竿見影的性能增益。StringBuffer初始化過程的調整的作用由此可見一斑。所以,使用一個合適的容量值來初始化StringBuffer永遠都是一個最佳的建議。
14、合理的使用Java類 java.util.Vector。

簡單地說,一個Vector就是一個java.lang.Object實例的數組。Vector與數組相似,它的元素可以通過整數形式的索引訪問。但是,Vector類型的對象在創建之後,對象的大小能夠根據元素的增加或者刪除而擴展、縮小。請考慮下面這個向Vector加入元素的例子:
Object bj = new Object();
Vector v = new Vector(100000);
for(int I=0;
I<100000; I++) { v.add(0,obj); }
除非有絕對充足的理由要求每次都把新元素插入到Vector的前面,否則上面的代碼對性能不利。在默認構造函數中,Vector的初始存儲能力是10個元素,如果新元素加入時存儲能力不足,則以後存儲能力每次加倍。Vector類就對象StringBuffer類一樣,每次擴展存儲能力時,所有現有的元素都要復制到新的存儲空間之中。下面的代碼片段要比前面的例子快幾個數量級:
Object bj = new Object();
Vector v = new Vector(100000);
for(int I=0; I<100000; I++) { v.add(obj); }
同樣的規則也適用於Vector類的remove()方法。由於Vector中各個元素之間不能含有「空隙」,刪除除最後一個元素之外的任意其他元素都導致被刪除元素之後的元素向前移動。也就是說,從Vector刪除最後一個元素要比刪除第一個元素「開銷」低好幾倍。
假設要從前面的Vector刪除所有元素,我們可以使用這種代碼:
for(int I=0; I<100000; I++)
{
v.remove(0);
}
但是,與下面的代碼相比,前面的代碼要慢幾個數量級:
for(int I=0; I<100000; I++)
{
v.remove(v.size()-1);
}
從Vector類型的對象v刪除所有元素的最好方法是:
v.removeAllElements();
假設Vector類型的對象v包含字元串「Hello」。考慮下面的代碼,它要從這個Vector中刪除「Hello」字元串:
String s = "Hello";
int i = v.indexOf(s);
if(I != -1) v.remove(s);
這些代碼看起來沒什麼錯誤,但它同樣對性能不利。在這段代碼中,indexOf()方法對v進行順序搜索尋找字元串「Hello」,remove(s)方法也要進行同樣的順序搜索。改進之後的版本是:
String s = "Hello";
int i = v.indexOf(s);
if(I != -1) v.remove(i);
這個版本中我們直接在remove()方法中給出待刪除元素的精確索引位置,從而避免了第二次搜索。一個更好的版本是:
String s = "Hello"; v.remove(s);
最後,我們再來看一個有關Vector類的代碼片段:
for(int I=0; I++;I < v.length)
如果v包含100,000個元素,這個代碼片段將調用v.size()方法100,000次。雖然size方法是一個簡單的方法,但它仍舊需要一次方法調用的開銷,至少JVM需要為它配置以及清除堆棧環境。在這里,for循環內部的代碼不會以任何方式修改Vector類型對象v的大小,因此上面的代碼最好改寫成下面這種形式:
int size = v.size(); for(int I=0; I++;I<size)
雖然這是一個簡單的改動,但它仍舊贏得了性能。畢竟,每一個CPU周期都是寶貴的。
15、當復制大量數據時,使用System.array()命令。
int[] src={1,3,5,6,7,8};
int[] dest = new int[6];
System.array(src, 0, dest, 0, 6);
src:源數組; srcPos:源數組要復制的起始位置;
dest:目的數組; destPos:目的數組放置的起始位置;
length:復制的長度.
注意:src and dest都必須是同類型或者可以進行轉換類型的數組.
16、代碼重構:增強代碼的可讀性。
public class ShopCart {
private List carts ;

public void add (Object item) {
if(carts == null) {
carts = new ArrayList();
}
crts.add(item);
}
public void remove(Object item) {
if(carts. contains(item)) {
carts.remove(item);
}
}
public List getCarts() {
//返回只讀列表
return Collections.unmodifiableList(carts);
}

//不推薦這種方式
//this.getCarts().add(item);
}
17、不用new關鍵詞創建類的實例

用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。
在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:
public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
18、乘法和除法

考慮下面的代碼:
for (val = 0; val < 100000; val +=5) {
alterX = val * 8; myResult = val * 2;
}
用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:
for (val = 0; val < 100000; val += 5) {
alterX = val << 3; myResult = val << 1;
}
修改後的代碼不再做乘以8的操作,而是改用等價的左移3位操作,每左移1位相當於乘以2。相應地,右移1位操作相當於除以2。值得一提的是,雖然移位操作速度快,但可能使代碼比較難於理解,所以最好加上一些注釋。
19、在JSP頁面中關閉無用的會話。

一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。由於session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。
對於那些無需跟蹤會話狀態的頁面,關閉自動創建的會話可以節省一些資源。使用如下page指令:<%@ page session="false"%>
20、JDBC與I/O

如果應用程序需要訪問一個規模很大的數據集,則應當考慮使用塊提取方式。默認情況下,JDBC每次提取32行數據。舉例來說,假設我們要遍歷一個5000行的記錄集,JDBC必須調用資料庫157次才能提取到全部數據。如果把塊大小改成512,則調用資料庫的次數將減少到10次。
21、Servlet與內存使用
許多開發者隨意地把大量信息保存到用戶會話之中。一些時候,保存在會話中的對象沒有及時地被垃圾回收機制回收。從性能上看,典型的症狀是用戶感到系統周期性地變慢,卻又不能把原因歸於任何一個具體的組件。如果監視JVM的堆空間,它的表現是內存佔用不正常地大起大落。
解決這類內存問題主要有二種辦法。第一種辦法是,在所有作用范圍為會話的Bean中實現HttpSessionBindingListener介面。這樣,只要實現valueUnbound()方法,就可以顯式地釋放Bean使用的資源。
另外一種辦法就是盡快地把會話作廢。大多數應用伺服器都有設置會話作廢間隔時間的選項。另外,也可以用編程的方式調用會話的setMaxInactiveInterval()方法,該方法用來設定在作廢會話之前,Servlet容器允許的客戶請求的最大間隔時間,以秒計。
22、使用緩沖標記

一些應用伺服器加入了面向JSP的緩沖標記功能。例如,BEA的WebLogic Server從6.0版本開始支持這個功能,Open Symphony工程也同樣支持這個功能。JSP緩沖標記既能夠緩沖頁面片斷,也能夠緩沖整個頁面。當JSP頁面執行時,如果目標片斷已經在緩沖之中,則生成該片斷的代碼就不用再執行。頁面級緩沖捕獲對指定URL的請求,並緩沖整個結果頁面。對於購物籃、目錄以及門戶網站的主頁來說,這個功能極其有用。對於這類應用,頁面級緩沖能夠保存頁面執行的結果,供後繼請求使用。
23、選擇合適的引用機制

在典型的JSP應用系統中,頁頭、頁腳部分往往被抽取出來,然後根據需要引入頁頭、頁腳。當前,在JSP頁面中引入外部資源的方法主要有兩種:include指令,以及include動作。
include指令:例如<%@ include file="right.html" %>。該指令在編譯時引入指定的資源。在編譯之前,帶有include指令的頁面和指定的資源被合並成一個文件。被引用的外部資源在編譯時就確定,比運行時才確定資源更高效。
include動作:例如<jsp:include page="right.jsp" />。該動作引入指定頁面執行後生成的結果。由於它在運行時完成,因此對輸出結果的控制更加靈活。但時,只有當被引用的內容頻繁地改變時,或者在對主頁面的請求沒有出現之前,被引用的頁面無法確定時,使用include動作才合算。
24、及時清除不再需要的會話

為了清除不再活動的會話,許多應用伺服器都有默認的會話超時時間,一般為30分鍾。當應用伺服器需要保存更多會話時,如果內存容量不足,操作系統會把部分內存數據轉移到磁碟,應用伺服器也可能根據「最近最頻繁使用」(Most Recently Used)演算法把部分不活躍的會話轉儲到磁碟,甚至可能拋出「內存不足」異常。在大規模系統中,串列化會話的代價是很昂貴的。當會話不再需要時,應當及時調用HttpSession.invalidate()方法清除會話。HttpSession.invalidate()方法通常可以在應用的退出頁面調用。
25、不要將數組聲明為:public static final 。
26、HashMap的遍歷效率討論

經常遇到對HashMap中的key和value值對的遍歷操作,有如下兩種方法:
Map<String, String[]> paraMap = new HashMap<String, String[]>();
//第一個循環
Set<String> appFieldDefIds = paraMap.keySet();
for (String appFieldDefId : appFieldDefIds) {
String[] values = paraMap.get(appFieldDefId);
......
}

//第二個循環
for(Entry<String, String[]> entry : paraMap.entrySet()){
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
.......
}
第一種實現明顯的效率不如第二種實現。
分析如下 Set<String> appFieldDefIds = paraMap.keySet(); 是先從HashMap中取得keySet
代碼如下:
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}

private class KeySet extends AbstractSet<K> {
public Iterator<K> iterator() {
return newKeyIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsKey(o);
}
public boolean remove(Object o) {
return HashMap.this.removeEntryForKey(o) != null;
}
public void clear() {
HashMap.this.clear();
}
}
其實就是返回一個私有類KeySet, 它是從AbstractSet繼承而來,實現了Set介面。
再來看看for/in循環的語法
for(declaration : expression)
statement
在執行階段被翻譯成如下各式
for(Iterator<E> #i = (expression).iterator(); #i.hashNext();){
declaration = #i.next();
statement
}
因此在第一個for語句for (String appFieldDefId : appFieldDefIds) 中調用了HashMap.keySet().iterator()
而這個方法調用了newKeyIterator()
Iterator<K> newKeyIterator() {
return new KeyIterator();
}
private class KeyIterator extends HashIterator<K> {
public K next() {
return nextEntry().getKey();
}
}
所以在for中還是調用了
在第二個循環for(Entry<String, String[]> entry : paraMap.entrySet())中使用的Iterator是如下的一個內部

private class EntryIterator extends HashIterator<Map.Entry<K,V>> {
public Map.Entry<K,V> next() {
return nextEntry();
}
}
此時第一個循環得到key,第二個循環得到HashMap的Entry效率就是從循環裡面體現出來的第二個循環此致可以直接取key和value值而第一個循環還是得再利用HashMap的get(Object key)來取value值現在看看HashMap的get(Object key)方法
public V get(Object key) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length); //Entry[] table
Entry<K,V> e = table;
while (true) {
if (e == null)
return null;
if (e.hash == hash && eq(k, e.key))
return e.value;
e = e.next;
}
}
其實就是再次利用Hash值取出相應的Entry做比較得到結果,所以使用第一中循環相當於兩次進入HashMap的Entry
中而第二個循環取得Entry的值之後直接取key和value,效率比第一個循環高。其實按照Map的概念來看也應該是用第二個循環好一點,它本來就是key和value的值對,將key和value分開操作在這里不是個好選擇。
27、array(數組) 和 ArryList的使用

array([]):最高效;但是其容量固定且無法動態改變;
ArrayList:容量可動態增長;但犧牲效率;
基於效率和類型檢驗,應盡可能使用array,無法確定數組大小時才使用ArrayList!
ArrayList是Array的復雜版本
ArrayList內部封裝了一個Object類型的數組,從一般的意義來說,它和數組沒有本質的差別,甚至於ArrayList的許多方法,如Index、IndexOf、Contains、Sort等都是在內部數組的基礎上直接調用Array的對應方法。
ArrayList存入對象時,拋棄類型信息,所有對象屏蔽為Object,編譯時不檢查類型,但是運行時會報錯。
註:jdk5中加入了對泛型的支持,已經可以在使用ArrayList時進行類型檢查。
從這一點上看來,ArrayList與數組的區別主要就是由於動態增容的效率問題了
28、盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了性能的開銷。
29、StringBuffer 和StringBuilder的區別:

java.lang.StringBuffer線程安全的可變字元序列。一個類似於 String 的字元串緩沖區,但不能修改。
StringBuilder。與該類相比,通常應該優先使用 java.lang.StringBuilder類,因為它支持所有相同的操作,但由於它不執行同步,所以速度更快。為了獲得更好的性能,在構造 StirngBuffer 或 StirngBuilder 時應盡可能指定它的容量。當然,如果你操作的字元串長度不超過 16 個字元就不用了。 相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%-15% 左右的性能提升,但卻要冒多線程不安全的風險。而在現實的模塊化編程中,負責某一模塊的程序員不一定能清晰地判斷該模塊是否會放入多線程的環境中運行,因此:除非你能確定你的系統的瓶頸是在 StringBuffer 上,並且確定你的模塊不會運行在多線程模式下,否則還是用 StringBuffer 吧。
30、盡量避免使用split
除非是必須的,否則應該避免使用split,split由於支持正則表達式,所以效率比較低,如果是頻繁的幾十,幾百萬的調用將會耗費大量資源,如果確實需要頻繁的調用split,可以考慮使用apache的 StringUtils.split(string,char),頻繁split的可以緩存結果。
其他補充:
1、及時清除不再使用的對象,設為null
2、盡可能使用final,static等關鍵字
3、盡可能使用buffered對象
如何優化代碼使JAVA源文件及編譯後CLASS文件更小
1 盡量使用繼承,繼承的方法越多,你要寫的代碼量也就越少
2 打開JAVA編譯器的優化選項: javac -O 這個選項將刪除掉CLASS文件中的行號,並能把
一些private, static,final的小段方法申明為inline方法調用
3 把公用的代碼提取出來
4 不要初始化很大的數組,盡管初始化一個數組在JAVA代碼中只是一行的代碼量,但
編譯後的代碼是一行代碼插入一個數組的元素,所以如果你有大量的數據需要存在數組
中的話,可以先把這些數據放在String中,然後在運行期把字元串解析到數組中
5 日期類型的對象會佔用很大的空間,如果你要存儲大量的日期對象,可以考慮把它存儲為
long型,然後在使用的時候轉換為Date類型
6 類名,方法名和變數名盡量使用簡短的名字,可以考慮使用Hashjava, Jobe, Obfuscate and Jshrink等工具自動完成這個工作
7 將static final類型的變數定義到Interface中去
8 算術運算 能用左移/右移的運算就不要用*和/運算,相同的運算不要運算多次
2. 不要兩次初始化變數
Java通過調用獨特的類構造器默認地初始化變數為一個已知的值。所有的對象被設置成null,integers (byte, short, int, long)被設置成0,float和double設置成0.0,Boolean變數設置成false。這對那些擴展自其它類的類尤其重要,這跟使用一個新的關鍵詞創建一個對象時所有一連串的構造器被自動調用一樣。
3. 在任何可能的地方讓類為Final
標記為final的類不能被擴展。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String。將String類標記為final阻止了開發者創建他們自己實現的長度方法。
更深入點說,如果類是final的,所有類的方法也是final的。Java編譯器可能會內聯所有的方法(這依賴於編譯器的實現)。在我的測試里,我已經看到性能平均增加了50%。
9. 異常在需要拋出的地方拋出,try catch能整合就整合
try {
some.method1(); // Difficult for javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}

try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代碼 更容易被編譯器優化
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循環的優化
Replace…
for( int i = 0; i < collection.size(); i++ ) {
...
}
with…
for( int i = 0, n = collection.size(); i < n; i++ ) {
...
}

5、 在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
10、盡量採用lazy loading 的策略,即在需要的時候才開始創建。
例如: String str = 「aaa」;
if(i == 1) {
list.add(str);
}
應替換為:
if(i == 1) {
String str = 「aaa」;
list.add(str);
}
12、不要在循環中使用:
Try {
} catch() {
}
應把其放置在最外層

⑼ 程序靜態分析的分析技術及實踐

程序靜態分析(Program Static Analysis)可以幫助軟體開發人員、質量保證人員查找代碼中存在的結構性錯誤、安全漏洞等問題,從而保證軟體的整體質量。還可以用於幫助軟體開發人員快速理解文檔殘缺的大規模軟體系統以及系統業務邏輯抽取等系統文檔化等領域。 如開發20年以上的金融核心COBOL系統,動輒上千萬行代碼的系統規模。對於理解這樣規模的系統,基於程序靜態分析的輔助理解工具就能發揮積極作用。
本文首先對程序靜態分析的特點、常用靜態分析技術、靜態分析實現方式進行描述,然後通過一個實例講解了程序靜態分析的執行過程。 程序靜態分析是與程序動態分析相對應的代碼分析技術,它通過對代碼的自動掃描發現隱含的程序問題,主要具有以下特點:
(1)不實際執行程序。動態分析是通過在真實或模擬環境中執行程序進行分析的方法,多用於性能測試、功能測試、內存泄漏測試等方面。與之相反,靜態分析不運行代碼只是通過對代碼的靜態掃描對程序進行分析。
(2)執行速度快、效率高。目前成熟的代碼靜態分析工具每秒可掃描上萬行代碼,相對於動態分析,具有檢測速度快、效率高的特點。
(3)誤報率較高。代碼靜態分析是通過對程序掃描找到匹配某種規則模式的代碼從而發現代碼中存在的問題,例如可以定位strcpy()這樣可能存在漏洞的函數,這樣有時會造成將一些正確代碼定位為缺陷的問題,因此靜態分析有時存在誤報率較高的缺陷,可結合動態分析方法進行修正。 (1)詞法分析:從左至右一個字元一個字元的讀入源程序,對構成源程序的字元流進行掃描,通過使用正則表達式匹配方法將源代碼轉換為等價的符號(Token) 流,生成相關符號列表,Lex為常用詞法分析工具。
(2)語法分析:判斷源程序結構上是否正確,通過使用上下文無關語法將相關符號整理為語法樹, Yacc為常用工具。
(3)抽象語法樹分析:將程序組織成樹形結構,樹中相關節點代表了程序中的相關代碼,目前已有javacc/ Antlra等抽象語法樹生成工具。
(4)語義分析:對結構上正確的源程序進行上下文有關性質的審查。
(5)控制流分析:生成有向控制流圖,用節點表示基本代碼塊,節點間的有向邊代表控制流路徑,反向邊表示可能存在的循環;還可生成函數調用關系圖,表示函數間的嵌套關系。
(6)數據流分析:對控制流圖進行遍歷,記錄變數的初始化點和引用點,保存切片相關數據信息。
(7)污點分析:基於數據流圖判斷源代碼中哪些變數可能受到攻擊,是驗證程序輸入、識別代碼表達缺陷的關鍵。
(8)無效代碼分析,根據控制流圖可分析孤立的節點部分為無效代碼。
程序靜態分析是在不執行程序的情況下對其進行分析的技術,簡稱為靜態分析。而程序動態分析則是另外一種程序分析策略,需要實際執行程序。大多數情況下,靜態分析的輸入都是源程序代碼,只有極少數情況會使用目標代碼。靜態分析這一術語一般用來形容自動化工具的分析,而人工分析則往往叫做程序理解。
靜態分析越來越多地被應用到程序優化、軟體錯誤檢測和系統理解領域。Coverity Inc.的軟體質量檢測產品就是利用靜態分析技術進行錯誤檢測的成功代表。國內某軟體公司的閃蝶(BlueMropho)代碼分析平台,是利用程序靜態分析技術專注於大型機遺留系統的代碼理解領域,尤其擅長分析千萬行代碼規模級的COBOL系統。

⑽ 新手 請大神幫我一步一步分析代碼 我一點思路都沒有 !!~~急急急!!!

classProgram
{
staticvoidMain(string[]args)
{
intsum=SumPeachTail(1,1);

Console.WriteLine("第一天摘得桃子有:{0}",sum);

Console.Read();
}

//尾遞歸
staticintSumPeachTail(intday,inttotal)
{
if(day==10)
returntotal;

//將當前的值計算出傳遞給下一層
returnSumPeachTail(day+1,2*total+2);
}
}

閱讀全文

與常用代碼分析方法相關的資料

熱點內容
幼兒舞蹈教學方法示範 瀏覽:451
用菜籽油炸薯片要用簡便的方法 瀏覽:527
提魚方法視頻教程 瀏覽:850
記憶拼貼的訓練方法 瀏覽:61
防凍害的最佳方法 瀏覽:596
練肩頸的最好方法視頻 瀏覽:846
聚會用香水的正確方法 瀏覽:527
最簡單的房子封頂方法 瀏覽:441
咳嗽灸溫控貼使用方法 瀏覽:899
男士如何美白臉部最快方法 瀏覽:718
學生提分方法怎麼寫 瀏覽:306
國標中檢測金葡萄球菌的三種方法 瀏覽:805
文言文劃分停頓的方法有哪些 瀏覽:343
檢測酶活性方法 瀏覽:228
常用心理測驗的應用方法 瀏覽:520
快速取戒指的方法 瀏覽:518
紫甘藍正確服用方法 瀏覽:751
喉原位癌早期浸潤的治療方法 瀏覽:299
桂花樹苗嫁接方法視頻 瀏覽:956
如何判斷出貨方法 瀏覽:627