Moh*_*mad 12 performance programming-languages machine-code
例如,如果C#,Java或C++都编译为机器代码,为什么它们不具有同等性能?
我的理解是这些语言是机器代码的抽象,这是他们最终编译的内容.处理器不应该确定性能吗?
首先,C++优化器更加成熟.另一方面,性能一直是C++语言设计者的首要目标("你不为你不使用的东西买单"是口头禅,显然不能说Java的每个方法都是虚拟的政策).
除此之外,C++模板比Java或C#泛型更加优化友好.虽然JIT经常因其跨模块边界进行优化的能力而受到称赞,但是仿制药可以阻止这种死亡.CLR(.NET运行时)仅为通用生成一个版本的机器代码,涵盖所有引用类型.另一方面,C++优化器针对模板参数的每个组合运行,并且可以内联依赖调用.
接下来,使用C#和Java,您几乎无法控制内存布局.并行算法可能会因缓存行的错误共享而遭受一个数量级的性能下降,并且开发人员几乎没有任何事情可以做到这一点.OTOH C++提供了将对象放置在相对于RAM页面和缓存边界的特定偏移处的工具.
小智 6
考虑语言的差异和发生的开销 - 即使这样的额外工作"以相同的效率"完成,还有更多工作要做.期.(这是抽象通常带来的代价:开发时间可以[基本]减少,以适应运行时间的[适度]增长.)
另一方面,使用没有"语言特征"的简单函数,例如计算因子的循环......那么在某些情况下数字可以变得非常有竞争力.这可以在计算机语言基准游戏中看到(例如,这是Java7与C++).
请注意,应用语言(包括JIT)和优化("-Ox")的实现也是一个主要因素.(一种语言本身就可以说"没有速度".)
快乐的编码.
正如Voigt所指出的那样,JIT/AOT模型针对不同方面进行了优化.(该太阳 Oracle Java实现甚至有一个单独的服务器VM和客户端VM,每个VM都优先考虑不同的用例.)以下是一些讨论JIT与AOT的SO帖子:
"例如,如果C#,Java或C++最终都编译成机器代码,为什么它们不具备相同的性能?"
C#和Java都编译成字节码,最终由虚拟机(例如Java称为JVM)缩减为机器码.但是,C++通常最初编译为汇编级别.
虚拟机实际上可以在运行时执行某些优化(一个常见的例子是双态内联),但在其他情况下,增加的开销会对性能产生负面影响