比 C++ 更快的语言 [关闭]
-
03-07-2019 - |
题
据说Blitz++提供 接近 Fortran 的性能.
对于同等任务,Fortran 实际上比常规 C++ 更快吗?
其他具有出色运行时性能的 HL 语言又如何呢?我听说过一些语言在某些任务上优于 C++...目标 Caml、Java、D...
我猜GC可以写很多代码 快点, ,因为它消除了在堆栈周围进行过多复制的需要?(假设代码是 不是 为性能而写)
我出于好奇而问——我一直认为 C++ 几乎是无与伦比的,除非有专家 ASM 编码。
解决方案
对于纯数字代码,Fortran更快,几乎总是比C ++更好。 Fortran更快的原因有很多。它是最古老的编译语言(优化编译器方面的许多知识)。它仍然是数值计算的语言,因此许多编译器供应商以销售优化编译器为生。还有其他更多技术原因。 Fortran(好吧,至少Fortran77)没有指针,因此没有混淆问题,这会困扰该域中的C / C ++语言。许多高性能库仍在Fortran中编码,历史悠久(> 30年)。 C或C ++都没有任何好的数组结构(C级太低,C ++拥有与地球上编译器一样多的数组库,它们彼此不兼容,从而阻止了经过良好测试的快速代码池。) p>
其他提示
Fortran 是否比 C++ 更快是一个有争议的问题。有的说可以,有的说不行;我不会讨论这个。这取决于编译器、运行它的架构、算法的实现......ETC。
哪里fortran 确实有 与 C 相比,一个很大的优势是实现这些算法所需的时间。这使得它非常适合任何类型的数值计算。我将阐述相对于 C 的一些明显优势:
- 基于 1 的数组索引(在实现更大的模型时非常有用,并且您不必考虑它,而只需 公式翻译
- 有一个幂运算符(
**
) (天哪,谁的想法是幂函数就可以了?而不是操作员?!) - 我想说它是对当前市场上所有语言的多维数组的最佳支持(而且似乎不会这么快改变) -
A(1,2)
就像数学一样 - 更不用说避免循环 - A=B*C 乘以数组(几乎类似于 matlab 语法 编译速度)
- 它具有内置的并行功能 进入语言 (查看这一项的新标准)
- 非常容易与 C、Python 等语言连接,因此您可以在 Fortran 中进行繁重的计算,而..任何 ...如果您愿意的话,可以用您选择的语言
- 完全向后兼容(因为整个 F77 是 F90 的子集),因此您可以使用整个世纪的编码
- 非常非常便携 (这可能不适用于某些编译器扩展,但总的来说它的作用就像一个魅力)
- 面向问题的解决社区(因为 Fortran 用户通常不是计算机科学,而是数学、物理、工程师......没有编程经验,但有解决问题经验的人,他们的知识 你的 问题可能非常有帮助)
现在我脑子里想不出任何其他的事情,所以只能用这个了。
FORTAN通常比C ++更快地进行数组处理,因为语言实现数组的方式不同 - FORTRAN不允许数组元素的别名,而C ++则不然。这使FORTRAN编译器工作更容易。此外,FORTRAN有许多非常成熟的数学库已经使用了近50年--C ++已经有那么久了!
这在很大程度上取决于编译器,程序员,它是否具有gc并且可能变化太大。如果它直接编译为机器代码,那么期望在大多数情况下具有比解释更好的性能,但是在你拥有asm速度之前可以进行有限的优化。
如果有人说fortran稍快一点,你会不会在那里编写一个新项目?
c ++的一点是它非常接近硬件级别。实际上,您可以在硬件级别进行编程(通过装配块)。一般来说,c ++编译器在优化方面做得非常好(为了提高速度,启用“链接时间代码生成”以允许在不同的cpp文件之间内联函数),但是如果你知道硬件并且知道 - 如何,您可以在汇编中编写一些工作速度更快的函数(尽管有时候,您无法击败编译器)。
您还可以实现自己的内存管理器(许多其他高级语言都不允许这样做),因此您可以根据您的特定任务自定义它们(可能大多数分配将是32字节或更少,那么你可以拥有一个32字节缓冲区的巨大列表,你可以在O(1)时间内分配/解除分配。我相信c ++ CAN可以胜过任何其他语言,只要你完全理解你正在使用的编译器和硬件。其中大部分归结为您使用的算法比什么都重要。
当您加载此页面时,您必须使用一些奇怪的托管XML解析器。 :)
我们不断地对代码进行分析,并且获得的是一致的(这不是天真的C ++,它只是具有嘘声的现代C ++)。它总是将任何CLR实现至少2倍,通常为5倍或更多。比Java时间好一点,它的速度提高了大约20倍,但你仍然可以找到好的实例并简单地消除所有的System.Object膨胀,并明显地将它击败成纸浆。
托管开发人员没有得到的一件事是,硬件架构反对任何VM和对象root aproach的扩展。你必须看到它相信它,坚持下去,启动浏览器并转向像Silverlight这样的“瘦”虚拟机。你会觉得它有多慢,而且CPU很饿。
两个,用于任何性能的数据库应用程序,是托管vs本机数据库。
我几分钟前写过:
通常算法不是决定你最终会遇到的表演棒球的语言。
在这个大球场内,优化编译器通常可以产生比大多数汇编编码器更好的代码。
这可能是“常识”。每个人都可以鹦鹉学舌,但我提出这可能是因为它是正确的。我等待相反的具体证据。
这一切都取决于编译器,例如Stalin Scheme编译器,它几乎击败了Debian微基准套件中的所有语言,但他们是否提到了有关编译时间的任何内容?
不,我怀疑(之前我没有使用过Stalin)编译基准测试(i所有最大努力级别的优化)除了最小的代码之外,还需要很长的时间。
编译语言的性能是一个无用的概念:重要的是编译器的质量,即它能够应用的优化。例如,经常 - 但不总是 - 英特尔C ++编译器产生比g ++更好的代码。那么如何衡量C ++的性能呢?
语言语义的来源是程序员让编译器创建最佳输出是多么容易。例如,并行化Fortran代码通常比C代码更容易,这就是Fortran仍然大量用于高性能计算(例如气候模拟)的原因。
正如问题和一些答案提到汇编程序:这里也是如此,它只是另一种编译语言,因此本身并不“更快”。汇编程序和其他语言之间的区别在于程序员 - 理想情况下对程序有绝对的了解 - 负责所有的优化,而不是将其中的一些委托给'哑'编译器。
例如,汇编程序中的函数调用可能使用寄存器来传递参数,而不需要创建不必要的堆栈帧,但是一个好的编译器也可以这样做(想想内联或快速调用)。使用汇编程序的缺点是更好的执行算法更难实现(想想线性搜索与二进制搜索,哈希表查找......)。
比C ++做得更好,主要是让编译器理解程序员的意思。这方面的一个例子可能是任何语言的编译器推断出代码区域独立于其输入并且只是在编译时计算结果值的实例。
另一个例子是C#如何生成一些非常高性能的代码,因为编译器知道什么是特定的咒语'并且可以巧妙地使用产生最高性能的实现,其中将相同程序的音译转换为C ++导致不必要的分配/删除周期(由模板隐藏),因为编译器正在处理一般情况,而不是这段代码给出的特定情况。
最后一个例子可能是C的Brook / Cuda改编版,专为异国情调的硬件而设计,不再那么具有异国情调。该语言支持映射到正在编译的非von-neuman硬件的确切原语(内核函数)。
这就是您使用托管浏览器的原因吗?因为它更快。或管理操作系统,因为它更快。不,坚持下去,它是SQL数据库..等等,它一定是你正在玩的游戏。停下来,必须有一段数字代码Java和Csharp坦率地说没用。顺便说一句,你必须检查你的VM写的是什么来使用root语言并说它很慢。
多么误解,但嘿告诉我一个快速管理的应用程序,所以我们都笑了。 VS?开发办公室?
哦,你的意思是执行速度?
即便如此,如果从第一行代码中抽出时间到第一次执行代码结束,C#仍然可能比C ++更快。
这是一篇非常有趣的文章,关于将C ++程序转换为C#以及使C ++比C#更快的努力。
因此,如果考虑到开发速度,几乎所有东西都胜过C ++。
好的,要解决OP的运行时唯一的性能要求:这不是语言,而是确定运行时性能的语言的实现。我可以编写一个C ++编译器来生成可以想象的最慢代码,但它仍然是C ++。从理论上讲,编写一个针对IA32指令而不是Java VM字节代码的Java编译器也是可行的,从而提高了运行时速度。
代码的性能取决于语言优势与代码要求之间的匹配程度。例如,一个执行大量内存分配/释放的程序将在一个天真的C ++程序中表现不佳(即使用默认的内存分配器),因为C ++内存分配策略过于通用,而C#的基于GC的分配器可以表现得更好(如上面的链接显示)。字符串操作在C ++中很慢,但在php,perl等语言中很快。
啊......好老问题 - 哪个编译器可以生成更快的代码?
-
只在代码中实际花费很多时间在调用堆栈的底部,即不包含函数调用的热点,例如矩阵求逆等。
-
(隐含1)它只在编译器实际看到的代码中很重要。如果你的程序计数器花在你没有构建的第三方库中的所有时间,那没关系。
-
在重要的代码中,一切都取决于哪个编译器能够提供更好的ASM,而这很大程度上取决于编写源代码的智能或愚蠢程度。
醇>
对于所有这些变量,很难区分好的编译器。
但是,正如所说的,如果您有很多Fortran代码要编译,请不要重写它。