对于一个程序语言来说,访问变量是一个基本的操作,也是最频繁使用的操作。提高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倍
- 浏览: 166911 次
- 性别:
- 来自: 北京
最新评论
-
javamonkey:
https://my.oschina.net/xiandafu ...
beetl功能与Freemarker功能比较 -
laj76333:
支持标签嵌套吗?<%{}%><%{}%> ...
beetl功能与Freemarker功能比较 -
javamonkey:
支持,去ibeetl.com 上了解吧
beetl功能与Freemarker功能比较 -
laj76333:
支持标签吗?<%{}%><%{}%>& ...
beetl功能与Freemarker功能比较 -
酷沃哦:
beetl支持集群吗?
beetl功能与Freemarker功能比较
相关推荐
ORA-01036:非法的变量名/编号 oracle特有的错误
从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量.docx从零开始学Python:Python语言中的变量...
对于全局变量和局部变量,即使变量名相同,但是因为定义在不同的作用域内,其本质上也是不同的变量。 实例:局部变量和全局变量的对比,并输出结果。 具体实现: total = 0 # 这是一个全局变量 def sum( arg1, arg2 ...
高级语言程序设计基础(C&C++):函数与变量.ppt
时间序列分析:单变量和多变量方法 第2版
“self”关键字指代类的一个对象, “self”参数可以调用类中的变量和方法。 实例:“self”关键字的使用方法进行程序编写,并输出结果。 具体实现: class Students: def __init__(self,id_number): self.id=id_...
在Python中,不需要事先声明变量名及其类型,直接赋值即可创建各种类型的对象变量。 >>> x = 3 解析:创建了整型变量x,并赋值为3。 >>> x="Hello World." 解析:创建了字符串变量x,并赋值为“Hello World.” 。 在...
Unity3D教程:成员变量和全局变量在函数外面定义的变量叫做成员变量,它们能够通过Unity的检查器进行访问,存储在成员变量中的值将自动地保存在项目中。}使用
Ruby语言教程:Ruby 变量示例
(2)编辑->变量名:Path在变量值的最前面加上:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin (3)新建->变量名:CLASSPATH变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (4)编辑->变量名:...
其中,语句①的循环变量的步长为2, 语句②的循环变量的步长为-2。 (3)增加运算:++ 和 --。 选做内容: (1)增加类型:① 字符类型; ② 实数类型。 (2)扩充函数:① 有返回值和返回语句;② 有参数函数...
介绍了单变量和多变量的时间序列分析的建模、定阶方法。多变量时间序列也称向量时间序列。
格式2:release all [extended] 格式3:clear memory 说明: (1).格式1清除变量名表指定的内存变量并释放它们所战胜的内存空间. (2).格式2清除全部内存变量,但在程序中不清除全程变量,如有extended选项,...
这是近期在博客中记录的文章:【2023,学点儿新Java-30】变量的基本使用:变量的意义 | 变量的构成要素 | Java中变量的数据类型、变量的使用 | 附:Java中变量的作用域 | 数据类型、变量名和变量值哪个最重要?...
变量的存储方式可分为“静态存储”和“动态存储”两种
2、变量 白话:变量就是一个装东西的盒子。 通俗:变量是用于存放数据的容器,我们通过变量名来获取数据,甚至数据可以修改。 2.2.2 变量的定义方式 2、变量的定义方式 语法:var 变量名 = 值 var是一个js关键字,...
2.离散型随机变量及其分布。 教学目的及目标: 1.理解随机变量、分布函数、分布律的概念; 2.能对实际问题建立适当的随机变量,会求其分布函数; 3.能熟练求离散型随机变量的分布律,熟练掌握三种重要的 离散型分布;...
env:用于解析环境变量的 Go 语言库。一般情况下项目启动时需要的配置参数,都是通过环境变量传递的。该项目就是 Go 语言用来解析环境变量的库,它简单、体积小、零依赖。 package main import ( "fmt" "time" ...
2. 变量赋值:在声明变量后,可以将一个值赋给变量。例如,将值5赋给之前声明的整数变量可以这样写: ```java number = 5; ``` 也可以在声明变量的同时进行赋值: ```java int number = 5; ``` 3. 变量类型:...