日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

脚本在流程中的性能影响

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 脚本在流程中的性能影响 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們經(jīng)常看到人們出于各種目的而使用腳本(例如,在服務(wù)任務(wù),執(zhí)行偵聽(tīng)器等中)。 使用腳本和Java邏輯通常很有意義:

  • 它不需要打包到j(luò)ar中并放在classpath上
  • 它使流程定義更易于理解:無(wú)需查看其他文件
  • 邏輯是流程定義的一部分,這意味著無(wú)需費(fèi)勁就能確保使用了正確的邏輯版本

但是,重要的是還要牢記在流程定義中使用腳本的性能方面,并在這些需求與上述好處之間取得平衡。

我們通常會(huì)看到與Activiti一起使用的兩種腳本語(yǔ)言是Javascript和Groovy。 Javascript與JDK(用于JDK 6和7的Rhino )和用于JDK 8的Nashorn捆綁在一起。 對(duì)于Groovy,需要將Groovy腳本引擎添加到類路徑。

但讓我告訴你,我沒(méi)有使用JavaScript作為腳本語(yǔ)言的選擇風(fēng)扇,因?yàn)橛蠮DK版本之間移動(dòng)時(shí)(在以前的文章中我讀更多微妙的變化在這里和這里 ,以及這些都是人的那些記錄...)。 因此,這意味著您可以在一天之內(nèi)編寫(xiě)自己的邏輯,并且一切都可以愉快地工作,而在JDK升級(jí)后的第二天,這一切都會(huì)失敗。 我寧愿花時(shí)間在實(shí)際編碼上。

為了驗(yàn)證性能,我做了一個(gè)非常小的基準(zhǔn)測(cè)試:

以及腳本在哪里做了類似的愚蠢的事情(關(guān)鍵是在那里有一個(gè)getVariable()和setVariable()以及一些諸如獲取當(dāng)前日期的額外內(nèi)容):

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

Java服務(wù)任務(wù)中的相同代碼:

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對(duì)應(yīng)的:

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

我啟動(dòng)了該流程實(shí)例10.000次,并記下了總執(zhí)行時(shí)間,我認(rèn)為這些數(shù)字說(shuō)明了一切:

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

使用的JDK版本是最新版本(1.8.0_60)。 第一次運(yùn)行測(cè)試時(shí),我是在1.8.0_20上運(yùn)行的,而Javascript結(jié)果則提高了25%(我發(fā)現(xiàn)JDK 1.8.0_40的性能得到了提高)。 對(duì)于Groovy,我使用的是2.4.4版本(您應(yīng)該使用該版本,因?yàn)檩^舊的版本存在安全問(wèn)題 !)

只是為了給出選項(xiàng)之間的區(qū)別的直觀印象:

與使用Javascript相比,使用Groovy作為腳本語(yǔ)言似乎是更好的性能選擇。 一定要考慮到這是一個(gè)非常簡(jiǎn)單的用例的微基準(zhǔn)。 但是,鑒于過(guò)去使用JDK升級(jí)會(huì)破壞Javascript腳本的麻煩以及這種結(jié)果,默認(rèn)情況下很難選擇Javascript。

15年9月11日更新:不少人問(wèn)我為什么差異如此之大。 我的假設(shè)是,這是因?yàn)镴DK中的javascript引擎不是線程安全的,因此無(wú)法重用或緩存,因此每次啟動(dòng)ScriptingEngine的成本很高。 如果您看一下http://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngineFactory.html ,您會(huì)看到有一個(gè)特殊的參數(shù)THREADING,我們?cè)贏ctiviti中使用它: https ://github.com/Activiti/Activiti/blob/master/modules/activiti-engine/src/main/java/org/activiti/engine/impl/scripting/ScriptingEngines.java#L111確定腳本引擎是否可以已緩存。 Nashorn(和Rhino)在此處返回null,這意味著它不能用于在多個(gè)線程上執(zhí)行腳本,即每個(gè)線程需要它自己的實(shí)例。 我只能假定JDK中的ScriptEngineManager做類似的事情。

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

總結(jié)

以上是生活随笔為你收集整理的脚本在流程中的性能影响的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。