对于没有CS背景的人(我的专业是应用数学),asm语言是否会获得陡峭的学习曲线?
通常,熟悉某些高级编程语言(如C / C ++等)的人需要多长时间才能编写至少可以进行线性回归,一维正交多项式计算等元素数学运算的asm程序? / p> 不过,现代的asm是否支持以下功能:
数学运算与SIMD指令
多线程和线程控制
通过使用一些最新优化的编译器在asm而不是C / C ++中执行此操作通常会获得很多性能提升?
答案 0 :(得分:4)
在汇编中,您需要了解处理器的工作原理,因为在编码时,您最终会以最有趣的方式操作处理器。
考虑一下:
if (val)goto next;
转换为以下内容:
mov eax, [val]
cmp eax, 0
je next
本质上,Assembly需要了解程序如何使用处理器执行任务。 EG:如何使用和使用寄存器(如eax)。
一般来说,通过C在asm中执行操作需要更长的时间。至于细节,我不知道。
一些现代指令集提供了新的数学运算,这些运算可能会也可能不会是你的追求。 多线程等是操作系统的作用,并没有与处理器有关,因此没有什么可以组装(这不是严格的,因为硬件多任务存在,但很少使用,但我离题了。)
通过优化的C / C ++编写ASM通常会获得很少的性能提升,除非您编写一小段重复的代码,而您需要花费大量时间进行优化。
答案 1 :(得分:1)
通过使用一些最新优化的编译器在asm而不是C / C ++中执行此操作通常会获得很多性能提升?
没有
编写asm会更困难,也更耗时:因为每个asm指令比HLL语句简单,所以需要更多的asm指令来实现相同的功能。在组装中书写具有额外的复杂性,例只有少数寄存器。
此外,有许多方法可以编写程序集来实现相同的功能:例如,mov eax,0
和xor eax,eax
同时将{0}写入eax
寄存器,但是一个比另一个。此外,asm指令序列对运行速度有所不同:如果匹配以保持several CPU pipelines忙,则非显而易见或更长的指令序列可能会更快。
编写最佳汇编是计算密集型的:根据循环计数,流水线算法等计算出各种可能性可能需要多长时间。这样的计算由优化编译器完成,它可以做得更好(更快,比你更准确。
http://www.amazon.com/Zen-Code-Optimization-Ultimate-Software/dp/1883577039是一个非常有趣的读物,但在本书的最后,它开始讨论奔腾级CPU,你可以看到写入最佳装配变得越来越复杂。
如果您对编译器的输出不满意,您可能会考虑使用更好的编译器:例如,英特尔的编译器生成(或至少用于生成)比其他许多编译器更优化,并且包括对特定CPU的更好支持,不寻常的操作码,可能有更好的运行时库等。