`
javamonkey
  • 浏览: 168788 次
  • 性别: 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

    Java模板语言Beetl是一种强大的、高性能的Java模板引擎,专为简化Web开发中的视图层处理而设计。它的设计理念是让开发者能够更自然地写出符合语义的模板代码,提高开发效率,同时保持良好的可读性和可维护性。Beetl...

    MATLAB神经网络:神经网络变量筛选—基于BP的神经网络变量筛选.zip

    本资料包聚焦于“神经网络变量筛选—基于BP的神经网络变量筛选”,这是一个关键步骤,尤其是在处理高维数据时,因为变量的选择直接影响到模型的性能和解释性。BP(Back Propagation)神经网络是最常见的前馈神经网络...

    基于java的模板语言 Beetl.zip

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

    高级语言程序设计基础(C&C++):函数与变量.ppt

    高级语言程序设计基础(C&C++):函数与变量.ppt

    一些关于变量 c 的 C 语言代码示例,展示了变量的声明、定义和使用

    示例 2: 声明了一个 char 类型的变量 c,并输出其字符值。 示例 3: 变量 c 被初始化为 25,之后更新为 50,并显示其变化。 示例 4: 展示了全局变量和局部变量的作用域。局部变量 c 在 main 函数内定义,它遮蔽了全局...

    变量的存储方式

    在编程领域,尤其是在C语言...正确地选择变量的存储类型,可以优化性能、避免内存泄漏,同时也有助于保持代码的清晰和可维护性。在实际编程中,应根据变量的作用范围、生命周期和访问效率需求来决定使用哪种存储方式。

    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支持自定义标签,可以创建自己的模板...

    beetl模板语音教学

    ### Beetl模板语言知识点详解 #### 一、Beetl简介 **Beetl** (Bee Template Language) 是一种轻量级的模板语言,专为忙碌的开发者设计。其核心理念在于简化模板语言的学习曲线,同时保持强大的功能性和优秀的性能。...

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

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

    Beetl2.8中文文档

    9. 类型推测:Beetl在运行时能够推测模板变量类型,以优化性能。用户还可以使用注解明确指定模板变量的属性,有助于IDE提供自动提示功能。 10. 可插拔设计:Beetl提供了错误信息提示、模板引擎缓存机制、模板资源...

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

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

    Beetl java模板引擎 v3.3.1.zip

    2. **丰富的内置函数**:Beetl提供了一套完整的内置函数库,如字符串操作、日期时间处理、数学计算等,使得模板代码可以执行复杂的逻辑。 3. **良好的性能**:Beetl优化了模板编译和执行过程,使得其在处理大量模板...

    Beetl 模版引擎

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

    PL0(包括对其的扩充)

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

    Go语言基础、进阶、提高课程五节Go语言 变量1

    在Go语言中,变量是存储数据的基本单元,它在程序执行期间可以改变其值。Go语言的变量声明具有多种方式,这些方式灵活且方便。在本篇内容中,我们将深入探讨Go语言变量的声明和使用。 1. **基本变量声明**: - ...

    SpringBoot集成Beetl后统一处理页面异常的方法

    在SpringBoot应用中,我们经常使用模板引擎来渲染动态页面,而Beetl是一个功能强大的模板引擎,能够方便地与SpringBoot集成。然而,当页面在运行时出现异常时,Beetl默认的行为可能会导致不完整的页面被发送到客户端...

    BeetlSQL 2.10中文文档

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics