在中编写
更改由
javac
生成的静态String
-concatenation字节码序列,以使用对JDK库函数的invokedynamic
调用。这将支持将来对String
连接的优化,而不需要对javac
发出的字节码进行进一步的更改。
在这里,我想了解invokedynamic
调用的用法以及字节码连接与invokedynamic
的不同之处
发布于 2017-10-01 23:17:32
在深入讨论用于优化字符串连接的invokedynamic
实现的细节之前,我认为必须了解一些关于What's invokedynamic and how do I use it?的背景知识
指令简化并潜在地改进了动态语言的编译器和运行时系统的实现。它通过允许语言实现者定义与
invokedynamic
指令的自定义链接行为来实现这一点,这包括以下步骤。
我可能会尝试用字符串拼接优化的实现带来的变化来带你了解这些变化。
invokedynamic
调用点的bootstrap方法主要支持字符串连接和是在实现中引入的。使用invokedynamic提供了一种选择翻译策略的方法,直到运行时为止。StringConcatFactory
中使用的翻译策略类似于上一个java版本中引入的。此外,问题中提到的JEP的目标之一是扩展这些策略further.
invokedynamic
指令的附加静态参数,而不是(1) MethodHandles.Lookup
对象,它是用于在invokedynamic
指令的上下文中创建方法句柄的工厂;(2) String
对象,在动态调用站点中提到的方法名称;以及(3) MethodType
对象,动态调用站点的解析类型签名。在代码的链接过程中已经有了链接。在运行时,bootstrap方法运行并链接到执行连接的实际代码中。它使用适当的invokestatic
调用重写invokedynamic
调用。这从常量池中加载常量字符串,bootstrap方法静态参数被利用来将这些和其他常量直接传递给bootstrap方法call.
invokedynamic
调用java.lang.invoke.StringConcatFactory
__替换整个java.lang.invoke.StringConcatFactory
__,它将接受需要的值Indify String Concatenation提案通过一个例子说明了使用Java9对应用程序进行基准测试,其中编译了与@T.J. Crowder共享的类似方法,并且字节码的差异在不同的实现之间相当明显。
发布于 2017-10-02 03:38:39
我将在这里稍微添加一些细节。要得到的主要部分是,字符串连接如何完成是运行时的决定,而不再是编译时的。因此,它可以更改,这意味着您已经针对java-9编译了一次代码,它可以随心所欲地更改底层实现,而不需要重新编译。
第二点是,目前有6 possible strategies for concatenation of String
private enum Strategy {
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder}.
*/
BC_SB,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but trying to estimate the required storage.
*/
BC_SB_SIZED,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but computing the required storage exactly.
*/
BC_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also tries to estimate the required storage.
*/
MH_SB_SIZED,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also estimate the required storage exactly.
*/
MH_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that constructs its own byte[] array from
* the arguments. It computes the required storage exactly.
*/
MH_INLINE_SIZED_EXACT
}
您可以通过参数-Djava.lang.invoke.stringConcat
选择它们中的任何一个。请注意,StringBuilder
仍然是一个选项。
https://stackoverflow.com/questions/46512888
复制相似问题