脚本在流程中的性能影响

我们经常看到人们出于各种目的而使用脚本(例如,在服务任务,执行侦听器等中)。 使用脚本和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,一经查实,立即删除!

相关文章

php 弹出变量,php取变量出现Notice: Undefined variable 的解决方法

Notice: Undefined variable: email in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9Notice: Undefined variable: subject in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9Notice: Undefined variable: comment in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9........本来php是不需要定义变量的&am…

PowerDesigner使用教程

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

mac os java_适用于Mac OS X的官方Java 7 –状态

mac os java希望到目前为止,每个人都知道苹果公司去年加入了OpenJDK项目。 那是什么意思? 苹果将​​把用于私有Mac Java构建的代码作为GPL代码贡献给OpenJDK Oracle将接管Java的Mac端口 随着时间的流逝,Mac平台将成为Java世界中完全一流的…

php 鼠标点击图片放大,鼠标移入放大图片预览效果实现

商城项目中,有鼠标移入图片放大的功能,研究一下实现Image zoombody {display: flex;justify-content: center;align-items: center;min-height: 100vh;}#image {width: 300px;height: 300px;background-color: #000;background-image: url(https://place…

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

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

设计模式 之 享元

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

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

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

纪事日记–可自定义的数据存储

总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作,而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是,它做得不好。 自定义数据存储在性能方面可以实现什么? 您可以支持; 大约75纳…

php vprintf,vprintf - [ C语言中文开发手册 ] - 在线原生手册 - php中文网

格式-指向以空字符结尾的字符串的指针,指定如何解释数据。格式字符串由普通的多字节字符(%除外)组成,它们被原样复制到输出流和转换规范中。每个转换规范具有以下格式:介绍%字符(可选)一个或多个标志,用于修…

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

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

ejb运行程序_EJB程序化查找

ejb运行程序在上一篇文章中,我们了解了EJB 引用和EJB 注入 。 尽管EJB注入是一种强大的容器工具,可以简化模块化应用程序的开发,但有时还是希望执行程序化EJB查找。 例如,让我们假设一组不同的EJB实现由公共业务接口定义的公共策略…

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算法,是用来求最短路径的。这道…

我们正在下注:这个注解很快就会出现在JDK中

Yahor最近提出的Stack Overflow问题引起了我的兴趣: 如何在Java 8编译时确保方法签名“实现”功能接口 。 这是一个很好的问题。 让我们假设以下名义类型: FunctionalInterface interface LongHasher {int hash(long x); }该类型强加了清晰的合同。 实现…

java解码p7b证书文件,通过OpenSSL解码X509证书文件

在Windows平台下,如果要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI。但是在非Windows平台下,就只能使用强大的开源跨平台库OpenSSL了。一个X509证书通过OpenSSL解码之后,得到一个X509类型的结构体指针。通过该结构体…

php 网页手册模板,网站表单模板

前端界面默认网站表单模板介绍发布:/template/pc/default/home/form_post.html列表:/template/pc/default/home/form_list.html查看:/template/pc/default/home/form_show.html自定义网站表单模板介绍发布:/template/pc/default/h…

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

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

orm框架选型问题_ORM问题

orm框架选型问题在过去的几年中,像Hibernate这样的对象关系映射工具已经帮助开发人员在处理关系数据库方面获得了巨大的生产力增长。 ORM使开发人员可以专注于应用程序逻辑,并避免为诸如插入或查询之类的简单任务编写大量样板SQL。 但是,充分…

iwifi 命令

1: tftp -gr ctwancfg.html 192.168.1.18转载于:https://www.cnblogs.com/gavinwu/p/4221790.html

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

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