*在实践中*哪个更快:像样的C代码或像样的手写汇编器?

安全性

很久很久以前,在一个遥远的星系中,我曾经用Delphi编写程序,然后,如果我需要快速完成某些事情,则可以用手写汇编器编写这些例程。它产生的代码比编译器快得多。

但是,在实践中,不再是真的吗?显然,手写汇编器在原理上始终至少与已编译的高级代码一样快但是,从那段黑暗时期开始,CPU取得了长足发展。现在,如果您要优化汇编程序,则必须考虑指令的顺序,以便它们可以流水线化或并行运行,分支预测的效果以及上百万种其他条件;而且我怀疑不可能将它们全部同时保存在人类RAM中。

那么,这是否意味着至少在为现代CPU进行编码时,如今,一个体面的(但不是超人的)程序员通过编写C会比编写手写汇编器产生更快的代码?

我发生的另一种可能性。优化是将高级语言转换为汇编器之前还是之后进行的?如果是之后...生产手写汇编程序,然后通过编译器的优化过程,它会更快吗?

最近,当我为编程挑战编写一些代码时,出现了一个问题,其中的实质是生成一个应尽可能快地在Raspberry Pi上运行的例程。我将被允许用汇编器编写它;但是我的猜测是,即使Pi处理器在2014年的术语中没有那么复杂,精心编写的C也会更快。

使问题更具体和具体:

  • 假设您要编写非常快(整数)的数字运算代码以在Raspberry Pi上运行。您已经编写了一些非常不错的C代码,它们可以作为紧密循环来解决该问题。值得在汇编器中手工制作以加快速度,还是在实践中会降低效率?
安德烈

在我看来,到目前为止给出的两个答案都是正确的。答案尤其取决于我们正在讨论的特定CPU体系结构。体系结构越复杂,用手编写高效的ASM代码就越困难。

频谱的一端是CISC内核,例如x86。它们具有多个执行单元,较长的流水线,每条指令的可变指令等待时间等。在许多情况下,对于人类而言看起来“干净”或“最佳”的ASM代码实际上并不是CPU的最佳选择,可以通过使用指令进行改进或来自处理器手册黑暗角落的技术。编译器对此“了解”,并且可以生成相当不错的代码。没错,在很多情况下,熟练的人员可以改进发出的代码,但是使用正确的编译器和优化设置代码通常已经非常好。同样,有了C代码,您就不需要为每个新的CPU代手动对其进行优化(是的,优化通常取决于特定的CPU系列,而不仅取决于指令集),因此用C编写是一种“面向未来”

另一端是简单的RISC内核,例如8051(或其他简单的8位控制器)。它们具有更简单的调度语义和较小的指令集。编译器在这里仍然做了不错的优化工作,但是手工编写一个不错的ASM代码(或解决发出的代码中的性能问题)也要简单得多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

*在实践中*哪个更快:像样的C代码或像样的手写汇编器?

来自分类Dev

ForToWhile 在实践中

来自分类Dev

在实践中,为什么插入排序比气泡排序和堆排序更快?

来自分类Dev

[Right] .. JOIN在实践中的用法

来自分类Dev

编译与手写汇编中的性能差异

来自分类Dev

浏览器和服务器在实践中是否使用 HTTP 内容协商?

来自分类Dev

我在实践中对Docker卷使用的困惑

来自分类Dev

霍夫曼编码表在实践中是如何构建的?

来自分类Dev

sizeof(void*) != sizeof(uintptr_t) 在实践中?

来自分类Dev

ConstraintLayout 不会正确调整大小(在实践中)

来自分类Dev

LSTM 在实践中如何利用输入数据?

来自分类Dev

汇编器和C代码之间的链接错误(MinGW)

来自分类Dev

在实践中如何使用我的文本分类器?截至获得新评论的tf-idf值

来自分类Dev

从C的内联汇编器中定义的访问数组

来自分类Dev

在实践中使用Worklight FormBasedAuthenticator

来自分类Dev

在实践中使用本地课程

来自分类Dev

IOPS(在Amazon EBS中)在实践中是什么意思?

来自分类Dev

标准正态分布在 NumPy 和 PyTorch 中是如何在实践中工作的?

来自分类Dev

在汇编器中写入文件

来自分类Dev

Linux中的AVR汇编器

来自分类Dev

在汇编器中编写函数

来自分类Dev

汇编器中循环的错误迭代

来自分类Dev

C汇编器功能转换

来自分类Dev

手写笔中的Mixin

来自分类Dev

一阶逻辑在实践中如何处理不确定性?

来自分类Dev

在实践中,非关系对core.logic意味着什么?

来自分类Dev

语义版本控制和持续部署,在实践中是否存在冲突?

来自分类Dev

PHP preg_ / u utf-8开关-不了解它在实践中的作用

来自分类Dev

JavaScript类,如何在实践中应用“关注分离”和“不要重复自己”(DRY)

Related 相关文章

  1. 1

    *在实践中*哪个更快:像样的C代码或像样的手写汇编器?

  2. 2

    ForToWhile 在实践中

  3. 3

    在实践中,为什么插入排序比气泡排序和堆排序更快?

  4. 4

    [Right] .. JOIN在实践中的用法

  5. 5

    编译与手写汇编中的性能差异

  6. 6

    浏览器和服务器在实践中是否使用 HTTP 内容协商?

  7. 7

    我在实践中对Docker卷使用的困惑

  8. 8

    霍夫曼编码表在实践中是如何构建的?

  9. 9

    sizeof(void*) != sizeof(uintptr_t) 在实践中?

  10. 10

    ConstraintLayout 不会正确调整大小(在实践中)

  11. 11

    LSTM 在实践中如何利用输入数据?

  12. 12

    汇编器和C代码之间的链接错误(MinGW)

  13. 13

    在实践中如何使用我的文本分类器?截至获得新评论的tf-idf值

  14. 14

    从C的内联汇编器中定义的访问数组

  15. 15

    在实践中使用Worklight FormBasedAuthenticator

  16. 16

    在实践中使用本地课程

  17. 17

    IOPS(在Amazon EBS中)在实践中是什么意思?

  18. 18

    标准正态分布在 NumPy 和 PyTorch 中是如何在实践中工作的?

  19. 19

    在汇编器中写入文件

  20. 20

    Linux中的AVR汇编器

  21. 21

    在汇编器中编写函数

  22. 22

    汇编器中循环的错误迭代

  23. 23

    C汇编器功能转换

  24. 24

    手写笔中的Mixin

  25. 25

    一阶逻辑在实践中如何处理不确定性?

  26. 26

    在实践中,非关系对core.logic意味着什么?

  27. 27

    语义版本控制和持续部署,在实践中是否存在冲突?

  28. 28

    PHP preg_ / u utf-8开关-不了解它在实践中的作用

  29. 29

    JavaScript类,如何在实践中应用“关注分离”和“不要重复自己”(DRY)

热门标签

归档