语言比C ++更快

时间:2009-03-04 12:50:24

标签: c++ programming-languages performance

据说Blitz ++提供近Fortran性能

对于同等的任务,Fortran实际上往往比普通的C ++更快吗?

其他具有出色运行时性能的HL语言怎么样?我听说过几种语言在某些任务中使用C ++ ... Objective Caml,Java,D ...

我猜GC可以使代码更快,因为它不需要在堆栈周围进行过多的复制? (假设代码为性能而编写)

我的好奇心 - 我总是认为C ++几乎是无与伦比的专家ASM编码。

17 个答案:

答案 0 :(得分:54)

对于纯数字代码,Fortran更快,几乎总是比C ++更好。 Fortran更快的原因有很多。它是最古老的编译语言(优化编译器方面的许多知识)。它仍然是数值计算的语言,因此许多编译器供应商以销售优化编译器为生。还有其他更多技术原因。 Fortran(好吧,至少Fortran77)没有指针,因此没有混淆问题,这会困扰该域中的C / C ++语言。许多高性能库仍在Fortran中编码,历史悠久(> 30年)。 C或C ++都没有任何好的数组结构(C级太低,C ++拥有与地球上编译器一样多的数组库,它们彼此不兼容,从而阻止了经过良好测试的快速代码池。) p>

答案 1 :(得分:19)

fortran是否比c ++更快是一个讨论问题。有人说是,有人说不;我不会进入那个。这取决于编译器,运行它的体系结构,算法的实现......等等。

fortran 确实比C更具优势的是实现这些算法所需的时间。这使它非常适合任何类型的数值计算。我将陈述一些优于C的明显优势:

  • 基于1的数组索引(在实现大型模型时非常有用,您不必考虑它,只需 FORmula TRANslate
  • 有一个权力运算符(**)(上帝,他的想法是权力函数会做什么?而不是运算符?!
  • 它有,我说对当前市场上所有语言的多维数组的最佳支持(并且它似乎不会那么快改变) - A(1,2)就像在数学中一样
  • 更不用说避免循环 - A = B * C乘以数组(几乎就像matlab语法与编译速度
  • 它具有将内置于语言中的并行功能(检查此标准的新标准)
  • 非常容易与C,python这样的语言连接,所以你可以在fortran中进行繁重的计算,而无论如何...用你选择的语言,如果你有这种倾向
  • 完全向后兼容(因为整个F77是F90的子集)所以你有整整一个世纪的编码供你使用
  • 非常便携(这可能不适用于某些编译器扩展,但一般来说它就像魅力一样)
  • 以问题为导向的解决社区(因为fortran用户通常不是cs,而是数学,phy,工程师......没有编程的人,而是解决问题的人,他们对你的问题的知识可能非常有用)

现在不能想到其他任何事情,所以这将是必须的。

答案 2 :(得分:8)

Blitz ++正在与之竞争的不是Fortran语言,而是进入Fortran数学库的几个世纪的工作。在某种程度上,语言有所帮助:旧语言有更多的时间来优化编译器(而且,让我们面对它,C ++是最复杂的语言之一)。另一方面,像Blitz++uBLAS这样的高级C ++库允许您比相对低级的Fortran代码更清楚地陈述您的意图,并允许全新的编译时优化类。

然而,有效地使用任何库需要开发人员熟悉语言,库数学。您通常可以通过改进三个中的任何一个来获得更快的代码...

答案 3 :(得分:7)

FORTAN通常比C ++更快地进行数组处理,因为语言实现数组的方式不同 - FORTRAN不允许数组元素的别名,而C ++则不然。这使FORTRAN编译器工作更容易。此外,FORTRAN有许多非常成熟的数学库,已经有近50年的历史了--C ++还没那么久!

答案 4 :(得分:2)

当您加载此页面时,您必须使用一些奇怪的托管XML解析器。 :)

我们不断地对代码进行分析,并且获得的是一致的(这不是天真的C ++,它只是具有嘘声的现代C ++)。它总是将任何CLR实现至少2倍,通常为5倍或更多。比Java时间好一点,它的速度提高了大约20倍,但你仍然可以找到好的实例并简单地消除所有的System.Object膨胀,并明显地将它击败成纸浆。

托管开发人员没有得到的一件事是,硬件架构反对任何VM和对象root aproach的扩展。你必须看到它相信它,坚持下去,启动浏览器并转向像Silverlight这样的“瘦”虚拟机。你会觉得它有多慢,而且CPU很饿。

两个,用于任何性能的数据库应用程序,是托管vs本机数据库。

答案 5 :(得分:2)

这在很大程度上取决于编译器,程序员,它是否具有gc并且可能变化太大。如果它直接编译为机器代码,那么期望在大多数情况下具有比解释更好的性能,但是在你拥有asm速度之前可以进行有限的优化。

如果有人说fortran稍快一点,你会不会在那里编写一个新项目?

答案 6 :(得分:2)

c ++的一点是它非常接近硬件级别。实际上,您可以在硬件级别进行编程(通过装配块)。一般来说,c ++编译器在优化方面做得非常好(为了提高速度,启用“链接时间代码生成”以允许在不同的cpp文件之间内联函数),但是如果你知道硬件并拥有专有技术,您可以在汇编中编写一些工作速度更快的函数(尽管有时候,您无法击败编译器)。

您还可以实现自己的内存管理器(许多其他高级语言都不允许这样做),因此您可以根据您的特定任务自定义它们(可能大多数分配将是32字节或更少,那么你可以拥有一个32字节缓冲区的巨大列表,你可以在O(1)时间内分配/解除分配。我相信c ++ CAN可以胜过任何其他语言,只要你完全理解你正在使用的编译器和硬件。其中大部分归结为您使用的算法比什么都重要。

答案 7 :(得分:1)

通常算法不是决定你最终会遇到的表演棒球的语言。

在这个大球场内,优化编译器通常可以产生比大多数汇编编码器更好的代码。

Premature optimisation is the root of all evil

这可能是每个人都可以鹦鹉学舌的“常识”,但我提出这可能是因为它是正确的。我等待相反的具体证据。

答案 8 :(得分:1)

我几分钟前写过:

C++ string memory management

答案 9 :(得分:1)

在实际应用中,D有时可能比C ++更快,主要是因为垃圾收集的存在有助于避免使用智能指针时RAII和引用计数的开销。对于使用非平凡生命周期分配大量小对象的程序,垃圾收集可以比C ++样式的内存管理更快。此外,D的内置数组允许编译器在某些情况下执行比C ++的STL向量更好的优化,编译器无法理解。此外,D2支持不可变数据和纯函数注释,最近版本的DMD2基于此进行优化。 D的创造者Walter Bright在D和C ++中编写了一个JavaScript解释器,根据他的说法,D版本更快。

答案 10 :(得分:0)

如果代码不是为性能编写的那么C# is faster than C++

必要的免责声明:所有基准都是邪恶的。

这是基准in favour of C++

以上两个链接表明我们可以找到C ++比C#更快的情况,反之亦然。

答案 11 :(得分:0)

这就是您使用托管浏览器的原因吗?因为它更快。或管理操作系统,因为它更快。不,坚持下去,它是SQL数据库..等等,它一定是你正在玩的游戏。停下来,必须有一段数字代码Java和Csharp坦率地说没用。顺便说一句,你必须检查你的VM写的是什么来使用root语言并说它很慢。

多么误解,但嘿告诉我一个快速管理的应用程序,所以我们都可以大笑。 VS?开发办公室?

答案 12 :(得分:0)

比C ++做得更好,主要是让编译器理解程序员的意思。这方面的一个例子可能是任何语言的编译器推断出代码区域独立于其输入并且只是在编译时计算结果值的实例。

另一个例子是C#如何产生一些非常高性能的代码,因为编译器知道什么是特定的咒语'并且可以巧妙地使用产生最高性能的实现,其中将相同程序的音译转换为C ++导致不必要的分配/删除周期(由模板隐藏),因为编译器正在处理一般情况,而不是这段代码给出的特定情况。

最后一个例子可能是C的Brook / Cuda改编版,专为异国情调的硬件而设计,不再那么具有异国情调。该语言支持映射到正在编译的非von-neuman硬件的确切原语(内核函数)。

答案 13 :(得分:0)

C#比C ++快得多 - 在C#中我可以编写一个XML解析器和数据处理器,这是我编写C ++所用的十分之一。

哦,你的意思是执行速度?

即便如此,如果从第一行代码中抽出时间到第一次执行代码结束,C#仍然可能比C ++更快。

This is a very interesting article关于将C ++程序转换为C#以及使C ++比C#更快所需的工作量。

因此,如果考虑到开发速度,几乎所有东西都胜过C ++。

好的,要解决OP的运行时唯一的性能要求:这不是语言,而是确定运行时性能的语言的实现。我可以编写一个C ++编译器来生成可以想象的最慢代码,但它仍然是C ++。从理论上讲,编写一个针对IA32指令而不是Java VM字节代码的Java编译器也是可行的,从而提高了运行时速度。

代码的性能取决于语言优势与代码要求之间的匹配程度。例如,一个执行大量内存分配/释放的程序将在一个天真的C ++程序中表现不佳(即使用默认的内存分配器),因为C ++内存分配策略过于通用,而C#的基于GC的分配器可以表现得更好(如上面的链接显示)。字符串操作在C ++中很慢,但在php,perl等语言中很快。

答案 14 :(得分:0)

编译语言的性能是一个无用的概念:重要的是编译器的质量,即它能够应用的优化。例如,经常 - 但不总是 - 英特尔C ++编译器产生比g ++更好的代码。那么如何衡量C ++的性能呢?

语言语义的来源是程序员让编译器创建最佳输出是多么容易。例如,并行化Fortran代码通常比C代码更容易,这就是Fortran仍然大量用于高性能计算(例如气候模拟)的原因。


正如问题和一些答案提到汇编程序:这里也是如此,它只是另一种编译语言,因此本身并不“更快”。汇编程序和其他语言之间的区别在于程序员 - 理想情况下对程序有绝对的了解 - 负责所有的优化,而不是将其中的一些委托给'哑'编译器。

例如,汇编程序中的函数调用可能使用寄存器来传递参数,而不需要创建不必要的堆栈帧,但是一个好的编译器也可以这样做(想想内联或快速调用)。使用汇编程序的缺点是更好的执行算法更难实现(想想线性搜索与二进制搜索,哈希表查找......)。

答案 15 :(得分:0)

这一切都取决于编译器,例如Stalin Scheme编译器,它几乎击败了Debian微基准套件中的所有语言,但他们是否提到了有关编译时间的任何内容?

不,我怀疑(之前我没有使用过Stalin)编译基准测试(i所有最大努力级别的优化)除了最小的代码之外,还需要很长的时间。

答案 16 :(得分:-1)

啊......好老问题 - 哪个编译器可以生成更快的代码?

  1. 只在代码中实际上花费很多时间在调用堆栈的底部,即不包含函数调用的热点,例如矩阵求逆等。

  2. (隐含1)它只在编译器实际看到的代码中很重要。如果你的程序计数器花在你没有构建的第三方库中的所有时间,那没关系。

  3. 在重要的代码中,一切都取决于哪个编译器能够提供更好的ASM,而这很大程度上取决于编写源代码的智能或愚蠢程度。

  4. 对于所有这些变量,很难区分好的编译器。

    但是,正如所说的,如果您有很多Fortran代码要编译,请不要重写它。