beetl 效能揭秘 2 :語言如何存取變數

來源:互聯網
上載者:User

標籤: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倍

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.