C语言程序比汇编程序效率低是哪些方面造成的?

时间:2021-01-06 01:17:36
C语言程序比汇编程序效率低是哪些方面造成的?

23 个解决方案

#1


更高的抽象.编译器能力问题

#2


引用 1 楼  的回复:
更高的抽象.编译器能力问题

UP

#3


月接近机器硬件的方法就越能更有效地利用机器硬件,越接近人的方法就越能更有效地利用人力资源。C语言则是二者之间的一个平衡点。比汇编语言它要更方便很多,更接近人类思维模式很多;比高级语言则它要快捷很多,更体贴机器很多。

#4


写的烂的汇编语言程序还不如写的好的C语言程序。

#5


书写的语言不规范。假如你写程序以编译器比较容易识别的语法,那么翻译后的汇编语言也非常的高效,否则非常冗余

#6


编译器优化已经做得够好了,很少时候需要写汇编

#7


汇编程序效率的保证同样依赖于程序员的水平

#8


关键是程序员

#9


引用 3 楼  的回复:
月接近机器硬件的方法就越能更有效地利用机器硬件,越接近人的方法就越能更有效地利用人力资源。C语言则是二者之间的一个平衡点。比汇编语言它要更方便很多,更接近人类思维模式很多;比高级语言则它要快捷很多,更体贴机器很多。



编程语言越高级,翻译成机器码的步骤就越多,效率就越低

#10


不是因为步骤多少,而是因为无法找到最适合于机器的映射。高级语言里很多东西距离机器太远了。

#11


------------- 编译-------

#12


现在的c/c++编译器编译出来的汇编码非常高效了。

#13


1. 编译器将C语言自动翻译成机器码;编译器再智能、再强大,还是会产生冗余;这些冗余就是造成比汇编慢的主要原因

2. 对于汇编来说,由汇编产生的机器码,几乎没有冗余,因为汇编指令和机器码是严格的一一对应的,这就是汇编比C快的主要原因。

3. 每个语言都有不同的一些特点,关键要看语言本身和机器指令的耦合程度,如果耦合度越高,相对来说效率就越高,这个和语言是否接近硬件本身没有必然的联系。举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

#14


引用 13 楼  的回复:
1. 编译器将C语言自动翻译成机器码;编译器再智能、再强大,还是会产生冗余;这些冗余就是造成比汇编慢的主要原因

2. 对于汇编来说,由汇编产生的机器码,几乎没有冗余,因为汇编指令和机器码是严格的一一对应的,这就是汇编比C快的主要原因。

3. 每个语言都有不同的一些特点,关键要看语言本身和机器指令的耦合程度,如果耦合度越高,相对来说效率就越高,这个和语言是否接近硬件本身没有必然的联系。……
c语言的冗余有哪些呢?

#15


是汇编语言的冗余吧。看看汇编语言繁多的指令吧,是C语言简化了它。

#16


引用 13 楼  的回复:
举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

Fortran因为行列排列和C不同,更符合内存排列(循环时需要注意,否则cache会miss)
还有Fortran默认是传地址的,语法规定比C要死,这几个方面更利于编译器的优化

当然注意这几点,C语言按照这个写法效能上也可以超越Fortran,而且C语言有inline形式,Fortran的inline太依赖于编译器的优化,如果Fortran编译器差一些,会在调用上造成很高损耗(现在仅有ivf/gfortran做的很好)。更不用说C可以内建汇编了。只不过C写出高性能计算的东西比Fortran晦涩一些。

反正都和程序员有关。

#17


汇编主要用寄存器进行存储和计算,C主要用内存进行存储和计算。

#18


13楼所说的冗余不是指的指令多少,而是有没有做不必要的事情。汇编语言是直接表达的机器指令,写出的程序可以做到没有任何冗余。而C语言毕竟是进行了抽象,在具体化的过程中无论如何也没法完全避免冗余的出现。

好在C语言抽象的程度不高,所以编译出来的代码还是很高效的。相比之下有些高级语言编译出的代码就有点惨不忍睹了。但那些语言更加接近人类思维模式,在编写程序时的开发效率要比C语言高太多了。

#19


更加低层的汇编

#20


引用 16 楼  的回复:
引用 13 楼  的回复:

举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

……
搞得我想好好学一下fortran了,请问windows下学习fortran用什么开发工具?哪里有下载?

#21


fortran只有数值运算快,其它方面并不快。它本来就是被设计来翻译公式的,干这个很专业。

#22


引用 20 楼  的回复:
引用 16 楼  的回复:

引用 13 楼  的回复:

举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了……



intel 的 fortran 编译器,等一堆东西,很方便的。

#23


越底层的语言越接近硬件,越能更有效的利用机器资源,也就越快。

#1


更高的抽象.编译器能力问题

#2


引用 1 楼  的回复:
更高的抽象.编译器能力问题

UP

#3


月接近机器硬件的方法就越能更有效地利用机器硬件,越接近人的方法就越能更有效地利用人力资源。C语言则是二者之间的一个平衡点。比汇编语言它要更方便很多,更接近人类思维模式很多;比高级语言则它要快捷很多,更体贴机器很多。

#4


写的烂的汇编语言程序还不如写的好的C语言程序。

#5


书写的语言不规范。假如你写程序以编译器比较容易识别的语法,那么翻译后的汇编语言也非常的高效,否则非常冗余

#6


编译器优化已经做得够好了,很少时候需要写汇编

#7


汇编程序效率的保证同样依赖于程序员的水平

#8


关键是程序员

#9


引用 3 楼  的回复:
月接近机器硬件的方法就越能更有效地利用机器硬件,越接近人的方法就越能更有效地利用人力资源。C语言则是二者之间的一个平衡点。比汇编语言它要更方便很多,更接近人类思维模式很多;比高级语言则它要快捷很多,更体贴机器很多。



编程语言越高级,翻译成机器码的步骤就越多,效率就越低

#10


不是因为步骤多少,而是因为无法找到最适合于机器的映射。高级语言里很多东西距离机器太远了。

#11


------------- 编译-------

#12


现在的c/c++编译器编译出来的汇编码非常高效了。

#13


1. 编译器将C语言自动翻译成机器码;编译器再智能、再强大,还是会产生冗余;这些冗余就是造成比汇编慢的主要原因

2. 对于汇编来说,由汇编产生的机器码,几乎没有冗余,因为汇编指令和机器码是严格的一一对应的,这就是汇编比C快的主要原因。

3. 每个语言都有不同的一些特点,关键要看语言本身和机器指令的耦合程度,如果耦合度越高,相对来说效率就越高,这个和语言是否接近硬件本身没有必然的联系。举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

#14


引用 13 楼  的回复:
1. 编译器将C语言自动翻译成机器码;编译器再智能、再强大,还是会产生冗余;这些冗余就是造成比汇编慢的主要原因

2. 对于汇编来说,由汇编产生的机器码,几乎没有冗余,因为汇编指令和机器码是严格的一一对应的,这就是汇编比C快的主要原因。

3. 每个语言都有不同的一些特点,关键要看语言本身和机器指令的耦合程度,如果耦合度越高,相对来说效率就越高,这个和语言是否接近硬件本身没有必然的联系。……
c语言的冗余有哪些呢?

#15


是汇编语言的冗余吧。看看汇编语言繁多的指令吧,是C语言简化了它。

#16


引用 13 楼  的回复:
举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

Fortran因为行列排列和C不同,更符合内存排列(循环时需要注意,否则cache会miss)
还有Fortran默认是传地址的,语法规定比C要死,这几个方面更利于编译器的优化

当然注意这几点,C语言按照这个写法效能上也可以超越Fortran,而且C语言有inline形式,Fortran的inline太依赖于编译器的优化,如果Fortran编译器差一些,会在调用上造成很高损耗(现在仅有ivf/gfortran做的很好)。更不用说C可以内建汇编了。只不过C写出高性能计算的东西比Fortran晦涩一些。

反正都和程序员有关。

#17


汇编主要用寄存器进行存储和计算,C主要用内存进行存储和计算。

#18


13楼所说的冗余不是指的指令多少,而是有没有做不必要的事情。汇编语言是直接表达的机器指令,写出的程序可以做到没有任何冗余。而C语言毕竟是进行了抽象,在具体化的过程中无论如何也没法完全避免冗余的出现。

好在C语言抽象的程度不高,所以编译出来的代码还是很高效的。相比之下有些高级语言编译出的代码就有点惨不忍睹了。但那些语言更加接近人类思维模式,在编写程序时的开发效率要比C语言高太多了。

#19


更加低层的汇编

#20


引用 16 楼  的回复:
引用 13 楼  的回复:

举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了这样说法,我自己没有验证)

……
搞得我想好好学一下fortran了,请问windows下学习fortran用什么开发工具?哪里有下载?

#21


fortran只有数值运算快,其它方面并不快。它本来就是被设计来翻译公式的,干这个很专业。

#22


引用 20 楼  的回复:
引用 16 楼  的回复:

引用 13 楼  的回复:

举个例子,C比Fortran更接近硬件,但做科学计算的时候,Fortran在大部分情况下要比C快,俺在学校读书的时候碰到大量的科学计算的时候(比如FFT之类的各种积分变换),同学们都是用Fortran来做的,当然那时候机器本身的性能还不行。不过就算到了今天,C在这方面的性能还是没有超过Fortran(前段时间,在某个杂志上看到了……



intel 的 fortran 编译器,等一堆东西,很方便的。

#23


越底层的语言越接近硬件,越能更有效的利用机器资源,也就越快。