我知道在执行过程中可以使用动态重新编译将一个体系结构的指令转换为另一个体系结构。但是,它能用于在同一体系结构上优化程序吗?如果我编写了一个优化很差的汇编语言程序,我是否可以使用动态重新编译器使其运行速度超过本机速度?
发布于 2016-09-13 12:57:36
创建比本机速度更快的代码是不可能的,因为最快的代码仍然只以本机速度运行。:)
如果您的意思是“比原始代码更快”,那么是的,有可能创建具有此目的的工具,但要使其实用和成功将是相当困难的。
推理:
对于C++这样的本地编译语言,通过编译原始源代码,编译器对程序员的最初意图有了很多强烈的暗示,他们的优化器可能会更加激进,而不是盲目地将所有字符按字符转换成机器代码,而是只生成符合语言定义的代码(即。当不使用结果时,省略整个函数调用,并且没有函数执行的副作用)。
一旦您只尝试优化本机代码本身,您就不会有额外的上下文。因此,您的新优化代码必须在各个方面模仿原始代码,包括所有副作用和内存修改。
在这一点上,您只需要进行一些非常小的优化,例如寄存器重新分配、指令重新排序、偶尔会有几个指令替换为更快的替代,等等。
一个现代的x86 CPU在执行过程中实际上是自己做的很多事情,因为x86原始的CISC类指令集不是直接在芯片上实现的,但是它被转换成内部的RISC--类似于RISC的微指令,寄存器被别名,所有的东西都被重新排序,在可能的情况下并行执行,有分支预测,推测-提前,等等.现代的x86 CPU就像机器中的机器,因此它实际上完成了您的方法本身可能实现的一半。
另外一半可能很难为程序计算,所以以您的方式设计的工具可能只会省去内部x86优化的麻烦,使机器代码更目标平台友好,但只获得轻微的额外性能。
发布于 2016-09-12 21:07:00
我不知道这样一个工具,不太可能存在,甚至更不可能提高一个已经存在的程序的速度。
另一方面,可以现实地做些什么:
步骤2是至关重要的,因为如果不这样做(将数据标记为真实数据),优化器在启动时将对程序造成致命的影响:优化器将将数据解释为指令并对其进行优化,从而产生不同的数据!
当然,如果不能将代码识别为真正的代码,那么问题就不那么严重了,但是您将失去更有效地重新组合它的能力。
这种方法可以帮助改进,比如说,当优化不进行或不太好的时候,老C编译的程序。但是一个好的工作需要手动识别程序浪费时间的部分。汇编程序只能执行本地优化。
https://stackoverflow.com/questions/39458692
复制相似问题