首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一体系结构上的动态重新编译

在同一体系结构上的动态重新编译
EN

Stack Overflow用户
提问于 2016-09-12 20:58:53
回答 2查看 181关注 0票数 2

我知道在执行过程中可以使用动态重新编译将一个体系结构的指令转换为另一个体系结构。但是,它能用于在同一体系结构上优化程序吗?如果我编写了一个优化很差的汇编语言程序,我是否可以使用动态重新编译器使其运行速度超过本机速度?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-13 12:57:36

创建比本机速度更快的代码是不可能的,因为最快的代码仍然只以本机速度运行。:)

如果您的意思是“比原始代码更快”,那么是的,有可能创建具有此目的的工具,但要使其实用和成功将是相当困难的。

推理:

对于C++这样的本地编译语言,通过编译原始源代码,编译器对程序员的最初意图有了很多强烈的暗示,他们的优化器可能会更加激进,而不是盲目地将所有字符按字符转换成机器代码,而是只生成符合语言定义的代码(即。当不使用结果时,省略整个函数调用,并且没有函数执行的副作用)。

一旦您只尝试优化本机代码本身,您就不会有额外的上下文。因此,您的新优化代码必须在各个方面模仿原始代码,包括所有副作用和内存修改。

在这一点上,您只需要进行一些非常小的优化,例如寄存器重新分配、指令重新排序、偶尔会有几个指令替换为更快的替代,等等。

一个现代的x86 CPU在执行过程中实际上是自己做的很多事情,因为x86原始的CISC类指令集不是直接在芯片上实现的,但是它被转换成内部的RISC--类似于RISC的微指令,寄存器被别名,所有的东西都被重新排序,在可能的情况下并行执行,有分支预测,推测-提前,等等.现代的x86 CPU就像机器中的机器,因此它实际上完成了您的方法本身可能实现的一半。

另外一半可能很难为程序计算,所以以您的方式设计的工具可能只会省去内部x86优化的麻烦,使机器代码更目标平台友好,但只获得轻微的额外性能。

票数 0
EN

Stack Overflow用户

发布于 2016-09-12 21:07:00

我不知道这样一个工具,不太可能存在,甚至更不可能提高一个已经存在的程序的速度。

另一方面,可以现实地做些什么:

  1. 使用IDAPro或其他方法反汇编程序
  2. 识别代码和数据部分(这很重要,也很乏味)
  3. 保存为ASM
  4. 试着用一个好的汇编程序来组装它,并打开所有的优化。
  5. 您甚至可以尝试对程序进行分析,添加新功能,并在(几乎)有源代码的情况下手动优化程序。

步骤2是至关重要的,因为如果不这样做(将数据标记为真实数据),优化器在启动时将对程序造成致命的影响:优化器将将数据解释为指令并对其进行优化,从而产生不同的数据!

当然,如果不能将代码识别为真正的代码,那么问题就不那么严重了,但是您将失去更有效地重新组合它的能力。

这种方法可以帮助改进,比如说,当优化不进行或不太好的时候,老C编译的程序。但是一个好的工作需要手动识别程序浪费时间的部分。汇编程序只能执行本地优化。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39458692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档