隨著國內金融及電信領域對Java卡的採用,越來越多公司開始著手開發Java卡應用,java卡應用編寫上相對容易得多,但是Java卡是一個資源有限的設備,在其上面運行的Java卡應用不能隨心所欲的編寫,因為這將影響到應用的性能問題,下面將介紹如何開發一個高效的Java卡應用(限於時間的原因,本文將不斷完善中)。
(1)使用靜態域代替對象域:對象域的訪問將使用getfield和putfield指令,這些指令都將涉及到對象實例,虛擬機實現中將首先定位對象實例的位置,然後根據Token定位到具體的數據域位置,這其中會涉及到很多的時間開銷,而靜態域的訪問相對要簡單的多。
(2)使用靜態方法代替虛方法:虛方法的調用與對象實例有關,對象實例與實例化時的Java類有關,虛擬機在處理虛方法調用時需要確定實例對象實例化時的Java類,並根據虛方法的token值查找該類是否實現了此方法,如果沒有則需要去父類中查找,知道找到這個方法為止,可見這個過程是比較繁瑣的,時間上肯定會產生一定的開銷。而相對來講,靜態方法則沒有這樣複雜,每個靜態方法在Java卡中都是唯一的,即使靜態方法的名字是相同的,虛擬機基本上可以立刻定位靜態方法的位置。
(3)正確聲明方法的屬性:這裡主要說的是public、private、protected的使用。 public和protected主要用於lib包的實現中,對於一個獨立的applet基本上用不到,除了private聲明的方法在調用時會產生invoke_special的虛擬機指令外,其他情況下基本上都會產生invoke_virtual虛擬機指令(當然這裡所提到的方法不包括靜態方法和接口實現方法),虛擬機對invoke_special指令的處理通常不會進行防火牆檢查,而invoke_virtual則不同,因此如果可能的情況下為方法聲明private屬性也會減少方法調用上的時間開銷。
(4)減少方法的調用層次:任何方法的調用都需要保存調用前的java frame,以便從被調用方法返回後能夠繼續執行,這需要時間和空間上的開銷;再有,方法調用時定位方法的位置需要時間開銷,方法定位以後準備新的java frame需要時間和空間上的開銷。因此減少方法調用的層次會減少這些不必要的消耗。
(5)正確使用CLEAR_ON_DESELECT對象和CLEAR_ON_RESET對象:這兩種對像在java卡中成為transient對象,它們的特點是對像是永久存在的,數據是暫時的,說白了就是其數據是存儲在ram中。因此,這種對像數據域的更新是非常迅速的(RAM相對於EEPROM來講)。 CLEAR_ON_DESELECT對像是在應用會話內有效的,它與其他應用公用RAM空間,建議在可能的情況下將其作為首選。 CLEAR_ON_RESET對像是卡會話內有效的,它佔用獨立的RAM空間。
(6)多使用局部變量:在一個方法中需要多次訪問某對象的域(field),如果採用obj1.field的方式訪問將產生getField的虛擬機指令,虛擬機在處理這種指令時需要先定位到對象,然後在定位到具體的數據位置;局部變量的存儲會產生aload、sload等或astore、sstore等的虛擬機指令,虛擬機對這種指令的處理相比getField要簡單得多。因此,對於一個方法中藥多次訪問對象域的時候可以先將其保存在局部變量中,後續直接訪問局部變量。
(7)使用switch代替多個if:多個if語句在編譯後會產生多個if形式的虛擬機指令,而且每次的if都伴隨著操作數入棧的附加虛擬機指令,而如果使用switch語句會生成stableSwitch或slookupswitch虛擬機指令,這相當於將多個虛擬機指令合為一個虛擬機指令,這會提高應用的執行效率。還有一點,stableSwitch比slookupswitch的效率要高,所以在應用設計的時候盡量保證case中值是連續的。
(8)正確使用原子操作:原子操作會產生額外的EEPROM寫操作,我們都清楚EEPROM的寫操作很消耗時間,因此,應該反复推敲應用中的業務流程,盡量減少必須得原子操作。可以考慮使用狀態機是否可以代替某些業務流程中的原子操作。
(9)應用安裝時完成全部空間的分配:Java卡應用不能像Java應用一樣隨時創建對像或釋放對象,這些過程很消耗時間,因此建議在應用安裝的時候完成全部所需對象和空間的分配,這樣做的好處一個是可以節省時間,另外的一個好處是可以減少存儲空間上的碎片。
(10)使用Util.makeShort()、Util.getShort和Util.setShort():這三個函數通常對於應用開發者來講感覺是多餘的,因為這三個函數的功能使用Java語言也很容易實現,如:Util.makeShort(a, b)==> ((a<< 8) | (b & 0xFF)),另外兩個函數就不舉例了,的確,使用Java語言也可以實現這三個函數,但是用Java語言實現會產生很多的虛擬機指令,並且這些虛擬機指令的執行還比較的消耗時間,而虛擬機對這三個函數的實現通常都比較簡單。
(11)將數組合併:一般的虛擬機實現對對象訪問會有cache,cache空間的大小(能cache的對像個數)是固定的,對多個對象的訪問會導致cache的命不中,而將多個同類型的數組對象合併為一個大數組能夠減少對象的數量。
轉貼自: http://hi.baidu.com/0x9000/item/30f71f2db724d59ab73263a7
沒有留言:
張貼留言