问题标签 [invokedynamic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 将 MethodHandle 转换为方法引用(此处为 Function)
是否有可能获得最后的分配工作?倒置的方式不起作用:是否可以将方法引用转换为 MethodHandle?
这是另一个可复制粘贴的示例:
java - Lambda 匹配 FunctionalInterface 的签名,但“不匹配”。你如何解释这个论点完全通过了?
我目前正在做这个项目。它的效果出奇的好。
然而,在再次阅读自述文件后,我开始想知道如何记录困扰我的东西......
引用这个例子,暂时忘记可以抛出异常,它是这样写的:
好的。现在,Path
涉及的方法就是这个。当然,我们不通过任何LinkOption
.
再说一遍:让我们暂时忘记它会引发任何异常。
Stream.map()
以 aFunction
作为参数。这个接口,对于Function<T, R>
,被定义为:
但是我使用的方法不接受任何参数。乍一看,它似乎与 a 不匹配Function
,对吧?除了那个...
它可以写成:
因此,如果方法引用没有参数或类似的东西,看起来所使用的机制在某种程度上能够调用“流对象”上的方法......
我想相应地记录这一点,我在这里遗漏了一些东西。
我错过了什么?
java - MethodHandle InvokeExact 参数
我对方法句柄的方法参数感到困惑。我先构建一个guardwithtest方法句柄如下图:
对我来说,问题是如何将参数传递给三个方法句柄:test、trueTarget 和 faliover。1、invokeExact的第一个参数“result”作为receiver传递给test guard,第二个参数“data”传递给startWith:
但是这三个参数被传递给 falseTarget 为:
那么,参数传递的规则是什么,它们如何与方法句柄引用的方法匹配?
java - MethodHandle 的 MethodType 转换以接受 Array Object 参数
我想适应String.startsWith
from (String, String)boolean
to (String[])boolean
,以便它可以接受String[]
参数,其中前两个参数将映射到(String, String)
. 因此,我写了下面的示例代码:
MethodHandle
toString.startsWith
适应boolean (String[])
于最初的适应。但结果表明adapt.invokeExact
失败。
堆栈跟踪中的新(String[])
对象非常令人困惑。任何人都可以就如何解决它提供一些建议吗?
谢谢
这个问题可以抽象为:如何适应一个Methodhandle
只接受的(String, String)boolean
,以便它可以接受(String[])boolean
参数?
jvm - 如何存储invokedynamic的结果?
Java 8 引入了对一等函数的支持,它允许将函数分配给变量。在这种情况下,变量必须是函数类型,由函数接口(只有一个抽象方法的接口)定义。
因此,考虑具有以下定义的接口I
和类的示例:A
我们可以为类型的变量分配I
的实例A
或方法的方法引用bar
。A
两者都可以存储在 type 的变量中I
,例如:
如果我们分析之前代码编译产生的字节码,我们将得到:
因为i1 = new A();
很明显,相应的指令7: astore_1
正在存储一个A
与I
. 但是,由于i2 = A::bar
我们正在存储8: invokedynamic #4, 0
.
那么,这意味着 an 的结果invokedynamic
始终是目标类型的实例,即我们使用方法引用分配的变量的类型?
groovy - 使用--indy,冒泡排序的执行速度要慢 5 倍
我写了一个冒泡排序的实现来玩一下 Groovy,看看是否--indy
对性能有任何明显的影响。
本质上,它将一千个随机整数的列表排序一千次,并测量排序列表的平均执行时间。
列表中有一半是Integer[]
,另一半是ArrayList<Integer>
。
结果真的让我很困惑:
查看运行基准测试时的 CPU 使用率,使用编译时的 CPU 使用率要高--indy
得多。
这引起了我的兴趣,所以我再次运行了基准测试——但这次启用了 Yourkit 代理和 CPU 跟踪。以下是记录的调用树:
这是性能图表 - 请注意,时间尺度是不同的,因为--indy
代码要慢得多。
可以看出,在不--indy
使用--indy
. 更令人困惑的是,Yourkit 只报告一个活动线程(我的代码只使用主线程),但它仍然设法保持两个半核心被占用。
编译的代码--indy
在开始时也使用了大量的内核时间,尽管这会在一段时间后下降并稳定在 0% - 此时代码似乎加快了一点(堆使用增长率增加)并且 CPU 使用增加.
谁能向我解释这种行为?
版本:
BubbleSort.groovy:
我对冒泡排序实现的优化不感兴趣,除非它们与invokedynamic
行为相关——这里的目的不是写出性能最好的冒泡排序,而是要弄清楚为什么--indy
会对性能产生如此大的负面影响。
更新:
我将我的代码转换为 JRuby 并尝试了同样的事情,结果相似,尽管没有 JRuby 并没有那么快invokedynamic
:
更新 2:
如果我删除将列表更改为Integer[]
一半时间的代码,性能会显着提高,但如果没有它仍然会更快--indy
:
如果我对 JRuby 做同样的事情,invokedynamic
会更快:
java - 为什么返回类型(强制转换)在 MethodHandler 性能中起关键作用?
我正在做一个简单的项目,需要检索一个 bean 属性。首先我使用反射。然后我对 invokedynamic 和 Method Handler 进行了一些调查以获得更好的性能。
虽然invokeExact
比反射快得多,但调用比反射慢得多。
测试环境:
- Win7 32位
- Java 7 U 80
- 核心由于 CPU 3.06GHZ
我得到的 tp/ms 是这样的:
这是性能测试输出(我运行了两次):
这是我的测试代码:
invokeExact
无法满足我的用例,因为我在编译时不知道确切的返回类型。似乎返回类型(强制转换)是MethodHandle
性能的关键。
这似乎不是预期的结果,因为它MethodType
具有确切的返回类型。为什么进行强制施法以提高性能仍然很重要?
是否有一些文档解释了这方面的细节?此外,是否有任何关于比较使用反射与方法处理程序的 impl 细节的文档?
grails - Grails 的 InvokeDynamic
是否可以将 InvokeDynamic 用于 Grails?
如果可以,兼容哪些版本的 Grails、Java 等?
设置它的程序是什么?
如果不可能,什么时候可以将 InvokeDynamic 支持添加到 Grails 2.x 和/或 3.x?
我没有找到任何关于它的最新信息。
java - InvokeDynamic 参数的动态类型
为了支持动态类型和方法分派,我的编程语言引入了一种名为dynamic
. 在调用类型为 的被调用者上的方法时dynamic
,编译器首先将被调用者和所有参数压入堆栈,然后生成一条invokedynamic
指令而不是普通invoke*
指令。该指令指向一个名为 的类中的特殊引导方法DynamicLinker
,但在调用它时只有静态类型可用。
我的问题:如何获取传递给invokedynamic
指令的参数的运行时类型?
java - Java 8 更新 51 (sun-jdk-8u51) 在使用 448 System::gc Runnable arguments 的 null MethodHandle invokeExact 调用后出现运行时致命错误
概括
我能够用一个调用空 MethodHandle 的 invokeExact 方法的 main 方法编译一个接口,该方法有 448 个 Runnable 方法引用 (System::gc) 实例。
当我运行界面时,Java 运行时环境检测到一个致命错误:
- SIGSEGV (0xb) 在 pc=0xb71b9bde,pid=12918,tid=3030936432
- JRE 版本:Java(TM) SE 运行时环境 (8.0_51-b16) (build 1.8.0_51-b16)
- Java VM:Java HotSpot(TM) 客户端 VM(25.51-b03 混合模式 linux-x86 )
- 有问题的框架:
- V [libjvm.so+0x507bde] SignatureIterator::parse_type()+0x1ce
源码和运行结果链接:http: //ideone.com/3oh7Uk
资源
结果