Java程序专门化-它是什么?我不知道';我不明白

Java程序专门化-它是什么?我不知道';我不明白,java,performance,scalability,Java,Performance,Scalability,我正在阅读有关程序专门化的书籍——特别是java,老实说,我不太理解它。到目前为止,我所理解的是,它是一种通过约束参数或输入来优化程序效率的方法?这实际上是如何做到的?有人能给我解释一下它是如何起作用的吗?也许有人能举个例子说明它到底做了什么以及它是如何做到的 谢谢 我一直在读: 程序专门化是当您事先知道将要使用的参数时专门化程序的过程 一个例子是,如果你有一个测试,你知道你的参数永远不会进入块,你可以消除测试 您可以为特定类型的输入创建程序的专用版本 基本上,它有助于摆脱无用的输入。然而,使用

我正在阅读有关程序专门化的书籍——特别是java,老实说,我不太理解它。到目前为止,我所理解的是,它是一种通过约束参数或输入来优化程序效率的方法?这实际上是如何做到的?有人能给我解释一下它是如何起作用的吗?也许有人能举个例子说明它到底做了什么以及它是如何做到的

谢谢

我一直在读:


程序专门化是当您事先知道将要使用的参数时专门化程序的过程

一个例子是,如果你有一个测试,你知道你的参数永远不会进入块,你可以消除测试

您可以为特定类型的输入创建程序的专用版本

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

来自同一作者,我推荐节奏作品

编辑

从Toplas论文中:

程序专业化是一个程序 转换技术 使用 关于上下文的信息 通过生成 专用于此用途的实现 上下文一种实现自动化的方法 程序专门化是部分的 评估,执行积极的 过程间常数传播 所有数据类型的值,以及 执行不断的折叠和调整 基于遗传算法的控制流简化 这一信息[Jones等人,1993年]。 因此,部分评估采用了 程序到已知(静态)信息- 有关其执行上下文的详细信息,如 由用户(程序员)提供。 仅程序部件由控制 未知(动态)数据不可用 重建。初步评价 已被广泛调查多年 函数语言[Bondorf 1990; 康塞尔1993],逻辑语言[Lloyd 和Shepherdson(1991年),而且是必须的 语言[Andersen 1994;Baier等人。 1994年;Consel等人,1996年]

有趣

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

我没有时间阅读整篇文章,但它似乎是指根据程序运行的环境优化程序的潜力。本文中的一个示例显示了通过添加硬编码的“多维数据集”操作来优化抽象的“电源”操作。这些优化可以自动完成,或者可能需要程序员“提示”

也许值得指出的是,专门化并不是Java特有的,尽管您链接到的文章描述了“JSpec”,一个Java代码专门化器。

它似乎适用于Java

这个想法是,如果你有一个通用函数F(a,B),它有两个参数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),这是简单的,因为它只需要考虑所有的AS,而生成的程序考虑所有的BS。 在部分评估中,你必须在某处得到一个S,并且你必须写F(a,b),这是比较困难的,因为它必须考虑所有可能的AS和BS的叉积。< /P>
根据个人经验,必须编写一个程序F(a,B)来连接从较旧的层次数据库到较新的关系数据库的实时更改。A是如何以另一个数据库的形式将旧数据库映射到新数据库的元描述。B是对原始数据库所做的更改,F(A,B)计算了对新数据库的相应更改。由于A以低频率(每周)变化,因此F(A,B)无需写入。相反,一个生成器G(a)被写入(C)以生成FA(B)(C)。节省的时间大约是开发时间的一个数量级,运行时间的两个数量级。

您能提供更多详细信息/a您所说的“程序专业化”的链接吗?为什么不发布一个指向您正在阅读的内容的链接呢。这可能是很多人凭直觉理解但不知道姓名的事情之一。对不起,我现在更新了我的帖子我认为你不太正确-我读的示例没有删除“无用”代码,它只是为给定的输入提供了一个更快的路径。控制流专门化就是,或者,当您有一个只迭代一次的循环时,删除该循环并只执行一次块。另一个典型示例是将pow(n)函数专门化为square()或cube()。