问题标签 [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 投票
1 回答
356 浏览

clojure - 不应该有一个 jit 减少对 invokeDynamic 的需求吗?

在对invokeDynamic做了很多阅读之后,我仍然有点困惑。一个重复的主题似乎是Clojure实际上并不需要它,或者至少比JVM上的其他动态语言实现更少需要它(Jruby,JPython,Groovy等.).我不了解所有细节,但似乎有类型注释是主要原因,它简单地消除了动态调度问题。

1-将调用动态描述为有效实现复杂方法调度场景的方式是否安全?(还有更多吗?)

2-不应该有一个 jit 消除对调用动态的需要吗?问题似乎是由于缺少运行时类型信息而引起的,jit应该有这些信息。

3-JRuby好像有个jit,用invokdynamic,为什么?

0 投票
1 回答
178 浏览

java - JDK 7 中的链接#registerBootstrapMethod

在 JDK 7 的预览版中,有一组方法可以控制名为 Linkage 的类中的 invokedynamic 调用站点的链接。例如registerBootstrapMethod. 这些在 JDK 的最终版本中发生了什么?

0 投票
2 回答
175 浏览

java - 方法句柄操作

对于我使用 aspectJ 和 invokedynamic 的工作,当切入点与被调用的方法匹配时,我需要将通知编织到方法中。首先,我将脚本中的 invokedynamic-instruction 的引导方法与我自己的进行了交换。现在在我的引导方法中,我想返回一个 CallSite,它首先调用被调用的方法,然后是我定义的建议。

问题是我必须返回一个由 ONE MethodHandle 构建的 CallSite ,其类型签名与原始引导方法中使用的类型签名相同。我考虑过将两个方法句柄(原始 + 建议)组合成一个新的方法句柄,并将其用于返回的 CallSite。但我找不到正确的方法来做到这一点。MethodHandles.foldArguments 似乎很有希望,但它对我不起作用。另一个想法是从调用原始方法句柄和建议的包装方法构建 MethodHandle,但问题是正确的类型签名。

有没有人对我有想法或建议?如何使用建议修补 MethodHandle?

谢谢你。

0 投票
2 回答
8482 浏览

groovy - 如果我也在使用 Java 7,我应该使用 Groovy 的 @CompileStatic

我已经阅读了“Groovy 2.0 中的新增功能”,但对于何时使用 @CompileStatic 感到有些困惑。文章提到,@CompileStatic注释是为无法利用 Java7 的调用动态部分的开发人员添加的。

因此,如果无法在 JDK 7 上运行,寻求性能改进的开发人员不会在 Groovy 2.0 中看到太多变化。幸运的是,Groovy 开发团队认为这些开发人员可以通过允许类型检查获得有趣的性能提升以及其他优势静态编译的代码。

我的问题是,如果我使用的是 JDK 7 并按照说明添加--indy标志,是否需要添加@CompileStatic才能看到一些性能提升? 这个博客建议我这样做,但我不确定他是否正确编译,因为他是在 Eclipse 中完成的。

更新:以下是运行斐波那契代码的不同排列时的统计数据。

注意:这个问题现在似乎有点令人困惑,因为我知道这些功能是独立的。由于问题的基础是围绕使我认为这两个功能相关的注释中的混淆,我认为不更改问题措辞并允许解释差异的公认答案是有意义的。

0 投票
1 回答
475 浏览

jruby - JRuby java.lang.ClassCastException

我使用了来自http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html的一个小 Jruby 脚本来测试 invokedynamic:

但是当我用 JRuby 编译到 Java 类文件然后尝试执行它时,我得到以下异常:

我的系统:Windows 7 64 位上的 JDK 1.7.0_09 64 位,JRuby 1.7.2

使用的命令行:

不久前,我在 linux 机器上和 Windows jdk8 上测试了它,结果相同。使用 JDK8 它可以工作,但是在另一个项目中使用类文件时给我带来了问题。

有没有人知道如何解决它?如何在 Java 7 上将 JRuby 与 indy 一起使用?

0 投票
2 回答
632 浏览

groovy - 在什么情况下我们可以期待 Groovy2.0 + 动态调用的性能提升?

我将 Havlak 基准测试的 Java 代码从 Robert Hundt(参见链接)移植到 Groovy。现在我使用 Groovy 2.1.1 运行基准测试,使用动态调用和不调用动态调用,但计算所需的持续时间几乎相同。我做了什么来启用动态调用?我将groovy--indy.jars 从 groovy-2.1.1\indy 复制到 groovy-2.1.1\lib。然后我在 groovy-2.1.1\lib 中删除了所有名称中没有“indy”的 groovy .jar。此后,在 IntelliJ IDEA 中,我启用和禁用了标志 File > Settings > Compiler > Groovy Compiler > Invoke dynamic support。

我只是告诉这个让人们看看我是否正确打开了 indy 支持。但这不是我的问题。我的问题是,由于调用动态,我们可以期望在哪种情况下加快计算时间。我阅读了有关它的文章,但是很难将那里解释的关于 invoke dynamic 所做的事情翻译成“这种代码在 indy 支持下将执行得更快”的声明。Havlak 基准测试做了很多循环,其中通过调用 setter 来更改值。

如果有人对此事有所了解,我会很高兴在这里放弃一些解释:-)。

谢谢,奥利弗

0 投票
1 回答
1162 浏览

java - 使用 Javassist 生成 Invokedynamic

我想,我正在尝试做一些相对简单的事情。以 doSomething(int) 方法的以下 Java 字节码为例:

这个字节码几乎只将调用转发给静态助手。

我现在要做的是使用Javassist 将invokestatic 替换为invokedynamic。我知道如何用 ASM 做到这一点,因此只是假设我出于纯粹的好奇想知道它是如何工作的。以下是我的一些问题:

1) 以下是否正确:我不能使用 javassist CtMethod.instrument() 或 CtMethod.insertAt() 方法,因为这些方法需要一个包含有效 Java 表达式的字符串,而我不能用 Java 语法编写一个 invokedynamic?

2)invokestatic 的参数就像invokevirtual 或invokestatic 的参数一样处理,对吧?我的意思是,您将参数放在invokedynamic 之前的堆栈中,就像您为invokevirtual 所做的那样?

3) 是否有使用 Javassist 创建调用动态字节码的示例代码(或者你能想出一些)?

这是我目前所知道的:你可以创建一个字节码对象,它有一个 addInvokedynamic() 方法。但这需要 BootstrapMethodsAttribute 中的 BootstrapMethod 索引。BootstrapMethod 反过来期望常量池中的方法句柄信息的索引,该索引需要方法引用等。所以本质上你必须自己管理整个常量池条目。没关系,但我担心我做错了,以后会引入奇怪的问题。有没有更简单的方法来做到这一点(一个辅助方法左右)?我的代码大致看起来像这样(我并没有真正“重写”上面的调用静态但是:

非常感谢您的帮助和时间!

0 投票
1 回答
907 浏览

performance - grails 2 / groovy 2 / JDK7:如何获得收益?

我真的很喜欢 Grails,但我想知道如何获得 Groovy 2 的性能优势。问题是如何配置开发和生产环境以获得“接近 Java”的性能提升。

所以,如果我设置:

是否有任何指导方针可以真正加快我的 webapp开箱即用的速度?

我需要在我的 Grails webapp 代码库中进行任何重构吗?我的意思是像在控制器中引用服务这样的依赖注入东西应该是静态编译的,还是应该像文档说的那样继续编写代码?

ps:我猜Groovy @CompileStatic 和Grails可能是一个相关的问题......

0 投票
1 回答
1160 浏览

groovy - Groovy 调用动态性能

使用以下 Groovy 代码片段,我得到了一些意想不到的基准测试结果:

不得不说,我使用了编译好的类文件,并通过 Reflection API 调用了它。长话短说(不要问;)。对于第一印象,我使用了 10 轮 + 5 次热身和 10000 次循环。(junit-benchmark 框架)我的 JDK 是 Verison 1.7.0_09,我使用的是 Groovy 2.1。我在有和没有调用动态支持的情况下编译了代码 2 次。关键是,带有 invokedynamic 的基准测试比正常编译的基准花费的时间要长得多。我还用斐波那契数做了其他基准测试,其表现与预期的一样(indy 花了大约一半的时间)。

有人知道这里出了什么问题吗?

谢谢。

0 投票
2 回答
404 浏览

java - InvokeDynamic:是否可以将调用站点字节码传递给引导方法然后执行它

假设我有一个自定义 Java 编译器或字节码代理。

是否可以以不需要我生成匿名类来“托管”合成方法中的字节码的方式将调用站点字节码传递给我的引导处理程序?

即,一旦我通过了字节码,我想以尽可能少的开销执行它(假设我已经获得了堆栈和局部变量数组,正好可以让字节码工作)