为什么编译和链接的高级语言执行速度比汇编/机器代码慢?

为什么编译和链接的高级语言执行速度比汇编/机器代码慢?

假设我将 C 编译并链接到平面二进制或某种可执行输出格式,以便在裸机上运行。如果我在启动时优化并将直接二进制文件输入到 CPU,那么为什么编译和链接的 C 源产生的格式会比汇编的汇编格式花费更多的时钟周期?我的意思是,如果从某种二进制格式输入和获取相同的指令,无论来源如何,如果生成的二进制文件产生相同的操作码,无论是来自 C、D、汇编还是直接编写的操作码本身(如果可能),为什么程序员经常说汇编总是更快?

抱歉,如果没有明确说明,但一般来说,无论来源如何,相同的获取的操作码是否都应该占用相同的时钟周期和 CPU 资源,如果链接和/或编译/汇编,如果二进制文件仅包含必要的指令(并且链接器脚本或输出格式处理程序可以为 C 或类似程序执行此操作,则应该同样快)。

答案1

你的前提是错误的。如果你使用一种高级语言,该语言编译为平面二进制文件,其操作码与手工编写的汇编程序完全相同,那么该程序的执行方式将完全相同。问题是,这些情况实际上从未发生过。

每个 C 程序在开头(进入主程序之前)都有引导代码,因此马上就会有额外的操作码。如果调用一个函数,C 调用约定可能不如专门的汇编调用优化,而汇编调用因函数而异。最后,编译器在任何给定函数内生成的操作码与手工汇编程序不同;有时更好,有时更差,这取决于编译器编写者和汇编程序员的能力。因此,“汇编总是更好”也不正确。

例如,编译器可能会展开一个循环以使其运行得更快。在汇编语言中,你可能会用宏做同样的事情;但汇编程序员会这么麻烦吗?

答案2

编写良好的汇编程序将比同类的 C 程序运行得更快,这仅仅是因为汇编程序不包含 C 程序所需的所有样板代码,例如保存和恢复 CPU 或堆栈状态。

答案3

算法越快越好。内联代码作为汇编程序的插入会更好更快。例如,如果您可以花费无限的时间来搜索未记录的指令,那么您将看到在一个操作中即时计算二次和和其他奇怪的东西......这一切都取决于兼容性和编写程序时的情况。第二点是多核和多处理器,算法应该适合多个处理器核心同时执行。当提前采取行动时,有足够的技术。例如全文搜索 - 工作时间很长,但您可以在几分之一秒内看到即时结果。有一件事被错误地视为软件的性能 - 系统的响应能力。您可以异步或部分地完成工作,以逐步满足用户的查询,它通常在物理上无法立即处理给出的信息量。或者只是根据某些标准对它失去兴趣。反过来,您节省了系统的性能和响应能力的资源。

好吧,没有什么比针对特定情况和好的库进行测试更好的了。))。

答案4

长期以来,编译器的表现通常优于熟练的汇编程序员。对于时间极其紧迫、非常短的代码片段,如果专家程序员仔细调整几天的工作量,可能会做得更好。

相关内容