Java程序专业化 - 它是什么?我不明白

时间:2010-03-30 19:40:18

标签: java performance scalability

我正在阅读有关程序专业化的内容 - 特别是java,我认为我并不认为这是诚实的。到目前为止,我所理解的是,它是一种通过约束参数或输入来优化程序效率的方法?这是怎么做到的?有人可以向我解释它是如何起作用的,并且可能是它实际上做了什么以及它是如何完成的一个例子?

由于

我一直在读:

Program Specialization - java

3 个答案:

答案 0 :(得分:0)

当你事先知道你将要拥有的论点时,程序专业化是一个专门化程序的过程。

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

您可以为某种输入创建一个专门的程序版本。

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

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

修改

来自Toplas论文:

  

计划专业化是一个计划   转换技术   使用优化程序片段   尊重有关背景的信息   通过生成它来使用它   专用于此用途的实现   上下文。一种自动化的方法   程序专业化是部分的   评价,表现积极   程序间不断传播   所有数据类型的值,和   执行恒定折叠和   基于控制流程的简化   这个信息[琼斯等人。 1993]。   部分评估因此适应a   程序到已知(静态)信息 -   关于它的执行上下文,如   由用户(程序员)提供。   只有程序部分由   未知(动态)数据   重建。部分评估   已被广泛调查   功能语言[Bondorf 1990;   Consel 1993],逻辑语言[Lloyd   和Shepherdson 1991],势在必行   语言[Andersen 1994;拜尔等人。   1994; Consel等人。 1996]。

答案 1 :(得分:0)

有趣。

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

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

值得指出的是,专业化并非特定于Java,尽管您链接的文章描述了“JSpec”,一个Java代码专用器。

答案 2 :(得分:0)

看起来Partial Evaluation应用于Java。

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

这与代码生成密切相关。

在代码生成中,您编写代码生成器G以获取输入A并写入小的快速专用函数FA。 G(A) -> FA。 在专业化中,你需要三件事,一般程序F,专业化程序S和输入A:S(F,A) -> FA

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

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