- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
5年前关闭。
Improve this question
我目前正在使用 GCC,但我最近发现了 Clang,我正在考虑切换。但是有一个决定性因素 - 它生成的二进制文件的质量(速度、内存占用、可靠性) - 如果 gcc -O3
可以生成运行速度提高 1% 的二进制文件,或者 Clang 二进制文件占用更多内存或者只是由于编译器错误而失败,这是一个交易破坏者。
Clang 拥有比 GCC 更好的编译速度和更低的编译时内存占用,但我真的对生成的编译软件的基准/比较很感兴趣 - 你能给我指出一些或描述你的经验吗?
最佳答案
以下是我对 GCC 4.7.2 的一些最新发现,尽管范围很窄
和 C++ 的 Clang 3.2。
更新:下面附上 GCC 4.8.1 v clang 3.3 比较。
更新:附加了 GCC 4.8.2 v clang 3.4 比较。
我维护一个 OSS 工具,它是为 Linux 构建的,带有 GCC 和 Clang,
并使用 Microsoft 的 Windows 编译器。工具 coan 是一个预处理器
和 C/C++ 源文件和代码行的分析器:它的
递归下降解析和文件处理的计算配置文件专业。
开发分支(这些结果与之相关)
目前在大约 90 个文件中包含大约 11K LOC。它被编码,
现在,在具有丰富多态性和模板的 C++ 中,但仍然
由于其在 C 中被黑客入侵的不远的过去,它陷入了许多补丁中。
没有明确利用移动语义。它是单线程的。一世
没有投入大量精力去优化它,而“架构”
仍然如此主要的待办事项。
我在 3.2 之前使用 Clang 作为实验编译器
因为,尽管它具有卓越的编译速度和诊断能力,
C++11 标准支持落后于当代 GCC 版本
科恩行使的尊重。在 3.2 中,这个差距已经缩小。
我的 Linux 测试工具大致适用于当前的 coan 开发过程
70K 源文件混合了一个文件解析器测试用例,压力
测试消耗 1000 个文件,场景测试消耗 < 1K 文件。
除了报告测试结果外,线束还会累积和
显示消耗的文件总数和 coan 消耗的运行时间
(它只是将每个 coan 命令行传递给 Linux time
命令和
捕获并累加报告的数字)。时机受宠若惊
事实上,任何需要 0 个可测量时间的测试都将
全部加起来为 0,但此类测试的贡献可以忽略不计。这
计时统计信息显示在 make check
的末尾像这样:
coan_test_timer: info: coan processed 70844 input_files.
coan_test_timer: info: run time in coan: 16.4 secs.
coan_test_timer: info: Average processing time per input file: 0.000231 secs.
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.7.2 | 231 | 237 |0.97 |
----------|-----|-----|-----|
Clang-3.2 | 234 | 186 |1.25 |
----------|-----|-----|------
GCC/Clang |0.99 | 1.27|
std::unique_ptr<X>
如果
std::shared_ptr<X>
.对
std::unique_ptr
的偏见曾是
std::unique_ptr
看起来像更换的钳工选项
std::auto_ptr
在 C++11 变体对我来说是新事物的时候。
std::shared_ptr<X>
当我打算 build
std::unique_ptr<X>
,
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.7.2 | 234 | 234 |1.00 |
----------|-----|-----|-----|
Clang-3.2 | 188 | 187 |1.00 |
----------|-----|-----|------
GCC/Clang |1.24 |1.25 |
std::shared_ptr<X>
- 为了工作。
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.1 | 442 | 443 |1.00 |
----------|-----|-----|-----|
Clang-3.3 | 374 | 370 |1.01 |
----------|-----|-----|------
GCC/Clang |1.18 |1.20 |
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.2 | 428 | 428 |1.00 |
----------|-----|-----|-----|
Clang-3.4 | 390 | 365 |1.07 |
----------|-----|-----|------
GCC/Clang | 1.1 | 1.17|
-O2
和
-O3
在大多数情况下无关紧要的利润率
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.2 | 210 | 208 |1.01 |
----------|-----|-----|-----|
Clang-3.4 | 252 | 250 |1.01 |
----------|-----|-----|------
GCC/Clang |0.83 | 0.83|
-O2
优化 Clang 的 619 构建比其 301 构建快 46%:在 -O3
叮当的-O3
优化-O3
中获得有意义的 yield . 关于optimization - Clang vs GCC - 哪个产生更快的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187414/
我正在尝试将谷歌地图集成到 Xamarin Android。但是,如标题中所写,收到错误。此错误出现在我的 SetContentView (Resource.Layout.Main); 上,如下所示:
在 Delphi 中如何以非文本模式打开二进制文件?类似于 C 函数 fopen(filename,"rb") 最佳答案 有几个选项。 1。使用文件流 var Stream: TFileStrea
我现在正在处理一个问题,如下所示: 有两个数字 x1 和 x2 并且 x2 > x1。 例如 x1 = 5; x2 = 10; 而且我必须在二进制表示中找到 x1 和 x2 之间的总和。 5 = 10
我有这个“程序集”文件(仅包含 directives ) // declare protected region as somewhere within the stack .equiv prot_s
有没有办法在powershell中确定指定的文件是否包含指定的字节数组(在任何位置)? 就像是: fgrep --binary-files=binary "$data" "$filepath" 当然,
我是一名工程师,而不是软件程序员,所以请原谅我的无知。 我编写了一个 Delphi(7SE) 程序,用于从连接到两个数字温度计的 USB 端口读取“真实”数据类型。 我已经完成了该计划的大部分内容。
我有一些代码,例如: u=(float *)calloc(n, sizeof(float)); for(i=1; i
typedef struct pixel_type { unsigned char r; unsigned char g; unsigned char b;
如何判断二进制数是否为负数? 目前我有下面的代码。它可以很好地转换为二进制文件。转换为十进制时,我需要知道最左边的位是否为 1 以判断它是否为负数,但我似乎无法弄清楚该怎么做。 此外,我如何才能让它返
我有一个带有适当重载的 Vect*float 运算符的 vector 类,我正在尝试创建全局/非成员 float*Vect 运算符,如下所示:(注意这是一个经过大量编辑的示例) class Vect
对于使用 C 编程的项目,我们正在尝试将图像转换为二进制数据,反之亦然。我们在网上找到的所有其他解决方案都是用 C++ 或 Java 编写的。这是我们尝试过的方法: 将图像转换为包含二进制数据的文本文
我需要对列表的元素求和,其中包含所有零或一,如果列表中有 1,则结果为 1,否则为 0。 def binary_search(l, low=0,high=-1): if not l: retu
我到处搜索以找到将 float 转换为八进制或二进制的方法。我知道 float.hex 和 float.fromhex。是否有模块可以对八进制/二进制值执行相同的工作? 例如:我有一个 float 1
当我阅读有关 list.h 文件中的 hlist 的 FreeBSD 源代码时,我对这个宏感到困惑: #define hlist_for_each_entry_safe(tp, p, n, head,
我不知道出了什么问题,也不知道为什么会出现此错误。我四处搜索,但我终究无法弄明白。 void print_arb_base(unsigned int n, unsigned int b) {
在任何语言中都可以轻松地将十进制转换为二进制,反之亦然,但我需要一个稍微复杂一点的函数。 给定一个十进制数和一个二进制位,我需要知道二进制位是开还是关(真或假)。 示例: IsBitTrue(30,1
在下面的代码中,我创建了两个文件,一个是文本格式,另一个是二进制格式。文件的图标显示相同。但是这两个文件的特征完全相同,包括大小、字符集(==二进制)和流(八位字节)。为什么没有文本文件?因为如果我明
我想通读一个二进制文件。谷歌搜索“python binary eof”引导我here . 现在,问题: 为什么容器(SO 答案中的 x)不包含单个(当前)字节而是包含一大堆字节?我做错了什么? 如果应
为什么只允许以 10 为基数使用小数点?为什么以下会引发语法错误? 0b1011101.1101 我输入的数字是否有歧义?除了 93.8125 之外,字符串似乎没有其他可能的数字 同样的问题也适用于其
boost 库中有二进制之类的东西吗?例如我想写: binary a; 我很惭愧地承认我曾尝试找到它(Google、Boost)但没有结果。他们提到了一些关于 binary_int<> 的内容,但我既
我是一名优秀的程序员,十分优秀!