標籤:style http java color 使用 strong
對於一個程式語言來說,訪問變數是一個基本的操作,也是最頻繁使用的操作。提高Beetl訪問變數的效率,將整體上提高Beetl的效能,本文介紹了Beetl是如何訪問變數的。
首先看一個簡單的例子:
var a = "hi";print(a);
第一行定義a變數,第二行引用a變數列印輸出,通常設計下,可以在變數定義的時候將變數儲存到map裡,需要用的時候根據變數名取出。因此上訴代碼可以翻譯為java的類似如下代碼:
context.put("a","hi");
print(context.get("a");
儘管我們都知道Map存取都是非常快的,但還有沒有更快的方式呢,答案就是有,那就是數組,數組的存取更快,通過如下代碼可以看出,
數組的存放元素的速度是Map的10倍,讀取那就更快了,是100倍
String value1 = "a"; String value2 = "b"; String value3 = "c"; String key1 = "key1"; String key2 = "key2"; String key3 = "key3"; String[] objects = new String[3]; int loop = 10000 * 5000; //計算數組存消耗的時間 Log.key1Start(); for (int i = 0; i < loop; i++) { objects[0] = value1; objects[1] = value2; objects[2] = value3; } Log.key1End(); Map<String, String> map = new HashMap<String, String>(3); //計算Map存消耗的時間 Log.key2Start(); for (int i = 0; i < loop; i++) { map.put(key1, value1); map.put(key2, value2); map.put(key3, value3); } Log.key2End(); // 計算數組取消耗的時間 Log.key3Start(); for (int i = 0; i < loop; i++) { value1 = objects[0]; value2 = objects[1]; value3 = objects[2]; } Log.key3End(); // 計算map取消耗的時間 Log.key4Start(); for (int i = 0; i < loop; i++) { value1 = map.get(key1); value2 = map.get(key2); value3 = map.get(key3); } Log.key4End(); //列印效能統計資料 Log.display("使用數組設定", "使用Map設定", "使用數組讀取", "使用map讀取");
控制台輸出:
======================
使用數組設定=139 百分比,Infinity
使用Map設定=1020 百分比,Infinity
使用數組讀取=3 百分比,Infinity
使用map讀取=767 百分比,Infinity
(代碼參考 https://github.com/javamonkey/ ... .java
Beetl在修改2.0引擎的時候,對變數存取進行了最佳化,使用一個一維數組來儲存變數,如本文開頭的例子
,在2.0引擎裡,翻譯成如下代碼:
context.vars[varNode.index] = "hi"print(context.vars[varNode.index]);
那麼,Beetl又是怎麼做給模板變數分配索引呢?如下代碼是如何分配索引的?
var a = 0;{var b = 2; }{var c = 2;} var d =1 ;
雖然有4個變數,但維護這些變數的只需要一個一維數組就可以,數組長度是3
節點a,d,c,b的index是0,1,2,2,就是子context(進入block後) 會在上一級context後面排著:先分配頂級變數a和d,賦上索引是0和1,然後二級變數b賦值索引是2,對於同樣是二級的變數c,也可以賦上索引為2,因為變數b的已經出了範圍。
經過效能測試證明2.0的效能關於變數賦值和引用,綜合提高了50倍