论坛首页 Java企业应用论坛

FEL(表达式语言)——7月30号更新

浏览 13192 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-18  
ppgunjack 写道
是debug版本的问题,换了release和优化op3,
执行大概6秒,加上->second把数据取出也差不多的时间
这台机器java取数大概花费14秒,这样时间算合理
同样的实现如果是指针实现变量读取,c++在1亿次下的累计要再估计
以前没比较过,没意识到debug和release速度会导致数量级的差别

额。说到debug 和 release 。。这事我知道,,不过没想到这茬。。

0 请登录后投票
   发表时间:2011-03-25  
引用
"40.52334+60*(21.8144+17*32.663)"一亿次只需要不到一秒的时间。

突然想到,因为是动态编译,估计这种固定的表达式当执行很多次以后会jit优化成常数直接返回吧。导致性能会很高的假象
0 请登录后投票
   发表时间:2011-03-25  
应该不是吧,如果是常数,那1秒感觉时间多了,除非是耗在返回数值对象上
0 请登录后投票
   发表时间:2011-03-25  
jit是在执行足够多次数以后 虚拟机认为有必要优化才jit不是吗?那1秒多是因为之前执行的缘故吧。
具体可以试一下第一次执行后直接再执行一亿次看时间
0 请登录后投票
   发表时间:2011-03-26   最后修改:2011-03-26

EL的项目非常多了,我过去做的轮子

http://code.google.com/p/aviator/

思路就是将表达式利用asm编译成类,交给jvm运行,介于脚本语言和简单EL之间的东西,有兴趣可以看看。

 

0 请登录后投票
   发表时间:2011-03-31  
ppgunjack 写道
以前做过,用java解决不了对变量的值高速访问的问题,用c或者c++的指针很容易能提高这块的效率,用java最低限度也需要使用1次hash


有些好奇,即便给你指针,你就可以不hash?

之所以用asm进一步编译成bytecode就是因为把优先这个大坑推给了jvm去做。
其实更疯狂的选择是直接生成asm code,再用natvie method做中转。
0 请登录后投票
   发表时间:2011-04-01  
AlwenS 写道
ppgunjack 写道
以前做过,用java解决不了对变量的值高速访问的问题,用c或者c++的指针很容易能提高这块的效率,用java最低限度也需要使用1次hash


有些好奇,即便给你指针,你就可以不hash?

之所以用asm进一步编译成bytecode就是因为把优先这个大坑推给了jvm去做。
其实更疯狂的选择是直接生成asm code,再用natvie method做中转。

编译器实现变量不用hash吧,直接对代码进行地址替代
这个级别的运算本身已经很低级,逻辑不换我想用asm不会有显著提高
Java真要在榨点性能可以采取前面兄弟的方式用更简化的映射替代Hash,甚至约束变量名内容来规避hash equal的成本,hash在这里有点重量级了

native的原理不太清楚,不过感觉这种循环内频繁调用成本可能比hash还高一些
0 请登录后投票
   发表时间:2011-07-30  
我是楼主,自己顶帖子。
Fast-el发布新版本
新版本做了一些简化,加入编译成java源码功能。效率大大提高,生成java源码的逻辑挺简单,方便修改和扩展。
支持新的表达式,如下所示:
1:"abc".substring(1)及所有的String类方法
2:对象.方法、对象.属性

代码刚刚写好,晚些时候加上文档。
0 请登录后投票
   发表时间:2011-07-30  
lotusyu 写道
ppgunjack 写道


表达式:kpi1/(kpi2*(kpi4+kpi5*kpi3)-kpi6)/kpi7
计算次数:100000000,花费时间:16992.0毫秒 16992
平均计算花费时间:1.6992E-4毫秒
9.832817520114257E-6
表达式:40.52334+60*(21.8144+17*32.663)
计算次数:100000000,花费时间:5477
34665.647339999996

cpu为intel8400,无其他负载
数字表达式如果单测大概2100左右,但放变量表达式后面一起跑就慢了一倍多,找不到原因
数组挂靠应该比数字表达式慢,但应该是一个数量级
以前做查询过滤器一次数据不会过20w,计算kpi每秒不会过w,对server速度足够了
写这个代码的时候cpu应该是amd3000+,测起来应该比较寒碜了,一直想换c++然后去函数化看看最快能到多少


如果你只是简单的算术运算的话,可以使用superobin兄的将表达式编译成字节码的方法,在我的老笔记机上执行表达式
"40.52334+60*(21.8144+17*32.663)"一亿次只需要不到一秒的时间。

放变量表达式后面一起跑就慢了一倍多,找不到原因,可以使用性能分析工具找找原因。


使用新版本fast-el,使用编译的方式执行"40.52334+60*(21.8144+17*32.663)"表达式1亿次,不到1秒钟,本本的配置为I3-2310M,4G内存
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics