最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java新特性之Nashorn_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年06月08日 14:54:07   投稿:mrr  
這篇文章主要介紹了Java新特性之Nashorn的相關(guān)資料,需要的朋友可以參考下

Nashorn是什么

Nashorn,發(fā)音“nass-horn”,是德國二戰(zhàn)時(shí)一個(gè)坦克的命名,同時(shí)也是java8新一代的javascript引擎--替代老舊,緩慢的Rhino,符合 ECMAScript-262 5.1 版語言規(guī)范。你可能想javascript是運(yùn)行在web瀏覽器,提供對(duì)html各種dom操作,但是Nashorn不支持瀏覽器DOM的對(duì)象。這個(gè)需要注意的一個(gè)點(diǎn)。

關(guān)于Nashorn的入門

主要是兩個(gè)方面,jjs工具以及javax.script包下面的API:

jjs是在java_home/bin下面自帶的,作為例子,讓我們創(chuàng)建一個(gè)func.js, 內(nèi)容如下:

function f() {
return 1;
};
print( f() + 1 );

運(yùn)行這個(gè)文件,把這個(gè)文件作為參數(shù)傳給jjs

jjs func.js

輸出結(jié)果:2

另一個(gè)方面是javax.script,也是以前Rhino余留下來的API

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName( "JavaScript" );
System.out.println( engine.getClass().getName() );
System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );

輸出如下:

jdk.nashorn.api.scripting.NashornScriptEngine
Result: 2
Nashorn VS Rhino

javascript運(yùn)行在jvm已經(jīng)不是新鮮事了,Rhino早在jdk6的時(shí)候已經(jīng)存在,但現(xiàn)在為何要替代Rhino,官方的解釋是Rhino相比其他javascript引擎(比如google的V8)實(shí)在太慢了,要改造Rhino還不如重寫。既然性能是Nashorn的一個(gè)亮點(diǎn),下面就測(cè)試下性能對(duì)比,為了對(duì)比兩者之間的性能,需要用到Esprima,一個(gè)ECMAScript解析框架,用它來解析未壓縮版的jquery(大約268kb),測(cè)試核心代碼如下:

static void rhino(String parser, String code) {
    String source = "speedtest";
    int line = 1;
    Context context = Context.enter();
    context.setOptimizationLevel(9);
    try {
      Scriptable scope = context.initStandardObjects();
      context.evaluateString(scope, parser, source, line, null);
      ScriptableObject.putProperty(scope, "$code", Context.javaToJS(code, scope));
      Object tree = new Object();
      Object tokens = new Object();
      for (int i = 0; i < RUNS; ++i) {
        long start = System.nanoTime();
        tree = context.evaluateString(scope, "esprima.parse($code)", source, line, null);
        tokens = context.evaluateString(scope, "esprima.tokenize($code)", source, line, null);
        long stop = System.nanoTime();
        System.out.println("Run #" + (i + 1) + ": " + Math.round((stop - start) / 1e6) + " ms");
      }
    } finally {
      Context.exit();
      System.gc();
    }
  }
  static void nashorn(String parser, String code) throws ScriptException,NoSuchMethodException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("nashorn");
    engine.eval(parser);
    Invocable inv = (Invocable) engine;
    Object esprima = engine.get("esprima");
    Object tree = new Object();
    Object tokens = new Object();
    for (int i = 0; i < RUNS; ++i) {
      long start = System.nanoTime();
      tree = inv.invokeMethod(esprima, "parse", code);
      tokens = inv.invokeMethod(esprima, "tokenize", code);
      long stop = System.nanoTime();
      System.out.println("Run #" + (i + 1) + ": " + Math.round((stop - start) / 1e6) + " ms");
    }
    // System.out.println("Data is " + tokens.toString() + " and " + tree.toString());
  }

從代碼可以看出,測(cè)試程序?qū)?zhí)行Esprima的parse和tokenize來運(yùn)行測(cè)試文件的內(nèi)容,Rhino和Nashorn分別執(zhí)行30次,在開始時(shí)候,Rhino需要1726 ms并且慢慢加速,最終穩(wěn)定在950ms左右,Nashorn卻有另一個(gè)特色,第一次運(yùn)行耗時(shí)3682ms,但熱身后很快加速,最終每次運(yùn)行穩(wěn)定在175ms,如下圖所示

nashorn首先編譯javascript代碼為java字節(jié)碼,然后運(yùn)行在jvm上,底層也是使用invokedynamic命令來執(zhí)行,所以運(yùn)行速度很給力。

為何要用java實(shí)現(xiàn)javascript

這也是大部分同學(xué)關(guān)注的點(diǎn),我認(rèn)同的觀點(diǎn)是:

1.成熟的GC

2.成熟的JIT編譯器

3.多線程支持

4.豐富的標(biāo)準(zhǔn)庫和第三方庫

總得來說,充分利用了java平臺(tái)的已有資源。

總結(jié)

新犀??梢哉f是犀牛式戰(zhàn)車,比Rhino速度快了許多,作為高性能的javascript運(yùn)行環(huán)境,Nashorn有很多可能。

舉例, Avatar.js 是依賴于Nashorn用以支持在JVM上實(shí)現(xiàn)Node.js編程模型,另外還增加了其他新的功能,如使用一個(gè)內(nèi)建的負(fù)載平衡器實(shí)現(xiàn)多事件循環(huán),以及使用多線程實(shí)現(xiàn)輕量消息傳遞機(jī)制;Avatar還提供了一個(gè)Model-Store, 基于JPA的純粹的JavaScript ORM框架。

在企業(yè)中另外一種借力 Nashorn方式是腳本,相比通常我們使用Linux等shell腳本,現(xiàn)在我們也可以使用Javascript腳本和Java交互了,甚至使用Nashorn通過REST接口來監(jiān)視服務(wù)器運(yùn)行狀況。

相關(guān)文章

  • Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作

    Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作

    這篇文章主要介紹了Spring項(xiàng)目中使用Junit單元測(cè)試并配置數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié))

    使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié))

    這篇文章主要介紹了使用Spring Framework 時(shí)常犯的十大錯(cuò)誤(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • JVM,JRE和JDK的區(qū)別小結(jié)

    JVM,JRE和JDK的區(qū)別小結(jié)

    在Java環(huán)境配置和項(xiàng)目啟動(dòng)中,JVM,JRE和JDK這三者的配置是項(xiàng)目啟動(dòng)的基礎(chǔ)保證,本文就詳細(xì)的介紹一下這三者的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • 全面解析Java中的GC與幽靈引用

    全面解析Java中的GC與幽靈引用

    一般的應(yīng)用程序不會(huì)涉及到 Reference 編程, 但是了解這些知識(shí)會(huì)對(duì)理解 GC 的工作原理以及性能調(diào)優(yōu)有一定幫助,在實(shí)現(xiàn)一些基礎(chǔ)性設(shè)施比如緩存時(shí)也可能會(huì)用到,希望本文能有所幫助
    2013-09-09
  • java maven中如何引入自己的lib

    java maven中如何引入自己的lib

    在JavaMaven項(xiàng)目中引入自己的庫可以簡化為幾個(gè)步驟:首先,確保庫以JAR格式存在或打包成JAR;其次,將JAR文件放置在項(xiàng)目目錄或安裝到本地Maven倉庫;最后,在pom.xml中添加依賴,這樣做可以使項(xiàng)目更加模塊化,便于管理和維護(hù),感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 關(guān)于springboot集成swagger3時(shí)spring-plugin-core報(bào)錯(cuò)的問題

    關(guān)于springboot集成swagger3時(shí)spring-plugin-core報(bào)錯(cuò)的問題

    這篇文章主要介紹了關(guān)于springboot集成swagger3時(shí)spring-plugin-core報(bào)錯(cuò)的問題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • java+mysql模擬實(shí)現(xiàn)銀行系統(tǒng)

    java+mysql模擬實(shí)現(xiàn)銀行系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java+mysql模擬實(shí)現(xiàn)銀行系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java設(shè)計(jì)模式之抽象工廠模式淺析講解

    Java設(shè)計(jì)模式之抽象工廠模式淺析講解

    當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡單的對(duì)象,而是多個(gè)位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時(shí)需要使用抽象工廠模式,抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)
    2022-08-08
  • java如何寫接口給別人調(diào)用的示例代碼

    java如何寫接口給別人調(diào)用的示例代碼

    這篇文章主要介紹了java如何寫接口給別人調(diào)用的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Gradle 6.6.1 安裝配置的詳細(xì)教程

    Gradle 6.6.1 安裝配置的詳細(xì)教程

    Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化構(gòu)建開源工具。這篇文章主要介紹了Gradle 6.6.1 安裝配置的詳細(xì)教程,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

赤城县| 环江| 彭山县| 砚山县| 年辖:市辖区| 博罗县| 思茅市| 鸡东县| 潞西市| 营口市| 舞阳县| 棋牌| 成武县| 江油市| 宽甸| 雷州市| 什邡市| 左贡县| 隆德县| 信丰县| 康乐县| 常山县| 开阳县| 荔浦县| 泾源县| 措美县| 蒙山县| 禹城市| 甘洛县| 谷城县| 石阡县| 淅川县| 鹤岗市| 义乌市| 余干县| 西林县| 南川市| 宝丰县| 田东县| 大城县| 扶余县|