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

性能测试中脚本怎么写

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

相关文章

超炫酷的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…

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

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

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

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

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

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

一文搞懂 | 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;感慨万…

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

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

程序如何运行,编译、链接、装入?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删一、地址概念和程序如何运行在多道程序环境下&#xff0c;要使程序运行&#xff0c;必须先为之创建进程。而创建进程的第一件事&#xff0c;便是…

NSA:建议从 C/C++ 切换到内存安全语言

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删美国国家安全局&#xff08;NSA&#xff09;发布了一份指南&#xff0c;旨在帮助软件开发商和运营商预防和缓解软件内存安全问题。其鼓励组织将编…

探索cqrs和事件源_编写基于事件的CQRS读取模型

探索cqrs和事件源关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是&#xff0c;尽管也有一些有趣的考虑&#xff0c;但读取模型经常被忽略。 在本文中&#xff0c;我们将介绍通过使用事件流来填充视图模型的示例实现。 总览 …

C# 11正式发布

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C# 11 现已发布。公告称&#xff0c;“随着每个版本的发布&#xff0c;社区的参与度越来越高&#xff0c;贡献了从建议、见解和错误报告到整个功…

分享一个通用的嵌入式驱动层

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C 语言面向对象编程的最佳实践一、前言以STM32为例&#xff0c;打开网络上下载的例程或者是购买开发板自带的例程&#xff0c;都会发现应用层中会…

cks32和stm32_cks子,间谍,局部Mo子和短管

cks32和stm32本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”&#xff0c;“间谍”和“部分模拟”的信息&#xff0c;以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证…

CSON+CJSON,解析json数据更优雅?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言json是目前最为流行的文本数据传输格式&#xff0c;特别是在网络通信上广泛应用&#xff0c;随着物联网的兴起&#xff0c;在嵌入式设备上&a…

让C语言源码可知自身函数的实际地址与大小

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删事情的起因大概是这样……在很久很久以前&#xff0c;我最早用的是MASM&#xff08;Win32ASM&#xff09;写程序&#xff0c;从平台兼容性、开发…

java设计模式迭代器模式_迭代器设计模式示例

java设计模式迭代器模式本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查…