1.預測時間:算法
PSP2.1性能優化 |
Personal Software Process Stages函數 |
Time 性能 |
Planning學習 |
計劃測試 |
|
· Estimate優化 |
· 估計這個任務須要多少時間編碼 |
10分鐘spa |
Development設計 |
開發 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
20分鐘 |
· Design Spec |
· 生成設計文檔 |
30分鐘 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
20分鐘 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
20分鐘 |
· Design |
· 具體設計 |
40分鐘 |
· Coding |
· 具體編碼 |
5個小時 |
· Code Review |
· 代碼複審 |
30分鐘 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
1個小時 |
Reporting |
報告 |
|
· Test Report |
· 測試報告 |
1小時 |
· Size Measurement |
· 計算工做量 |
40分鐘 |
· Postmortem & Process Improvement Plan |
· 過後總結, 並提出過程改進計劃 |
30分鐘 |
合計 |
11小時 |
2.實際時間:
PSP2.1 |
Personal Software Process Stages |
Time |
Planning |
計劃 |
|
· Estimate |
· 估計這個任務須要多少時間 |
20分鐘 |
Development |
開發 |
|
· Analysis |
· 需求分析 (包括學習新技術) |
30分鐘 |
· Design Spec |
· 生成設計文檔 |
10分鐘 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
10分鐘 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
20分鐘 |
· Design |
· 具體設計 |
40分鐘 |
· Coding |
· 具體編碼 |
6個小時 |
· Code Review |
· 代碼複審 |
20分鐘 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
1個小時 |
Reporting |
報告 |
|
· Test Report |
· 測試報告 |
20分鐘 |
· Size Measurement |
· 計算工做量 |
10分鐘 |
· Postmortem & Process Improvement Plan |
· 過後總結, 並提出過程改進計劃 |
10分鐘 |
合計 |
10個小時 |
3.性能優化:
消耗最大的函數是StreamWriter.Flush(),這個函數,每次寫入完成用來清空緩衝區,由於在生成10000個左右的式子時極可能緩衝區滿而出現寫入不完整的狀況,因此每次寫入一個式子我都會清空緩衝區。這個能夠不使用緩衝區而直接寫入來解決,然而這樣的io操做可能會變慢。因此不進行改變。
優化前:
通過性能測試發現,最佔用資源的函數是二元式類Two的toString 函數。跟入此函數發現,該函數會在每次調用時都根據類屬性計算其字符串映射。然而此類是一個不可變對象,然而它的實例被構造後可能不會調用toString進行輸出。因此,咱們設置一類屬性存儲其字符串映射。而且,初始值爲null,只有當第一次調用toString函數時纔會計算其值,之後每次調用toString只要輸出該屬性就能夠。
4.測試樣例:
論證正確性:
個人生成算法能夠由數學證實在線性生成過程當中不會生成重複的表達式,證實以下:
首先定義元a,元集A。二元式b,二元式集B。運算符f,運算符集F。
A := 知足值域要求的 天然數、真分數 | B;
B := AFA;
F := ‘+’|’-’|’*’|’/’;
若是b1=a1 f1 a2,b2=a3 f2 a4屬於B,則:
b1與b2不等價的充分條件是:
f1 != f2 或
f1 == f2 且 f1 == ‘+’ 或 ‘*’ ,(a1,a3) != (a3,a4) && (a1,a3) != (a4,a3)
由以上定義和推理咱們能夠概括出不生成重複表達式的線性算法,即用全部一元構造狹義二元式(即兩個一元和一個運算符組成),以後用狹義二元式和一元構造足夠數目的廣義二元式(即二元式自己也可做爲元),只要在遞歸和迭代的生成過程當中,任意二元式知足不重複的充分,則必定沒有重複的二元式。
十個測試用例:
(額。。。這個是生成的文件。。。好像無法傳文件啊。。。。)