问题标签 [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.

0 投票
3 回答
4075 浏览

java - 将 MethodHandle 转换为方法引用(此处为 Function)

是否有可能获得最后的分配工作?倒置的方式不起作用:是否可以将方法引用转换为 MethodHandle?

这是另一个可复制粘贴的示例:

0 投票
1 回答
197 浏览

java - Lambda 匹配 FunctionalInterface 的签名,但“不匹配”。你如何解释这个论点完全通过了?

我目前正在做这个项目。它的效果出奇的好。

然而,在再次阅读自述文件后,我开始想知道如何记录困扰我的东西......

引用这个例子,暂时忘记可以抛出异常,它是这样写的:

好的。现在,Path涉及的方法就是这个。当然,我们不通过任何LinkOption.

再说一遍:让我们暂时忘记它会引发任何异常。

Stream.map()以 aFunction作为参数。这个接口,对于Function<T, R>,被定义为:

但是我使用的方法不接受任何参数。乍一看,它似乎与 a 不匹配Function,对吧?除了那个...

它可以写成:

因此,如果方法引用没有参数或类似的东西,看起来所使用的机制在某种程度上能够调用“流对象”上的方法......

我想相应地记录这一点,我在这里遗漏了一些东西。

我错过了什么?

0 投票
1 回答
415 浏览

java - MethodHandle InvokeExact 参数

我对方法句柄的方法参数感到困惑。我先构建一个guardwithtest方法句柄如下图:

对我来说,问题是如何将参数传递给三个方法句柄:test、trueTarget 和 faliover。1、invokeExact的第一个参数“result”作为receiver传递给test guard,第二个参数“data”传递给startWith:

但是这三个参数被传递给 falseTarget 为:

那么,参数传递的规则是什么,它们如何与方法句柄引用的方法匹配?

0 投票
2 回答
320 浏览

java - MethodHandle 的 MethodType 转换以接受 Array Object 参数

我想适应String.startsWithfrom (String, String)booleanto (String[])boolean,以便它可以接受String[]参数,其中前两个参数将映射到(String, String). 因此,我写了下面的示例代码:

MethodHandletoString.startsWith适应boolean (String[])于最初的适应。但结果表明adapt.invokeExact失败。

堆栈跟踪中的新(String[])对象非常令人困惑。任何人都可以就如何解决它提供一些建议吗?

谢谢

这个问题可以抽象为:如何适应一个Methodhandle只接受的(String, String)boolean,以便它可以接受(String[])boolean参数?

0 投票
2 回答
155 浏览

jvm - 如何存储invokedynamic的结果?

Java 8 引入了对一等函数的支持,它允许将函数分配给变量。在这种情况下,变量必须是函数类型,由函数接口(只有一个抽象方法的接口)定义。

因此,考虑具有以下定义的接口I和类的示例:A

我们可以为类型的变量分配I的实例A或方法的方法引用barA两者都可以存储在 type 的变量中I,例如:

如果我们分析之前代码编译产生的字节码,我们将得到:

因为i1 = new A();很明显,相应的指令7: astore_1正在存储一个AI. 但是,由于i2 = A::bar我们正在存储8: invokedynamic #4, 0.

那么,这意味着 an 的结果invokedynamic始终是目标类型的实例,即我们使用方法引用分配的变量的类型?

0 投票
1 回答
772 浏览

groovy - 使用--indy,冒泡排序的执行速度要慢 5 倍

我写了一个冒泡排序的实现来玩一下 Groovy,看看是否--indy对性能有任何明显的影响。

本质上,它将一千个随机整数的列表排序一千次,并测量排序列表的平均执行时间。

列表中有一半是Integer[],另一半是ArrayList<Integer>

结果真的让我很困惑:

查看运行基准测试时的 CPU 使用率,使用编译时的 CPU 使用率要高--indy得多。

CPU使用率

这引起了我的兴趣,所以我再次运行了基准测试——但这次启用了 Yourkit 代理和 CPU 跟踪。以下是记录的调用树:

没有--indy不带 <code>--indy</code> 的调用树

--indy使用 <code>--indy</code> 调用树

这是性能图表 - 请注意,时间尺度是不同的,因为--indy代码要慢得多。

没有--indy(1s规模): 没有 <code>--indy</code> 的性能

使用--indy(60 年代规模): <code>--indy</code> 的性能

可以看出,在不--indy使用--indy. 更令人困惑的是,Yourkit 只报告一个活动线程(我的代码只使用主线程),但它仍然设法保持两个半核心被占用。

编译的代码--indy在开始时也使用了大量的内核时间,尽管这会在一段时间后下降并稳定在 0% - 此时代码似乎加快了一点(堆使用增长率增加)并且 CPU 使用增加.

谁能向我解释这种行为?

版本:

BubbleSort.groovy:

我对冒泡排序实现的优化不感兴趣,除非它们与invokedynamic行为相关——这里的目的不是写出性能最好的冒泡排序,而是要弄清楚为什么--indy会对性能产生如此大的负面影响。

更新:

我将我的代码转换为 JRuby 并尝试了同样的事情,结果相似,尽管没有 JRuby 并没有那么快invokedynamic

更新 2:

如果我删除将列表更改为Integer[]一半时间的代码,性能会显着提高,但如果没有它仍然会更快--indy

如果我对 JRuby 做同样的事情,invokedynamic会更快:

0 投票
1 回答
185 浏览

java - 为什么返回类型(强制转换)在 MethodHandler 性能中起关键作用?

我正在做一个简单的项目,需要检索一个 bean 属性。首先我使用反射。然后我对 invokedynamic 和 Method Handler 进行了一些调查以获得更好的性能。

虽然invokeExact比反射快得多,但调用比反射慢得多。

测试环境:

  • Win7 32位
  • Java 7 U 80
  • 核心由于 CPU 3.06GHZ

我得到的 tp/ms 是这样的:

这是性能测试输出(我运行了两次):

这是我的测试代码:

invokeExact无法满足我的用例,因为我在编译时不知道确切的返回类型。似乎返回类型(强制转换)是MethodHandle性能的关键。

这似乎不是预期的结果,因为它MethodType具有确切的返回类型。为什么进行强制施法以提高性能仍然很重要?

是否有一些文档解释了这方面的细节?此外,是否有任何关于比较使用反射与方法处理程序的 impl 细节的文档?

0 投票
1 回答
297 浏览

grails - Grails 的 InvokeDynamic

是否可以将 InvokeDynamic 用于 Grails?

如果可以,兼容哪些版本的 Grails、Java 等?

设置它的程序是什么?

如果不可能,什么时候可以将 InvokeDynamic 支持添加到 Grails 2.x 和/或 3.x?

我没有找到任何关于它的最新信息。

0 投票
2 回答
296 浏览

java - InvokeDynamic 参数的动态类型

为了支持动态类型和方法分派,我的编程语言引入了一种名为dynamic. 在调用类型为 的被调用者上的方法时dynamic,编译器首先将被调用者和所有参数压入堆栈,然后生成一条invokedynamic指令而不是普通invoke*指令。该指令指向一个名为 的类中的特殊引导方法DynamicLinker,但在调用它时只有静态类型可用。

我的问题:如何获取传递给invokedynamic指令的参数的运行时类型?

0 投票
0 回答
349 浏览

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

资源

结果