iPhone GCC / LLVM GCC或LLVM?

20

我在这里向专家们提问...

有人对哪个编译器最适合iPhone应用程序做过性能测试吗?

因为我们可以选择以下几种:

  • GCC 4.2
  • LLVM GCC 4.2
  • LLVM编译器1.5

我想知道这三个中哪一种提供的性能最好...

我自己做了一些快速测试,但没有发现什么大的区别?

你正在使用哪个编译器?


Clang是由苹果公司制作的,iPhone也是由苹果公司制作的。听起来LLVM-Clang应该取代LLVM-GCC(至少从长远来看)。:) - Johannes Schaub - litb
4
Clang不是由苹果公司开发的,它是LLVM项目的一部分。而且苹果公司也不是LLVM的开发者。 - jer
@jer,从我所看到的来看,它主要是由苹果公司开发的。只不过它恰好是开源的,并由LLVM项目托管,因此许多其他人也会加入并提供帮助。不过我很想知道苹果和社区在其中所占的比例是多少。 - Johannes Schaub - litb
苹果公司做出了巨大的贡献,但这并不是由苹果公司制造的。 - jer
1
@jer - 虽然苹果公司并非创造了LLVM,但是Chris Lattner现在是苹果公司的员工,他们一直像WebKit一样推动着LLVM的发展。 - Brad Larson
4
他们在 #llvm 说,超过90%的Clang代码是由苹果公司制作的。 - Johannes Schaub - litb
5个回答

11
如果您观看WWDC 2010会话视频 300,开发者工具国情咨文,您将会看到苹果公司报告称使用LLVM编译器构建的应用程序相比GCC有显著的性能提升(在某些情况下高达60%)。使用Clang解析器与LLVM编译器可以实现更多的改进。如果您拥有的话,还可以观看WWDC 2009年关于LLVM的会话内容。请观看312号会话-“LLVM编译器的新功能”,以及有关LLVM的其他会话。
我在我的一个应用程序中从GCC转向LLVM 1.5,看到了20%的速度提升,但这不是一个严格的测试,所以只能作为个人经验。
我的建议是如果可能的话,请使用Clang + LLVM(LLVM编译器1.5),以获取更快的构建时间、更高效的应用程序和更好的编译器错误处理。如果您使用C++代码或其他Clang解析器目前无法处理的内容,请使用LLVM GCC仍然可以在编译后的应用程序中获得性能优势。只有在某些情况下失败时才转向GCC。在您的构建设置中进行简单的切换即可免费获得额外的性能提升。
随着Xcode 4一起发布的LLVM编译器2.0已经完全支持C++,并承诺为编译后的应用程序提供额外的优化和更多的编译时间加速。Xcode 4甚至将Clang作为IDE中的语法高亮/代码纠正引擎。苹果公司正在朝着编译器的方向前进,这一点是很清楚的。

3

我不知道iPhone的性能如何,但在其他基准测试中,Clang通常编译速度更快,但生成的代码比GCC慢。Clang的错误消息也比GCC更好。因此,在开发中最好使用Clang,并在最终生产构建时切换到GCC。如果选择这种方法,请确保拥有良好的QA周期或构建系统,也会构建和测试GCC构建,以便您在最后不会遇到任何令人讨厌的编译器相关问题。

Clang中的C++支持略逊于GCC(更多的C++代码已经经过了针对GCC的怪癖的测试和调整),因此,如果您需要使用大量的C++,GCC可能是更好的选择。

实际上,您需要选择最适合您需求的编译器。基准测试和其他人的结果可以为您提供考虑的指标,但每个程序都不同,因此最好的方法是在不同的编译器上对自己的程序进行基准测试,看哪个最适合您。


2

我使用的是LLVM GCC 4.2。

Clang在处理C++方面表现不佳,它仍然是一个正在开发中的工具包。它非常有前途,但目前(根据我的经验),它还不够稳定,无法用于生产。

苹果公司明显正在投资于Clang作为未来的编译器,但这不是一个简单的项目。不幸的是,这让我们中的很多人处于一个奇怪的境地,要么使用一个相对较旧的编译器,要么使用一个非常新的编译器(猜猜我需要多少年才能开始在我的代码库中使用c++0x的特性)。

自从可用以来(至少在测试期间),我一直在我的代码库中使用GCC前端与LLVM后端。它已经公开可用多年了,而且相当稳定。我发现LLVM pass生成的可执行文件比单独使用GCC更小、更快(尽管我更多地针对OS X而不是iOS)。老实说,我不能只用Clang编译足够的代码来推荐它(而且我有很多C++代码)。

我发现GCC+LLVM组合很可靠。如果您主要关注的是可靠性:先使用GCC,在开发过程中定期测试+LLVM,并在每个Clang版本发布时进行编译和测试,直到您满意为止。GCC+LLVM通常可用于今天的生产构建。

如果您关心速度,请从GCC+LLVM开始,并定期使用Clang进行测试(如果这对您来说是一个选择——对我来说不是——因为有太多的C++代码)。

关于Clang的解析/词法分析/生成:Clang旨在极度符合标准。他们做得很好,但有许多新功能或不存在的功能,这就是为什么我建议您要小心,特别是在处理C++方面。

我认为苹果已经明确了他们未来的首选编译器,所以......不要等太久才测试Clang。


1

0

使用clang 1.5的C++前端不是最好的选择,如果你必须处理任何C++代码(包括Objective-C++代码),我通常建议避免使用它。此外,当使用clang时,我遇到了一些弱连接问题,所以在我看来,如果你必须处理上述两种情况之一,它还没有准备好用于生产。

话虽如此,我没有注意到两者之间的性能有任何真正的影响,尽管clang的错误和警告远比gcc的有用得多。

值得思考。


这个答案可能会解决你在LLVM 1.5中遇到的弱链接问题:https://dev59.com/W3A75IYBdhLWcg3waIMJ#3314079 - Brad Larson
是的,我知道,我不想用解决方案分散太多注意力,因为这些问题可能还没有被原帖作者遇到。 :) - jer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接