【问题标题】:Java Program Specialization - What is it? I don't understand itJava 程序专业化 - 它是什么?我不明白
【发布时间】:2011-02-02 15:17:41
【问题描述】:

我正在阅读有关程序专业化的信息 - 特别是 java,老实说,我认为我不太了解它。到目前为止,我的理解是它是一种通过约束参数或输入来优化程序效率的方法?这实际上是如何完成的?有人可以向我解释一下它是如何帮助的,也许可以举例说明它实际上做了什么以及它是如何完成的?

谢谢

我一直在阅读:

Program Specialization - java

【问题讨论】:

  • 您能否提供更多详细信息/链接来说明您所说的“程序专业化”是什么意思?
  • 您为什么不发布您正在阅读的内容的链接。这可能是很多人凭直觉理解但不知道名称的事情之一。
  • 抱歉,我的帖子已经更新了

标签: java performance scalability


【解决方案1】:

看起来Partial Evaluation 应用于 Java。

这个想法是,如果你有一个具有两个参数 A 和 B 的通用函数 F(A,B),并且(假设)每次调用它时,A 总是相同的。然后你可以将 F(A,B) 转换为一个新函数 FA(B),它只接受一个参数 B。这个函数应该更快,因为它不必处理 A 中的信息——它已经“知道”它。出于同样的原因,它也可以更小。

这与代码生成密切相关。

在代码生成中,您编写代码生成器 G 来获取输入 A,然后编写小型、快速的专用函数 FA。 G(A) -> FA。 在专业化中,你需要三样东西,通用程序 F、专业化器 S 和输入 A:S(F,A) -> FA

我认为这是一个分而治之的案例。 在代码生成中,你只需要写G(A),这很简单,因为它只需要考虑所有的A,而生成的程序会考虑所有的B。 在部分评估中,你必须在某个地方得到一个 S,而且你必须写出更难的 F(A,B),因为它必须考虑所有可能的 As 和 Bs 的叉积。

根据个人经验,必须编写程序 F(A,B) 来桥接从较旧的分层数据库到较新的关系数据库的实时更改。 A 是如何以另一个数据库的形式将旧数据库映射到新数据库的元描述。 B 是对原始数据库所做的更改,F(A,B) 计算对新数据库的相应更改。由于 A 的变化频率较低(每周),因此不必编写 F(A,B)。相反,生成器 G(A) 被编写(在 C 中)来生成 FA(B)(在 C 中)。节省的时间大约是开发时间的一个数量级,以及运行时间的两个数量级。

【讨论】:

    【解决方案2】:

    有趣。

    这不是一个很常见的术语,至少我以前没有遇到过。

    我没有时间阅读整篇论文,但它似乎是指根据程序运行的上下文优化程序的潜力。论文中的一个示例显示了通过添加硬编码的“立方体”操作来优化抽象的“幂”操作。这些优化可以自动完成,或者可能需要程序员“提示”。

    可能值得指出的是,专业化并不特定于 Java,尽管您链接到的论文描述了“JSpec”,一种 Java 代码专业化。

    【讨论】:

      【解决方案3】:

      程序专业化是在您事先知道您将要提出的论点时对程序进行专业化的过程。

      一个例子是,如果你有一个测试并且你知道你的论点,你永远不会进入块,你可以消除测试。

      您为某种输入创建程序的专用版本。

      基本上,它有助于摆脱您输入的无用信息。但是,使用现代架构和编译器(至少在 C 语言中),您不会在性能方面赢得很多。

      来自同一作者,我会推荐 Tempo 作品。

      编辑

      来自 Toplas 论文:

      程序专业化是程序 转化技术 优化程序片段 尊重有关上下文的信息 在其中使用它,通过生成一个 专门用于此用途的实现 语境。一种自动化方法 程序专业化是部分的 评估,执行激进 过程间常数传播 所有数据类型的值,以及 执行恒定折叠和 控制流简化基于 此信息 [Jones 等人。 1993]。 因此,部分评估适应了 已知(静态)信息的程序 关于它的执行上下文,如 由用户(程序员)提供。 仅由控制的程序部分 未知(动态)数据是 重建。部分评价 已被广泛调查 功能语言 [Bondorf 1990; Consel 1993],逻辑语言 [Lloyd 和 Shepherdson 1991],命令式 语言 [Andersen 1994;拜尔等人。 1994;康塞尔等人。 1996]。

      【讨论】:

      • 我不认为你说得很对——我读到的例子并没有删除“无用”的代码,它只是为给定的输入提供了一条更快的路径。
      • 控制流的特殊化是,或者当你有一个只要迭代一次的循环时,你删除循环并只执行一次块。另一个典型的例子是将 pow(n)、函数特化为 square() 或 cube()。
      猜你喜欢
      • 2020-08-27
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      相关资源
      最近更新 更多