0261期:多層次(Multi-Tier)程式設計的效能瓶頸
因為之前還在負責實作新系統其他部份的程式及修正資料,所以將跟前端網站的資料交換交給另一位同事實作,因為整個架構是第一次撰寫,所以資料交換的速度似乎存在很多的問題,讓前端查詢資料時,速度拖慢了許多。
慢慢檢視一部份的程式,我才慢慢解開這些效能的謎團,原本因為我初期只撰寫一部份示範程式,某些變數我是用整體變數處理,因而需要取得和鎖住特定的 Critical Section,但是如果同時有許多查詢式,就會造成排隊很久的現象,我請同事改成動態取用程式內的區域變數,就可以減少不必要的 Critical Section,讓排隊的現象減少而舒緩。
接下來針對複雜的查詢式,由原本多的 SQL 命令改為單一個命令,並對主要查詢欄位建立索引,這時查詢速度已經慢慢增快了,但是離我們的目標速度大概還是四倍左右。
我自己以 Delphi 寫作一個模擬前端程式來存取我們的交換 API,與網站間存取存在 1 秒鐘左右的時間差,後來才發現是網路存取介面的實作層有些問題,我們有提供資料流的長度,前端可以在取得相當資料後,即行斷線,而不用等 Timeout 才斷線,就可以變的更快。
最後我也發現原本我們的程式會在後端 Application Server(AP) 沒啟動時,自動啟動 AP,但查詢結束後,APServer 也會關閉,如果先開啟 AP,就會降低這部份的問題,最後才提高整個效能到可以接受的程度。
由於多執行緒的程式在除錯時有很多的限制,加上多層次的複雜性,跟一般的程式概念有部份的差異,所以找起問題要花上更多的時間,只是我想只要有心就可以慢慢抽絲撥繭,找到你想要的問題根源。
慢慢檢視一部份的程式,我才慢慢解開這些效能的謎團,原本因為我初期只撰寫一部份示範程式,某些變數我是用整體變數處理,因而需要取得和鎖住特定的 Critical Section,但是如果同時有許多查詢式,就會造成排隊很久的現象,我請同事改成動態取用程式內的區域變數,就可以減少不必要的 Critical Section,讓排隊的現象減少而舒緩。
接下來針對複雜的查詢式,由原本多的 SQL 命令改為單一個命令,並對主要查詢欄位建立索引,這時查詢速度已經慢慢增快了,但是離我們的目標速度大概還是四倍左右。
我自己以 Delphi 寫作一個模擬前端程式來存取我們的交換 API,與網站間存取存在 1 秒鐘左右的時間差,後來才發現是網路存取介面的實作層有些問題,我們有提供資料流的長度,前端可以在取得相當資料後,即行斷線,而不用等 Timeout 才斷線,就可以變的更快。
最後我也發現原本我們的程式會在後端 Application Server(AP) 沒啟動時,自動啟動 AP,但查詢結束後,APServer 也會關閉,如果先開啟 AP,就會降低這部份的問題,最後才提高整個效能到可以接受的程度。
由於多執行緒的程式在除錯時有很多的限制,加上多層次的複雜性,跟一般的程式概念有部份的差異,所以找起問題要花上更多的時間,只是我想只要有心就可以慢慢抽絲撥繭,找到你想要的問題根源。
















