首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java 9中字符串连接是如何实现的?

在Java 9中字符串连接是如何实现的?
EN

Stack Overflow用户
提问于 2017-10-01 21:34:27
回答 2查看 11.5K关注 0票数 114

在中编写

更改由javac生成的静态String-concatenation字节码序列,以使用对JDK库函数的invokedynamic调用。这将支持将来对String连接的优化,而不需要对javac发出的字节码进行进一步的更改。

在这里,我想了解invokedynamic调用的用法以及字节码连接与invokedynamic的不同之处

EN

回答 2

Stack Overflow用户

发布于 2017-10-01 23:17:32

在深入讨论用于优化字符串连接的invokedynamic实现的细节之前,我认为必须了解一些关于What's invokedynamic and how do I use it?的背景知识

指令简化并潜在地改进了动态语言的编译器和运行时系统的实现。它通过允许语言实现者定义与invokedynamic指令的自定义链接行为来实现这一点,这包括以下步骤。

我可能会尝试用字符串拼接优化的实现带来的变化来带你了解这些变化。

  • Defining Bootstrap Method:-使用Java9,invokedynamic调用点的bootstrap方法主要支持字符串连接和是在实现中引入的。

使用invokedynamic提供了一种选择翻译策略的方法,直到运行时为止。StringConcatFactory中使用的翻译策略类似于上一个java版本中引入的。此外,问题中提到的JEP的目标之一是扩展这些策略further.

  • Specifying常量池条目:-这些是invokedynamic指令的附加静态参数,而不是(1) MethodHandles.Lookup对象,它是用于在invokedynamic指令的上下文中创建方法句柄的工厂;(2) String对象,在动态调用站点中提到的方法名称;以及(3) MethodType对象,动态调用站点的解析类型签名。

在代码的链接过程中已经有了链接。在运行时,bootstrap方法运行并链接到执行连接的实际代码中。它使用适当的invokestatic调用重写invokedynamic调用。这从常量池中加载常量字符串,bootstrap方法静态参数被利用来将这些和其他常量直接传递给bootstrap方法call.

  • Using调用动态指令:-通过在初始调用期间提供一次引导调用目标的手段,这提供了用于惰性链接的工具。这里优化的具体想法是用一个简单的invokedynamic调用java.lang.invoke.StringConcatFactory__替换整个java.lang.invoke.StringConcatFactory__,它将接受需要的值

Indify String Concatenation提案通过一个例子说明了使用Java9对应用程序进行基准测试,其中编译了与@T.J. Crowder共享的类似方法,并且字节码的差异在不同的实现之间相当明显。

票数 23
EN

Stack Overflow用户

发布于 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仍然是一个选项。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46512888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档