性能测试中脚本怎么写_脚本在流程中的性能影响

性能测试中脚本怎么写

我们经常看到人们出于各种目的而使用脚本(例如,在服务任务,执行侦听器等中)。 使用脚本和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/337121.shtml

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

相关文章

vscode 调试参数_如何通过vscode运行调试javascript代码

初次正式要写 javascript 相关的代码,想要用 vscode 直接编译 js 代码,但是发现没有那么简单,需要配置好 launch.json 文件,现已经在vscode上编译过去并且可以调试 javascript 代码,总结了两种方法,分享给大家.方法一: 在 js 后缀文件中写 javascript 代码.1. 环境配置:(1). 需…

超炫酷的C语言技巧

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常…

java8默认垃圾收集器_Java 8中最快的垃圾收集器是什么?

java8默认垃圾收集器OpenJDK 8具有几种垃圾收集器算法,例如Parallel GC , CMS和G1 。 哪一个最快? 如果默认GC从Java 8中的并行GC更改为Java 9中的G1(当前建议),将会发生什么? 让我们对其进行基…

u盘启动 联想一体机_联想Y430pAT-ISE(H)U盘安装Win7系统教程

最近听到有人在问联想Y430pAT-ISE(H)笔记本安装WIN 7系统的方法,联想Y430pAT-ISE(H)笔记本从发行到现在也快5年了,不过有人在问该电脑安装系统就说明有人还在使用,关于联想Y430pAT-ISE(H)安装Win 7系统的方法有很多,不过大多过时了…

收藏|C语言常用的一些转换工具函数!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen) {char h1,h2;char s1,s2;int i;for (i0; i<n…

jit编译_意外分配– JIT编译抖动

jit编译在研究ByteWatcher时 &#xff08;请参阅我的上一篇 文章 &#xff09;&#xff0c;我遇到了一些非常奇怪的事情。 这是实际的代码段&#xff0c;用于找出特定线程上的分配量&#xff1a; return (long) mBeanServer.invoke(name,GET_THREAD_ALLOCATED_BYTES,PARAMS,S…

网页设计图片向上浮动_利用js实现图片在浏览器中飘动(浮动窗口自由移动)效果...

首先&#xff0c;设置一个将要飘动的窗口&#xff0c;html代码如下:利用js控制span标签在浏览器内移动var xPos 0;var yPos 0; var step 1;var delay 10;var height 0;var Hoffset 0;var Woffset 0; var yon 0;var xon 0; var xon 0; var interval;var img document…

apache camel_学习Apache Camel –实时索引推文

apache camel在大多数软件开发项目中&#xff0c;有一点需要使应用程序开始与其他应用程序或第三方组件通信。 无论是发送电子邮件通知&#xff0c;调用外部api&#xff0c;写入文件还是将数据从一个地方迁移到另一个地方&#xff0c;您都可以推出自己的解决方案或利用现有框架…

让你不再害怕指针——C指针详解(经典,非常详细)

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型…

dubbo单元测试调用_使用LocalTestServer对HTTP调用进行单元测试

dubbo单元测试调用有时候&#xff0c;您正在对远程服务器进行HTTP调用的单元测试代码。 您可能正在使用诸如ApachesHttpClient或Spring的RestTemplate之类的库。 当然&#xff0c;您不想依靠远程服务进行单元测试。 除了涉及的开销&#xff08;请记住单元测试应该是快速的&…

C语言实现可写入文件的账号密码登录系统

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删账号登录系统在很多系统设计时都时必不可少的&#xff0c;今天这个登录系统功能较全&#xff0c;可以注册&#xff0c;登录&#xff0c;找回密码…

复函数图像怎么画_...1等等.只需大致图象,和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学-禄凡闷同学...

概述&#xff1a;本道作业题是禄凡闷同学的课后练习&#xff0c;分享的知识点是复函数的图形&#xff0c;指导老师为终老师&#xff0c;涉及到的知识点涵盖&#xff1a;...1等等.只需大致图象&#xff0c;和大致画法(根据原函数就能画出复合函数的...-复函数的图形-数学&#x…

rxjava 循环发送事件_使用RxJava和SseEmitter进行服务器发送的事件

rxjava 循环发送事件Spring Framework 4.2 GA即将发布&#xff0c;让我们看一下它提供的一些新功能。 引起我注意的一个事件是一个简单的新类SseEmitter &#xff0c;它是对Spring MVC控制器中容易使用的发送事件的抽象。 SSE是一项技术&#xff0c;可让您在一个HTTP连接内沿一…

一文搞懂 | Linux 内核的 4 大 IO 调度算法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删Linux 内核包含4个IO调度器&#xff1a;Noop IO schedulerAnticipatory IO schedulerDeadline IO scheduler CFQ IO scheduler。anticipatory, 预…

众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”

众神进入瓦尔哈拉通过所有有关Java 9和Project Jigsaw的讨论&#xff0c;我们不应忽视Java的另一重大变化。 希望在第10版或第11版中&#xff0c; Valhalla项目能够实现并介绍价值类型和专业化。 那么&#xff0c;这是什么一回事&#xff0c;项目进展如何&#xff0c;面临什么…

当电子工程师十余年,感慨万千!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删当电子工程师也一些年头了&#xff0c;不算有出息&#xff0c;环顾四周&#xff0c;也没有看见几个有出息的。回顾工程师生涯&#xff0c;感慨万…

canva画图 图片居中裁剪_css实现不定宽高的图片img居中裁剪_类似微信朋友圈图片效果...

需求如下&#xff1a;前端需要显示矩形的缩略图&#xff0c;接口返回的图片尺寸大小不一&#xff0c;宽高不相等&#xff0c;需要前端来处理并显示成正方形&#xff0c;类似微信朋友圈图片的效果&#xff0c;等比例正方形显示在列表中&#xff0c;让图片根据宽高来自适应显示在…

哈希策略_优化哈希策略的简介

哈希策略总览 用于哈希键的策略可以直接影响哈希集合&#xff08;例如HashMap或HashSet&#xff09;的性能。 内置的哈希函数被设计为通用的&#xff0c;并且可以在各种用例中很好地工作。 我们可以做得更好&#xff0c;特别是如果您对用例有一个很好的了解吗&#xff1f; 测…

面试大全 | C语言高级部分总结,2.6万字长文

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个 Bank&#xff08;就是…

c#设计12星座速配软件_C#设计模式(12)——组合模式

阅读目录1.组合模式在软件开发中我们经常会遇到处理部分与整体的情况&#xff0c;如我们经常见到的树形菜单&#xff0c;一个菜单项的子节点可以指向具体的内容&#xff0c;也可以是子菜单。类似的情况还有文件夹&#xff0c;文件夹的下级可以是文件夹也可以是文件。举一个例子…