亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
客戶機應用程序的性能測試
作者:網絡轉載 發布時間:[ 2013/2/21 14:52:40 ] 推薦標簽:

viewer.addSelectionChangedListener(new ISelectionChangedListener() {
    public void selectionChanged(SelectionChangedEvent event) {
        new Job("go to db") {
            protected IStatus run(IProgressMonitor monitor) {
                //do expensive work here
                return Status.OK_STATUS;
            }
        }.schedule();
    }
});


清單 3 的開發人員知道這個操作很耗時,把它放到一個后臺 Job 中去做。但是問題在于開發人員沒有預料到 用戶可能在收件箱中選擇一條消息后會按住鍵盤上的向下箭頭持續幾秒鐘。 一般在這種情況下,每個選擇的改變會導致執行一個新的后臺 Job。很快,JobManager 會被 Job 填滿。

清單 4 提供了一個更好的選擇,不使用選擇處理程序, 而是用 postSelection 處理程序。JFace 為執行事件接合 提供了 PostSelection 處理程序,從而使得后一個選擇成為您的應用程序所接受的 選擇 —— 而不是您的應用程序無法處理的一大堆選擇。 您可以認為它忽略了過于嘈雜的細小事件,僅關注其中一些較大的。

清單 4. 僅對后一個選擇改變做響應的選擇偵聽器

               
viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
    public void selectionChanged(SelectionChangedEvent event) {
        new Job("go to db") {
            protected IStatus run(IProgressMonitor monitor) {
                //do expensive work here
                return Status.OK_STATUS;
            }
        }.schedule();
    }
};

處理磁盤 I/O

您一定聽說過:內存讀寫以納秒計,磁盤讀寫以毫秒計。 在我曾參與的絕大多數 RCP 應用程序中,瓶頸是 CPU,而不是磁盤 I/O。 但是,磁盤 I/O 仍然可能成為問題,您不應忽視它。 RCP 應用程序的一類常見問題是對磁盤的低效率映象讀取。

我一般使用 Sysinternals Process Monitor 考察一個應用程序如何使用文件。 舉例而言,圖 5 說明可以容易地識別對未緩沖文件的讀取:

圖 5. Process monitor 顯示未緩沖讀取 I/O

如果您逐行閱讀圖 5,您會發現正在讀取一個名為 big.txt 的文件。 后一列說明對該文件每次只讀取一個字節。清單 5 說明了導致這種情況的代碼:

清單 5. 未緩沖的 I/O(不要這么做)

               
InputStream in = new FileInputStream(args[0]);
int c;
while ((c = in.read()) != -1) {
    //stuff characters in buffer, etc
}


我的 ThinkPad T60p 筆記本硬盤速度是 7200RPM,它讀取一個 7MB 的文件需要 用 24 秒。如果用 BufferedInputStream,時間將減少到 350 毫秒。 絕大多數的此類提速可歸功于更好地利用硬盤。可能您的絕大多數程序不會有這么巨大的效果, 但是仍然值得用象 BufferedInputStream 一樣的緩沖流來解決未緩沖 I/O 問題。

我在 RCP 應用程序中觀察到的另一個問題被我稱為映象燃燒, 當從磁盤頻繁讀取一個映象然后丟棄時該問題會發生。根據頻繁程度,該映象可能好進入緩存。

線程和 Eclipse 作業

應用程序應該充分利用計算機資源。 為了優化地使用 CPU,應用程序所擁有的線程數目應與處理程序計數和線程工作類型相關。 每個 Java 線程都關聯著一定數量的本地內存,線程切換上下文時會導致一些 CPU 耗費, 所以并不是線程越多越好。

我經常在客戶端應用程序中看到對線程的錯誤使用。對于那些曾可能阻塞 UI 線程的長時間運行操作, 用一些線程來做是好事,但是在基于 RCP 的應用程序中,Job(幾乎)應該總優先于線程。
 

您還應小心不要讓 JobManager 被 Job 填滿, 因為這樣的話,它的默認工作者池會無限增長下去。

Job 類似于 Runnable:它們描述 task,而不是所運行的線程。Job(并不令人驚訝)由 JobManager 管理,它維持著一個工作者池。即很多 Job 可以被一個工作者池管理。Job 相比于線程所具有的另一個大優勢是 Job 可以從外部(out-of-the-box)進行記錄。您可以設置一些標識并運行應用程序,JobManager 會告訴您每個 Job 何時被創建、安排、運行以及完成。JobManager 還會告訴您它是如何管理工作者池。 當您試圖了解何時執行后臺 Job 以及它們的運行需要多長時間時,這會是一個巨大的優勢。

要啟用這項支持,將 清單 6 的內容添加到一個文件。(此信息可以在org.eclipse.core.jobs 包的 .options 文件中找到。) 然后啟動您的 RCP 應用程序,需要有 -debug Path_to_debug_file .

清單 6. 啟用 Job 調試信息

               
# Prints debug information on running background jobs
org.eclipse.core.jobs/jobs=true
# Includes current date and time in job debug information
org.eclipse.core.jobs/jobs/timing=true
# Computes location of error on mismatched IJobManager.beginRule/endRule
org.eclipse.core.jobs/jobs/beginend=true
# Pedantic assertion checking on locks and deadlock reporting
org.eclipse.core.jobs/jobs/locks=true
# Throws an IllegalStateException when deadlock occurs
org.eclipse.core.jobs/jobs/errorondeadlock=true
# Debug shutdown behaviour
org.eclipse.core.jobs/jobs/shutdown=true


Job 還支持高級計劃規則。 您可以創建簡單的或復雜的計劃規則,支配 Job 的運行時機。清單 7 說明了一種方式,您可以創建一條規則,禁止 兩個 Job 同時運行:

清單 7. 禁止兩個 Job 同時運行

               
ISchedulingRule onlyOne = new ISchedulingRule() {
    public boolean isConflicting(ISchedulingRule rule) {
        return rule == this;
    }
    public boolean contains(ISchedulingRule rule) {
        return rule == this;
    }
};
Job job1 = new LongRunningJob();
Job job2 = new LongRunningJob();
job1.setRule(onlyOne);
job2.setRule(onlyOne);
job1.schedule();
job2.schedule();
return onlyOne;


清單 7 中的代碼能夠工作,是因為計劃規則的 isConflicting() 方法在 Job 運行前被調用。當 job1 執行時,它 “擁有” 該規則。請參閱 ISchedulingRule 的實現。要獲得更多示例(請參閱 參考資料)。

java.util.Timer 也容易被錯誤使用。 很多應用程序會創建幾個 Timer,每個 Timer 創建一個專門的管理線程。典型地,每個應用程序應只創建一個 Timer 并讓它管理多個 java.util.TimerTask,但是很多相互孤立的開發人員會創建他們自己的 Timer,這只會浪費更多的線程。在幾乎所有的 RCP 應用程序案例中,java.util.Timer 可以被 Job 取代,計劃在未來某個時間執行。

如果您所運行的 JVM 版本高于 1.4,您能從 java.util.concurrent Executor、ScheduledThreadPoolExecutor 和 Task 得到大量相同好處。java.util.Timer 類并未受到輕視,但不管出于何種目的, 它都可由 ScheduledExecutorService替代。

上一頁12345下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 亚洲激情网址 | 男人午夜禁片在线观看 | 成人永久福利在线观看不卡 | 永久免费精品视频 | 国产精品青青青高清在线 | free性hd另类 | 亚洲综合色秘密影院秘密影院 | www.天天色.com| 天天射天天干天天操 | 久久午夜一区二区 | 中文三 级 黄 色 片 | 120秒午夜体验区5次 | 波多野结衣一区二区三区 | 日本www色视频萌爱网 | 日韩美女免费线视频网址 | 狠狠综合| 免费播放国产一级 | 奇米777狠狠色噜噜狠狠狠 | 中文字幕一区二区三区5566 | 法国18sexxxx性xxx | 清清草在线视频 | 狠狠丁香| 女性特黄一级毛片 | 黄视频网站在线 | 色婷婷影院在线视频免费播放 | 亚洲视频在线观看免费 | 亚洲综合男人的天堂色婷婷 | qvod激情视频在线观看 | 真实一级一级一片免费视频 | 高清视频 一区二区三区四区 | 亚洲欧洲在线观看 | 午夜影院伦理 | 激情五月激情综合色区 | 日本哺乳期xxxxhd奶水 | 午夜伦理片在线观看 | 国产精品欧美一区二区三区 | 欧美videos极度另类 | 夜夜爱成人免费网站 | 午夜寂寞影| 国产成人18黄网站在线观看网站 | 亚洲最色网站 |