java8 nashorn_使用Java8的Nashorn弥补Node.js密集计算的缺陷
NodeJS带来的原生异步并发与事件驱动编程模型得到认可,但是因为其单线程缘故,不能简单方便地从事密集计算,而java优势是多线程并发,Java 8又引入了Lambda表达式,使得Java多线程并发在处理高CPU负载的计算上既强大又方便,那么我们是否对于Javascript中那些密集计算,比如对集合中的map操作,或聚合操作reduce使用Java实现呢?
答案是可以的,利用Java8的Javascript引擎 Nashorn。比如我们可以将Js如下的lambda在JVM中实现:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
String js;
js ="var map = Array.prototype.map \n";
js +="var names = [\"john\", \"jerry\", \"bob\"]\n";
js +="var a = map.call(names, function(name) { return name.length() })\n";
js +="print(a)";
engine.;
Nashorn是用来替代原来Java中的Javacript解释器Rhino, 执行JS速度大大提升,能够使用V8s环境,下面看看如何编译lambda表达式。
不同于Java 和Scala 编译器,是将文件编译成持久文件,如.class文件等,Nashorn是在内存中编译,然后将字节码直接传递到JVM,Java 8使用invokerDynamic来连接Lambda函数代码。
invokerDynamic是在Java 7中加入允许程序员写动态语言,然后决定在运行时如何连接这些代码。
对于Java和Scala语言,编译器是在编译时间决定哪个方法被调用,运行时是通过标准的ClassLoader来寻找相应的类,即使像方法过载解决也是编译时间实现的。
对于动态语言,如js,静态的解决办法就不适用了,当我们在Java中说obj.foo()时,其实是obj有一个类的方法为foo(),而JS运行时是依赖被obj引用的实际对象,这对于静态语言是一个梦魇,因为编译和运行是分开的,编译时连接到这个对象但是却没有运行。但是invokeDynamic可以做到。
invokeDynamic能够推迟这种联动到运行时间,这样在运行时它能指导JVM调用哪个方法。静态语言和动态语言在这点上是双赢的。JVM得到要连接的实际方法,然后优化执行。
Nashorn也是这样高效地实现连接,下面看个例子可以了解如何工作的,下面是返回JS数组值:
invokedynamic 0 "dyn:getProp|getElem|getMethod:prototype":(Ljava/lang/Object;)Ljava/lang/Object;
Nashorn要求JVM在运行传递给它这个字符串,作为交换,它会返回一个方法的一个处理器,用于接收对象和返回一个,只要JVM得到这个方法的一个处理器,它就能连接。
java8 nashorn_使用Java8的Nashorn弥补Node.js密集计算的缺陷相关推荐
- [转]为什么我要用 Node.js? 案例逐一介绍
原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...
- 如何更好的利用Node.js的性能极限
通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...
- node.js学习总结
NodeJS介绍 1.概述: Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎 进行了封装,它主要用于创建快速的.可扩展的网 ...
- 为什么 Deno 没有众望所归?超越 Node.js 还要做些什么?
作者 | 韩亦乐 责编 | 欧阳姝黎 译者序 正文开始 Deno 是一个旨在改进甚至替代 Node 的 JavaScript / TypeScript 运行时.它拥有众多的功能和广泛的关注 ...
- 为什么我要用 Node.js? 案例逐一介绍
介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScript ,从前端跨越到后端, ...
- Node.js基础总结
一.Node.js简介 什么是Node.js js 属于一种脚本性语言,然而脚本语言运行需要一个解析器来解析,对于我们原来写的 js 代码大部分都是运行在网页上,所以浏览器本身就担当了解析器的角色.而 ...
- php和nodejs和java的区别_讨论PHP和Node.js开发之间有什么区别
在很长一段时刻内,决定在Node.js和PHP之间进行挑选是一件很费事的工作,但关于后端程序员来说,这一直很费事,但它从未影响过开发人员.可是工作很快就发生了改变,现在开发人员有必要挑选其中之一.No ...
- java8特性快速对list集合的筛选过滤和计算
java8特性快速对list集合的筛选过滤和计算 一.准备工作 1.创建一个Student对象 package com.shiro.test.java8特性;import java.io.Serial ...
- 【全文】狼叔:如何正确的学习Node.js
说明 2017-12-14 我发了一篇文章<没用过Node.js,就别瞎逼逼>是因为有人在知乎上黑Node.js.那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇 ...
最新文章
- java实现layui分页,MVC下实现LayUI分页的Demo
- k8s集群dns问题解决办法
- 数据结构与算法-- 二叉树中和为某一值的路径
- java校招面试题_java校招面试编程题及答案.docx
- 自兴人工智能---认识python语言的基础数据类型和操作
- 分享40佳非常有创意的社交网络图标集
- oracle ogg 12c mysql_Oracle GoldenGate 下载
- 腾讯朋友、钉钉等被微信违规公示点名;谷歌更新安卓修复数百万台芯片漏洞;微软终止支持.NET Core 3.0 | 极客头条...
- (7)zabbix资产清单inventory管理
- bin文件python读取
- matlab极坐标图刻度,[转载]如何在Matlab极坐标polar绘图上增加刻度单位
- 众测、专属、渗透测试捡破烂小tips
- Asus Prime B360M-A+i5-8400+RX 570 黑苹果efi引导文件
- mongodb 复制集部署(主从升级版)
- 婚姻对女人很重要,但远远不是我们的全部
- friends101. The One Where Monica Gets a New Roommate (The Pilot)
- 时光不负有心人,自己努力,自己肯定
- Python中 whl包、tar.gz包的区别
- 【逆天应用】如何用Python实现检测和识别车牌号?(详细教程)
- 计算机的典型应用及事例,计算机网络典型应用案例精选
热门文章
- Ubuntu 20.04 下安装 OpenCV 3.4.11 并测试使用
- 微信小程序分享朋友圈关键代码
- 达人评测 r7 5700g对比i7 11700k选哪个
- Python基础知识判断正误
- Monte Calro Tree Search (MCTS)
- 安装webpack一直提示要安装webpack-cli
- 数据泄密事件频发 但密码仍有生命力
- 【JAVA线上实习】【SSM框架学习】利用SSM框架完成增删改查-----查
- java实现上传图片代码_Java图片上传实现代码
- Java | IP工具类(获取访问者的ip地址 查询IP地址)