`
javamonkey
  • 浏览: 169343 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

beetl 性能揭秘 2 :语言如何存取变量

阅读更多

对于一个程序语言来说,访问变量是一个基本的操作,也是最频繁使用的操作。提高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倍

分享到:
评论

相关推荐

    基于java的模板语言 Beetl.zip

    2. **强大的变量处理**:Beetl支持多种类型的变量操作,包括取值、计算、条件判断、循环等。它提供了丰富的内置函数,如字符串处理、日期时间操作、集合操作等,使得模板中的变量处理变得灵活多样。 3. **模板继承...

    Beetl2.2.3 jar包

    2. **高性能**:Beetl采用了高效的编译技术,将模板编译为Java字节码,执行时无需额外的解释过程,从而提高了运行速度。此外,其内部优化机制也使得模板解析和执行效率较高。 3. **强大的标签库**:Beetl提供了丰富...

    beetl-core

    - 高性能:Beetl的性能远远超过主流Java模板引擎,引擎性能是Freemaker的5-6倍,是JSP的2倍。 - 易于整合:Beetl可以很方便地与多种Web框架整合,如SpringMVC、JFinal、Struts、Nutz、Jodd、Servlet等。 - 支持模板...

    java源码:Java模板语言 Beetl.rar

    2. **模板语法**:Beetl提供了丰富的控制结构,如循环(foreach)、条件判断(if/else)、包含(include)和导入(import)等,方便构建复杂的页面布局。 3. **标签库**:Beetl支持自定义标签,可以创建自己的模板...

    kuka系统变量的变量最新版中文版

    2. 变量命名规则:KUKA 的变量命名遵循特定的规则,通常包含前缀、类型标识和变量名,如 "KRLVAR" 开头表示 KUKA Robot Language 变量。 3. 变量读写:在 KUKA 的编程语言 KRL(KUKA Robot Language)中,你可以...

    时间序列分析:单变量与多变量方法

    总的来说,这些文件涵盖了时间序列分析的基础到高级主题,包括基本概念、“2基本概念.pdf”,季节性模型,谱估计,模型选择,以及处理非平稳性和多变量关系的方法。通过深入学习这些材料,你可以掌握从数据中提取有...

    beetl模版引擎文档

    3. 性能优异:Beetl的性能远远超过了传统的Java模板引擎,比如它是Freemarker性能的5-6倍,JSP性能的2倍。这得益于Beetl从宏观到微观的多层面优化,包括但不限于优化渲染引擎、IO二进制输出、字节码属性访问、使用一...

    Beetl 模版引擎

    3. 高性能:Beetl的性能远超主流Java模板引擎。根据性能比较,Beetl的引擎性能是Freemarker的5-6倍,JSP的2倍。 4. 易于整合:Beetl可以轻松整合到多种web框架中。 5. 支持模板单独开发和测试:即使在没有M和C部分...

    PL0(包括对其的扩充)

    其中,语句①的循环变量的步长为2,  语句②的循环变量的步长为-2。  (3)增加运算:++ 和 --。  选做内容: (1)增加类型:① 字符类型; ② 实数类型。 (2)扩充函数:① 有返回值和返回语句;② 有参数函数...

    编程选择题40道:Java语言基础:数据类型与变量.Tex.docx

    编程选择题40道:Java语言基础:数据类型与变量.Tex.docx

    BeetlSQL 2.10中文文档

    BeetSql的SQL模板采用了Beetl引擎,提供了丰富的模板语法,如变量、算术表达式、控制语句等。 #### 十三、Beetl入门 BeetSql采用了Beetl模板引擎,以下是一些基本的Beetl概念: - **定界符号**: 定义模板的特殊...

    也谈oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性是其优化性能的关键技术之一,主要应用于提高数据库应用程序的可伸缩性和效率。绑定变量允许开发者创建动态SQL语句,其中的变量在执行时才提供具体的值,而不是硬编码到查询中。这种做法...

    TSQL语言局部变量(共11张PPT).ppt

    T-SQL语言局部变量 T-SQL语言局部变量是指在T-SQL语言中,由用户定义的变量。这些变量只能在声明它们的批处理范围内使用,即局部变量的作用域仅限于一个批处理范围内。局部变量必须以符号“@”开头。 局部变量声明...

    e语言-易语言变量和数组的编译原理

    对于变量和数组,会生成相应的存取指令,如加载、存储、数组索引等操作。 在易语言中,由于使用了中文作为编程语言,这些过程都更加符合中国程序员的思维习惯,降低了学习和使用的难度。同时,易语言的编译器还支持...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    Java编程语言中有三种主要的变量类型:成员变量(也称为实例变量)、类变量(也称为静态变量)和局部变量。理解这些变量之间的区别是学习Java基础的重要部分,这对于编写高效、可维护的代码至关重要。 1. 成员变量...

    基于Java的源码-Beetl java模板引擎.zip

    1. **简洁的语法**:Beetl的语法设计接近自然语言,使得模板代码易于理解和编写,如`#{}`用于变量替换,`%{}`用于控制结构。 2. **强大的内置函数**:Beetl提供了一套丰富的内置函数,如字符串处理、日期时间操作、...

    beetl1.26.04-guide.pdf

    Beetl是一款模板语言工具,其特点包括易用性、功能丰富性、性能卓越、提供一些其他模板语言不具备的功能以及可以与多种Web框架进行结合。Beetl目前的版本是1.26,大小为450K。它的语法是JavaScript的一个子集,类似...

    Java语言中变量和方法的分析及其应用.pdf

    变量和方法是Java语言中非常重要的概念,它们的使用可以直接影响程序的性能和可读性。只有正确地使用变量和方法,才能开发出高效、简洁的程序。 本文通过详细分类说明了变量和方法的概念,并分析了变量和方法在Java...

    汽车电子,CCP标定,A2L文件变量地址提取

    在汽车电子领域,标定(Calibration)是调整和优化车载电子系统参数的过程,以确保其性能达到设计标准。CCP(CAN Calibration Protocol)是一种常用的数据传输协议,它允许工程师通过CAN(Controller Area Network)...

    基于Java的模板语言 Beetl.zip

    - **简洁语法**:Beetl的语法设计接近于自然语言,使得代码可读性极强,减少学习成本。 - **强大的表达能力**:支持丰富的表达式计算,包括逻辑运算、三元运算、方法调用等。 - **类型安全**:Beetl在编译时进行...

Global site tag (gtag.js) - Google Analytics