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