Jacl與Jython性能測評總結(jié)
一、Jacl 與Jython歷史與由來
在一些Java應(yīng)用的需求中,集成某種腳本語言的支持能夠帶來很大的方便。例如,用戶可能想要編寫腳本程序驅(qū)動應(yīng)用、擴(kuò)展應(yīng)用,或為了簡化操作而編寫循環(huán)和其他流程控制邏輯。在這些情況下,一種理想的解決方案是在Java應(yīng)用中提供對腳本語言解釋器的支持,讓腳本語言解釋器讀取用戶編寫的腳本并在應(yīng)用提供的類上運(yùn)行這些腳本。為了實現(xiàn)這個目標(biāo),你可以在Java應(yīng)用所運(yùn)行的JVM中,運(yùn)行一個基于Java的腳本語言解釋器。Jacl與Jython便是Java腳本語言。Jacl為Tcl的Java實現(xiàn),Jython為Python的Java實現(xiàn)。 (其他的腳本語言:Rhino:JavaScript的Java實現(xiàn)。 BeanShell:一個用Java編寫的Java源代碼解釋器。)
二、Jacl與Jython性能比較
1)Jacl與Jython性能之可用性比較:
Jacl:如果你想要在Tk腳本代碼中創(chuàng)建用戶界面元素,請訪問Swank project,它把Java的Swing部件封裝到了Tk里面。發(fā)行版不包含Jacl腳本的調(diào)試器。
Jython:支持用Python語法編寫的腳本。Python利用縮進(jìn)層次表示代碼塊的結(jié)構(gòu),而不是象其他許多語言一樣用花括號或開始-結(jié)束符號表示控制流程。
2)Jacl與Jython性能之運(yùn)行測試:
為一致起見,測試程序的每一種腳本語言的版本都盡量地相似。測試在一臺Toshiba Tecra 8100筆記本上進(jìn)行,CPU是700-MHz的Pentium III處理器,RAM是256 MB。調(diào)用JVM時,堆棧大小使用默認(rèn)值。
表格一:從1到1000000計數(shù)的for循環(huán):
解釋器類型 | 時間 |
Jacl | 140 秒 |
Jython | 1.2 秒 |
表格二:比較整數(shù)是否相等,1000000次:
解釋器類型 | 時間 |
Jacl | 300 秒 |
Jython | 4 秒 |
表格三:分配并初始化100000個元素的數(shù)組:
解釋器類型 | 時間 |
Jacl | 25 秒 |
Jython | 1 秒 |
表格四:分配并初始化500 X 500 個元素的數(shù)組:
解釋器類型 | 時間 |
Jacl | 45 秒 |
Jython | 1秒 |
表格五:在JVM內(nèi)初始化解釋器所需要的內(nèi)存:
解釋器類型 | 時間 |
Jacl | 大約1M |
Jython | 大約4M |
本項評測證明Jython性能最好,Jacl性能可能是令人難以接受的。如果腳本程序重復(fù)執(zhí)行代碼的機(jī)會很少,那么這些解釋器在速度上的相對差異就不那么重要了。值得指出的是,Jython看來沒有為聲明二維數(shù)組提供內(nèi)建的直接支持,但這個問題可以通過一個“數(shù)組的數(shù)組”結(jié)構(gòu)解決。
3)Jacl與Jython性能之集成的難易程度(測試)
本項評測包含兩個任務(wù)。第一個任務(wù)是比較對各種腳本語言解釋器進(jìn)行實例化時需要多少代碼;第二個任務(wù)是編寫一個完成如下操作的腳本:實例化一個Java JFrame,放入一個JTree,調(diào)整大小并顯示出JFrame。盡管這些任務(wù)都很簡單,但由此我們可以看出開始使用一個解釋器要做多少工作,還可以看出為解釋器編寫的腳本代碼在調(diào)用Java類時到底是什么樣子。
Jacl性能測試
要把Jacl集成到Java應(yīng)用,首先要把Jacl的Jar文件加入到Java的CLASSPATH,然后在執(zhí)行腳本之前,創(chuàng)建Jacl解釋器的實例。下面是創(chuàng)建Jacl解釋器實例的代碼:
Jacl代碼清單:
下面的Jacl腳本代碼顯示了如何創(chuàng)建一個JTree,把它放入JFrame,調(diào)整大小并顯示JFrame:
- import tcl.lang.*;
- public class SimpleEmbedded {
- public static void main(String args[]) {
- try {
- Interp interp = new Interp();
- } catch (Exception e) {
- }
- }
Jacl代碼清單
- package require java
- set env(TCL_CLASSPATH)
- set mid [java::new javax.swing.JTree]
- set f [java::new javax.swing.JFrame]
- $f setSize 200 200
- set layout [java::new java.awt.BorderLayout]
- $f setLayout $layout
- $f add $mid
- $f show
Jython性能測試
要把Jython集成到Java應(yīng)用,首先要把Jython的Jar文件加入到Java的CLASSPATH,然后在執(zhí)行腳本之前,創(chuàng)建一個Jython解釋器的實例。完成這個任務(wù)的Jython代碼很簡單:
Jython代碼清單:
下面的Jython腳本代碼顯示了如何創(chuàng)建JTree,把它放入JFrame,然后顯示出JFrame。下面的代碼不包含調(diào)整大小的操作:
- import org.python.util.PythonInterpreter;
- import org.python.core.*;
- public class SimpleEmbedded {
- public static void main(String []args) throws PyException {
- PythonInterpreter interp = new PythonInterpreter();
- }
- }
Jython代碼清單
- from pawt import swing
- import java, sys
- frame = swing.JFrame('Jython example', visible=1)
- tree = swing.JTree()
- frame.contentPane.add(tree)
- frame.pack()
從上面的說明可以看出,在Java應(yīng)用中集成任何一種解釋器都是很容易的。同時,只要你掌握了腳本語言的語法,就能夠高效地編寫出腳本程序。
Jacl與jython性能測評總結(jié):
與其他解釋器相比,Jacl的發(fā)展速度看起來特別慢,但如果你必須使用Tcl腳本,使用Jacl解釋器仍舊是值得的。Jython性能比較強(qiáng)大,是速度最快的一種。唯一真正令人擔(dān)心的是Jyphon的流程控制語法,不過,你可能會在乎這些語法上的差異,也可能不會在乎。就象Jacl一樣,由于需要學(xué)習(xí)的新知識比較多,用Jython編寫腳本可能需要比JavaScript和BeanShell更長的學(xué)習(xí)時間。如果你想要用Python編寫比較復(fù)雜的腳本,就應(yīng)該買一本書。Python是一種廣受歡迎的編程語言,因此可供選擇的書籍也相當(dāng)多。
【編輯推薦】