StringConcatFactory 中的策略

2024-02-01

我知道 invokedynamic 指令。

我也知道它的实现的基本过程。但当我到达代码时。我无法理解其中的代码StringConcatFactory.

能告诉我这六种策略的源码是如何实现的吗?也只完成了默认策略。作为一名大学生,我无法下源代码。

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
}

makeConcat() and makeConcatWithConstants(), 哪个是StringConcatFactoryAPI入口点,都使用doStringConcat(),这会产生一个CallSite所使用的invokedynamic.

doStringConcat() calls generate(Lookup, String, MethodType, Recipe)其中包含您所询问的枚举的以下开关:

switch (STRATEGY) {
    case BC_SB:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.DEFAULT);
    case BC_SB_SIZED:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.SIZED);
    case BC_SB_SIZED_EXACT:
        return StringConcatFactory.BytecodeStringBuilderStrategy.generate(lookup, className, mt, recipe, StringConcatFactory.Mode.SIZED_EXACT);
    case MH_SB_SIZED:
        return StringConcatFactory.MethodHandleStringBuilderStrategy.generate(mt, recipe, StringConcatFactory.Mode.SIZED);
    case MH_SB_SIZED_EXACT:
        return StringConcatFactory.MethodHandleStringBuilderStrategy.generate(mt, recipe, StringConcatFactory.Mode.SIZED_EXACT);
    case MH_INLINE_SIZED_EXACT:
        return StringConcatFactory.MethodHandleInlineCopyStrategy.generate(mt, recipe);
    default:
        throw new StringConcatException("Concatenation strategy " + STRATEGY + " is not implemented");
}
  1. BytecodeStringBuilderStrategy把手BC_SB, BC_SB_SIZED and BC_SB_SIZED_EXACT。它生成相同的StringBuilder- 使用字节码javac如果您只是在 Java 代码中编写串联,则会生成。主要区别在于该字节码是在运行时(而不是编译时)生成并使用Unsafe.defineAnonymousClass().
  2. MethodHandleStringBuilderStrategy把手MH_SB_SIZED and MH_SB_SIZED_EXACT。它用MethodHandle机械(包括MethodHandle组合)在其之上构建相同的串联链StringBuilder来电。它不使用任何私有 API(例如Unsafe),所以它可能是最不可移植的策略。
  3. MethodHandleInlineCopyStrategy把手MH_INLINE_SIZED_EXACT。它还使用MethodHandle建立串联链的机械MethodHandle组成,但不是StringBuffer它直接使用字节数组,尽可能避免复制。为此,它使用了一些内部 API 和一些有关 JDK 实现细节的知识(例如String避免复制字符串字节的构造函数)。所以这个实现更加脆弱(对于 JDK 的更改),但它也允许更快的速度。

一点总结

我们可以看出,三者有两点不同:a)使用什么作为缓冲区来构建字符串以及b)串联链是如何创建的。

  1. BytecodeStringBuilderStrategy (BC_SB_xxx) uses StringBuilder和运行时代码生成。
  2. MethodHandleStringBuilderStrategy (MH_SB_xxx) uses StringBuilder and MethodHandles
  3. MethodHandleInlineCopyStrategy (MH_INLINE_SIZED_EXACT) 使用字节数组并且MethodHandles.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StringConcatFactory 中的策略 的相关文章

随机推荐

  • 在内核调试模式下连接到目标机器时无法中断

    我正在启动一个包含 Windows 微过滤器的原型 我已经设置好了我的环境 目标虚拟机 实际上是 3 个 Windows 7 8 和 8 1 主机开发计算机 托管 Visual Studio 2013 和 HyperV VM 我终于设法将测
  • 设置特定配置文件时不加载 Spring bean

    背景 因此 我有几个与外部系统接口的 bean 对于开发来说 模拟外部系统并用一些产生或多或少静态响应的实现替换接口 bean 是很方便的 所以我一直在做的是创建一个接口 真正的实现和一个存根实现 如下所示 public interface
  • Colorbox:显示/模拟内联内容的“加载”动画

    您好 我正在使用 ColorBox 我们使用 jquery 在表单中执行了几个步骤 并且我们希望在等待 ajax 回复时显示 ColorBox 的加载动画 我们如何使用它 提前谢谢您 我认为你想要的是 fastIframe thediv c
  • 如何使用 jQuery UI 滑块动态更新 highcharts

    我正在寻找一种根据 jQuery UI 滑块确定的值动态更新 Highcharts 的方法 我还不太熟悉 AJAX 或 JSON 所以我运气不太好 我试图让收入在给定的月份内逐步增加 例如订阅服务 为了方便起见 我把它放在 jsFiddle
  • 如何测试预处理器符号是否#define'd但没有值?

    使用 C 预处理器指令 是否可以测试预处理器符号是否已定义但没有值 像这样的东西 define MYVARIABLE if defined MYVARIABLE MYVARIABLE blablabla endif EDIT 我这样做的原因
  • 从子进程触发 root 方法时的上下文

    我有这个非常简单的测试视图
  • 为什么 as_const 禁止右值参数?

    我想问为什么as const禁止右值参数 根据 http en cppreference com w cpp utility as constcppreference com 即为什么标准人员这样做 而不是为什么 cppreference
  • Play Framework 2 存储用户密码哈希的最佳方式

    我的应用程序中有一个添加用户选项 我想将用户密码以哈希格式存储在数据库中 密码以纯文本格式存储在框架附带的示例代码中 经过一番搜索后 我发现 play2 中实现了一个 Crypto encryptAES 函数 可用于保护密码 我的问题是使用
  • Chrome 调试器,水平滚动条在悬停时阻止变量值

    这种情况已经发生了几个星期了 在网上找不到任何东西 有人知道发生了什么事以及如何解决它吗 Screenshot 注意 我将鼠标悬停在包含字符串的变量上 这里真正的解决方法是在控制台窗口中放大 缩小 或者使用 Ctrl 0 重置缩放
  • 当 C++ 线程退出时,内存是否保持分配状态?

    我在 Linux 上使用 pthread 库 我在线程 A 中分配一个字符串 然后尝试在线程 B 中打印该字符串 但是 该字符串只是打印出空 我已经验证它在线程 A 中工作 注意 该字符串驻留在一个对象内 我怀疑该对象可能会被清理或重新实例
  • Vim 中的自动换行(保留缩进)

    我只是在看这个帖子 https stackoverflow com questions 744159 word wrap in gvim描述了如何在 vim 中将整个单词换行 接受的解决方案是这样的 set formatoptions l
  • 如何仅在 SQL Server 中选择未提交的行?

    我正在从事 DW 项目 我需要查询实时 CRM 系统 标准隔离级别会对性能产生负面影响 我很想使用未提交读取的无锁 事务隔离级别 我想知道有多少选定的行被脏读识别 也许你可以这样做 SELECT FROM T WITH SNAPSHOT E
  • JConsole 通过 ssh 本地端口转发

    我希望能够远程连接到公开了 JMX 的 Java 服务 但它被防火墙阻止了 我尝试使用 ssh 本地端口转发 但连接失败 查看wireshark 当您尝试连接jconsole时 它似乎在连接到端口9999后希望通过一些临时端口进行连接 这些
  • 创建动态实现接口的类

    我正在尝试编写一段代码 允许用户加载程序集 DLL 文件 在所述程序集中选择一个接口 然后生成一个继承该接口的类 并带有所有必需方法的存根 该类将生成到文件中或活动的 VS 会话中 该代码旨在在通过自定义模板创建项目期间初始化的 IWiza
  • StackView isHidden 属性未按预期更新

    我正在尝试更新UIStackView以便显示一个字段 如果 a 的值UITextField equal Other 这是我的代码 IBOutlet var stackView UIStackView func updateView prin
  • 附加到不带标题的 CSV 文件

    我在用opencsv http opencsv sourceforge net 将 Java bean 写入带有标题的 CSV 文件 文件名包含当前日期 如果用户在同一天第二次运行它 它会追加到文件中 但会添加另一个标题行 如何附加到文件但
  • jqGrid for Twitter Bootstrap [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 仅在 50 毫秒后显示微调器

    我有一个页面 其中发生了很多 ajax 操作 我显示了一个微调器来指示正在处理请求 其中一些请求需要很长时间 而另一些请求则很快 当响应来得很快时 那些旋转器就更像是一种麻烦而不是一种帮助 这就是我想要的 仅当请求提交后超过 50 毫秒时才
  • cefsharp如何拦截xhr请求以获取响应正文值?

    CefSharp是否能够拦截XHRHttpRequest并获取响应正文值 如果是 我想知道它是如何完成的 我为此创建了以下类并从中返回它的实例IRequestHandler GetResourceResponseFilter interna
  • StringConcatFactory 中的策略

    我知道 invokedynamic 指令 我也知道它的实现的基本过程 但当我到达代码时 我无法理解其中的代码StringConcatFactory 能告诉我这六种策略的源码是如何实现的吗 也只完成了默认策略 作为一名大学生 我无法下源代码