作家
登录

基于C++ 语言库的GCC和Clang编译器基准测试报告(ETL)

作者: 来源: 2017-09-01 13:02:45 阅读 我要评论

大年夜我应用 C++ 代码完成了不合编译器的基准测试到如今,已经有一段时光了。因为我比来宣布了 ETL 项目标 1.1 版(一个具有表达式模板的优化矩阵/向量计算库),所以我决定应用它作为我的基准测试的基版本。它是一个带有大年夜量模板的 C++ 14 库。我要编译完全的测试套件(124 个测试用例)。这是直接在最新版本(1.1)的代码上完成的。我将在调试模式下编译一次,并在 release_debug(release + debug 符号和断言)下进行一次编译,并记录每个编译器的履行时光。该测试将应用支撑 ETL 中的每个选项的设备进行编译,以此计算最大年夜的编译时光。每次编译都应用四个线程(make -j4)。 我还做了一些基准测试,以懂得每个编译器生成的代码间的运行时的机能差别。基准测试将编译为宣布模式,并记录撇哙译时光。

基于C++ 说话库的GCC和Clang编译器基准测试申报(ETL)

我将测试以下编译器:

  • GCC-4.9.4
  • GCC-5.4.0
  • GCC-6.3.0
  • GCC-7.1.0
  • clang-3.9.1
  • clang-4.0.1
  • zapcc-1.0 (贸易版,基于 clang-5.0 主分支)

所有这些都是直接应用 Portage(Gentoo 软件担保理器)安装的,除了大年夜源代码安装的 clang-4.0.1 以及没有 Gentoo 软件包的 zapcc。因为 Gentoo 上的 clang 包不支撑多过程,所以我不得不大年夜源代码中安装一个版本,大年夜担保理器中安装另一个版本。这也是我测试较少版本的 clang 的原因,更实用点。

为了实现这些测试的目标,所有编译器都应用了完全雷同的选项。平日,我在 clang 上应用比 GCC 更多不合的选项(主如果推敲到在 clang 上更严格的向量化选项)。这可能不会使得每个编译器达到最佳机能,但可以对应用默认优化级其余输出之间进行比较。以下是应用的重要选项:

  • 调试模式下: -g
  • 宣布+调试模式下: -g -O2
  • 宣布模式下: -g -O3 -DNDEBUG -fomit-frame-pointer

每种情况都启用了很多警告,ETL 选项也是一样的。

所有的测试结不雅都是运行在 Intel Core i7-2600(Sandy Bridge ...)@ 3.4GHz 上的 Gentoo 机械上收集的,该机械具有 4 核和 8 线程、12G 的 RAM 和一个 SSD。我尽可能地大年夜干扰项平分别出基准数据,并且我的基准代码是相当健全的,然则有些结不雅可能并不完全精确。此外,一些基准测试是在应用多线程,这可能会增长一些干扰和弗成猜测性。当我对测试结不雅不太确准时,我会多次运行基准测试以对此确认,并且总体而言,我对结不雅很有信念。

编译时光

让我们大年夜编译器自身的机能结不雅开端:

注: 在 Release_Debug 和 Benchmark,我对 zapcc 只应用了三个线程, 因为 12Go 的内存对于四个线程并不足够。

即使是最大年夜的 vector,一旦向量化和并行化之后,这也是一个异常快速的操作。以这种速度,不雅察到的一些差别可能不是很重要。再次,基于 clang 的版本是这段代码中最快的版本,但差别照样很小。在 gcc-7.1 中似乎还有一点回归,但这也是相当小的。

不合的编译器之间有一些异常重要的差别。总地来说,clang-4.0.1 是迄今为止调试模式下最快的免费编译器。然而,当测试代码被添加优化选项加以编译,clang 就落后了。在调试模式和宣布模式下,clang-4.0.1 比 clang-3.9.1 快得多,这一点令人印象深刻。在这一点上 clang 团队干得不错!这些优化,使得 clang-4.0.1 在宣布模式下几乎与 gcc-7.1 等分秋色。对于 GCC 来说,优化的成本似乎一向在明显地上升。然而, GCC 7.1 似乎使得优化加快,也使得标准编译快了很多。如不雅我们推敲 zapcc,这是调试模式下最快的编译器,但它的速度在宣布模式下比几个 gcc 版本要慢。

总地来说,我对 clang-4.0.1 的机能印象深刻,它看起来真快!在不久的将来,我必定会用这个新版本做更多的测试。看到 g++-7.1 的编译速度确切快于 gcc-6.3,也同样令人欣慰。然而,对优化而言,最快的 gcc 版本仍然是 gcc-4.9.4 ,这已经是一个对 C++ 标准低支撑的老版本。

有趣的是,我们可以看到,gcc-7.1 在少量数据时是最快的,而 clang-4.0 最合适生成较大年夜数据时的代码。然而,除了最大年夜的向量大年夜小,差别并不是很明显。显然,zapcc(或 clang-5.0)有一个回归,因为它比 clang-4.0 慢,并与 clang-3.9 雷同速度。

运行时机能

如今来看看生成的代码的质量。对于一些基准测试,我已经包含了两个版本的算法。 std 是最简单的算法(原始版),vec 是手工向量化和优化的实现版本。所有的测试都是在单精度浮点上完成的。

点乘

运行的第一个基准是计算两个向量之间的点积。让我们先看看原始版的机能:

基于C++ 说话库的GCC和Clang编译器基准测试申报(ETL)

不合的编译器之间的差别不是很大年夜。基于 clang 的编译器似乎是生成速度最快代码的编译器。有趣的是,gcc-6.3 似乎在大年夜数据量的容器中有一个很大年夜的机能衰减,但在 gcc-7.1 中已经解决了。

基于C++ 说话库的GCC和Clang编译器基准测试申报(ETL)

如不雅我们查看竽暌古化版本的结不雅,个中差别更小。同样,基于 clang 的编译器生成的可履行文件是最快的,但矫?嗽讼奘后的是 gcc,除了 gcc-6.3 之外,我们仍然可以看到与之前雷同的机能阑珊。


  推荐阅读

  用HTTP方式执行异步任务HTQ

HTQ 具体介绍我们在编写法度榜样时,有时会碰到须要用到异部队列的情况。比如说,我发送一万封邮件,如不雅纯真应用一个for轮回来发送,则履行时光要很长,要等良久才能发完,同时很轻易导>>>详细阅读


本文标题:基于C++ 语言库的GCC和Clang编译器基准测试报告(ETL)

地址:http://www.17bianji.com/lsqh/37093.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)