脚本在流程中的性能影响

我们经常看到人们出于各种目的而使用脚本(例如,在服务任务,执行侦听器等中)。 使用脚本和Java逻辑通常很有意义:

  • 它不需要打包到jar中并放在classpath上
  • 它使流程定义更易于理解:无需查看其他文件
  • 逻辑是流程定义的一部分,这意味着无需费劲就能确保使用了正确的逻辑版本

但是,重要的是还要牢记在流程定义中使用脚本的性能方面,并在这些需求与上述好处之间取得平衡。

我们通常会看到与Activiti一起使用的两种脚本语言是Javascript和Groovy。 Javascript与JDK(用于JDK 6和7的Rhino )和用于JDK 8的Nashorn捆绑在一起。 对于Groovy,需要将Groovy脚本引擎添加到类路径。

但让我告诉你,我没有使用JavaScript作为脚本语言的选择风扇,因为有JDK版本之间移动时(在以前的文章中我读更多微妙的变化在这里和这里 ,以及这些都是人的那些记录...)。 因此,这意味着您可以在一天之内编写自己的逻辑,并且一切都可以愉快地工作,而在JDK升级后的第二天,这一切都会失败。 我宁愿花时间在实际编码上。

为了验证性能,我做了一个非常小的基准测试:

截图-2015-09-08-23.06.34-300x121

以及脚本在哪里做了类似的愚蠢的事情(关键是在那里有一个getVariable()和setVariable()以及一些诸如获取当前日期的额外内容):

var input = execution.getVariable(‘input’);
var today = new Date().getDay();
execution.setVariable(‘result’, input * today);

Java服务任务中的相同代码:

public class MyDelegate implements JavaDelegate {@Overridepublic void execute(DelegateExecution execution) throws Exception {Integer input = (Integer) execution.getVariable("input");int today = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);execution.setVariable("result", input * today);}
}

和Groovy对应的:

def input = execution.getVariable('input');
int today = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
execution.setVariable('result', input * today);

我启动了该流程实例10.000次,并记下了总执行时间,我认为这些数字说明了一切:

  • JavaDelegate :6255毫秒
  • Groovy :7248毫秒
  • Javascript :27314毫秒

使用的JDK版本是最新版本(1.8.0_60)。 第一次运行测试时,我是在1.8.0_20上运行的,而Javascript结果则提高了25%(我发现JDK 1.8.0_40的性能得到了提高)。 对于Groovy,我使用的是2.4.4版本(您应该使用该版本,因为较旧的版本存在安全问题 !)

只是为了给出选项之间的区别的直观印象:

图表2-1024x679

与使用Javascript相比,使用Groovy作为脚本语言似乎是更好的性能选择。 一定要考虑到这是一个非常简单的用例的微基准。 但是,鉴于过去使用JDK升级会破坏Javascript脚本的麻烦以及这种结果,默认情况下很难选择Javascript。

15年9月11日更新:不少人问我为什么差异如此之大。 我的假设是,这是因为JDK中的javascript引擎不是线程安全的,因此无法重用或缓存,因此每次启动ScriptingEngine的成本很高。 如果您看一下http://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngineFactory.html ,您会看到有一个特殊的参数THREADING,我们在Activiti中使用它: https ://github.com/Activiti/Activiti/blob/master/modules/activiti-engine/src/main/java/org/activiti/engine/impl/scripting/ScriptingEngines.java#L111确定脚本引擎是否可以已缓存。 Nashorn(和Rhino)在此处返回null,这意味着它不能用于在多个线程上执行脚本,即每个线程需要它自己的实例。 我只能假定JDK中的ScriptEngineManager做类似的事情。

翻译自: https://www.javacodegeeks.com/2015/09/the-performance-impact-of-scripting-in-processes.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerDesigner使用教程

原文:http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一。Rose是专攻UML对象模型的建模工具,之后才向数据库建模…

红帽峰会2015所需的JBoss BPM内容指南

明年再见? 今年在Red Hat Summit上,我们在JBoss BRMS和JBoss BPM Suite演讲中获得了很多乐趣。 在DevNation周围也有一些社区会议,重点介绍了使我们的产品成为可能的项目。 您可以在他们的博客上找到此演讲的概述,并在其中提供…

设计模式 之 享元

享元模式(Flyweight) 运用共享技术有效地支持大量细粒度的对象。 还记得那年夏天一起在作文本上玩过的五子棋吗?五子棋是一种两人对弈的纯策略型棋类游戏,它起源于中国古代的传统黑白棋种之中的一个,不…

php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能

本文主要简单讲述了如何使用php实现简单的用户登陆以及登陆验证效果。1、首先实现通过Session实现用户的登录那么什么是session呢?session被译为会话,它主要是为了在一定访问期间在不同页面之间间传输数据,用来解决http协议无状态。session在…

Quick cocos2dx-Lua(V3.3R1)学习笔记(十)-----搭建安卓打包环境,用官方示例anysdk生成apk运行...

话说我这一篇就写搭建打包安卓环境,是不是有点过早了(其实我主要是怕以后重装系统,忘了怎么搭建了),但是迟早要面对的痛苦,一直延后也不是办法,对吧。 在官方文档中,对于打包安卓apk…

php实现返回顶部,返回顶部js

返回顶部jsfunction goTopEx(){var objdocument.getElementById(“goTopBtn”);function getScrollTop(){return (document.documentElement.scrollTopdocument.body.scrollTop);}function setScrollTop(value){if(document.documentElement && document.documentEleme…

中国大学MOOC-数据结构基础习题集、06-2、旅游规划

题目链接:http://www.patest.cn/contests/mooc-ds/06-2 题目分析:陈姥姥说,这是Dijstra算法的一道题。题目是中文的,这里就不再啰嗦了。有一点提示一下,咱们平时用的Dijistra算法,是用来求最短路径的。这道…

iOS安全攻防(三):使用Reveal分析他人app

使用Reveal分析他人app准备工作1)已越狱的设备,而且已安装了OpenSSH,MobileSubstrate等有用工具(Cydia源里安装)2)本地已安装了Reveal操作步骤1)拷贝framework和dylib到越狱机scp -r /Applications/Reveal.app/Contents/SharedSup…

JBoss BPM Travel Agency演示与现代BPM数据集成

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使用…

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下隐式类: 相当于&…

连载《一个程序猿的生命周期》-2.城市校园生活

一个程序猿的生命周期 微信平台 口 号:职业交流,职业规划;面对现实,用心去交流、感悟。 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103 微 博:http://www.weibo.com/u/57234…

excel使用MySQL数据,如何使用mysql完成excel中的数据生成

Excel是数据分析中最常用的工具,本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成,数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透视等操作。本…

Spring Batch –使用JavaConfig替换XML作业配置

我最近协助一个客户启动并运行了Spring Batch实现。 该团队决定继续为批处理作业使用基于JavaConfig的配置,而不是传统的基于XML的配置。 随着这越来越成为配置Java应用程序的一种常用方法,我觉得是时候更新Keyhole的Spring Batch系列了 ,向您…

JBoss BPM Travel Agency的微服务迁移故事

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使…

eslint php,ESlint操作步骤详解

这次给大家带来ESlint操作步骤详解,ESlint操作的注意事项有哪些,下面就是实战案例,一起来看一下。vue-cli脚手架创建的项目默认使用ESlint规则,启动项目的时候因为各种语法报错,不得不先停下了解一下什么是ESlint&…

动画原理——绘制正弦函数环绕运动椭圆运动

书籍名称&#xff1a;HTML5-Animation-with-JavaScript 书籍源码&#xff1a;https://github.com/lamberta/html5-animation 1.正弦函数。x位置递增&#xff0c;y位置用sin生成。 这段代码是不需要ball.js的。 代码如下&#xff1a; <!doctype html> <html><hea…

oracle优质图书,经典Oracle图书推荐(之四)_oracle

经典的oracle图书:Oracle High Performance Tuning for 9i and 10g by Gavin PowellBook DescriptionThere are three parts to tuning an Oracle database: data modeling, SQL code tuning and physical database configuration.A data model contains tables and relationsh…

JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

如果您一直在Twitter上关注一些Java的关键人物&#xff0c;或者在Reddit上阅读了“新闻”&#xff0c;那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”&#xff08;请原谅我的法语&#xff09;。 首先&#xff0c;于尔根霍勒&#xff08;JrgenHller&#xff…

编程技术交流

需要技术交流包含java:HTML&#xff0c; MySQL&#xff0c; Redis&#xff0c; Linux &#xff0c;Nginx &#xff0c;Tomcat &#xff0c; IntelliJ IDEA &#xff0c;SVN &#xff0c; Eclipse &#xff0c;Maven &#xff0c; RationalRose&#xff0c; Java SE&#xff0c;…

visa linux 串口 通信,使用visa进行串口通信

最近因为项目的原因&#xff0c;都在研究上位机通信问题。这两个星期研究还是蛮多心得&#xff0c;下面就写写关于使用visa进行串口通信的内容LABVIEW软件LabVIEW 在仪器控制方面&#xff0c;还是很有优势的&#xff0c;把你仪器给你&#xff0c;读懂指令&#xff0c;然后估计半…