我正在阅读有关程序专业化的内容 - 特别是java,我认为我并不认为这是诚实的。到目前为止,我所理解的是,它是一种通过约束参数或输入来优化程序效率的方法?这是怎么做到的?有人可以向我解释它是如何起作用的,并且可能是它实际上做了什么以及它是如何完成的一个例子?
由于
我一直在读:
答案 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中)。节省的时间大约是开发时间的一个数量级,并且是运行时间的两个数量级。