【问题标题】:Difference between GCC binaries and MSVC binaries?GCC 二进制文件和 MSVC 二进制文件之间的区别?
【发布时间】:2015-03-19 17:01:08
【问题描述】:

当我使用类似的优化设置在 GCC(使用 MinGW)和 MSVC(使用 Visual Studio)中编译一个大型项目(例如比特币)时,GCC 二进制文件为 6 mb,MSVC 二进制文件为 4 mb。

现在我想知道,这是否表示 MSVC 可以生成更好的二进制文件(我的意思是更好,因为更小+更快)?或者这不意味着什么,它只是符号信息或与性能无关的东西?

我希望有很多 cmets:只需对它进行基准测试。但我更感兴趣的是差异的原因,而不是确切的尺寸/性能差异本身。

【问题讨论】:

  • 随着 CPU 缓存大小的不断增加,允许更积极的内联和循环展开优化,比较毫比特并不是衡量成功的标准。正确记录您的问题,至少发布编译命令行,以便我们查看您使用的选项。
  • @HansPassant 生成的二进制文件中 33% 的差异远远超过了毫比特。我只是想知道 GCC 生成的汇编代码是否质量差,而不是它们的性能是否相同。另请参阅,OpenUserX03 的答案不仅仅是我的想象。
  • @Muis:Hans 是对的,您需要发布编译器设置。当您认为它们具有可比性时,您可能错过了一些东西。另外,运行时库是静态链接的还是您使用的是 DLL?

标签: visual-c++ gcc mingw compiler-optimization


【解决方案1】:

有可能只使用 -o2,mingw 生成的二进制文件可能比 MSVC 慢。我没有测试过,也不知道。但是我确实知道,启用 -march=native 后,在我自己的基准测试 (http://plflib.org/colony.htm#benchmarks) 中,mingw 的性能优于 MSVC(具有适当的目标优化)约 20%。 我想,主要原因是针对单个 CPU 目标进行了更好的定制,而不是 MSVC 更加分散的方法。然而,GCC 的代码生成可能更好。

但是,在其他基准测试中,MSVC 可能会显示出性能改进。我自己的结果绝不是确定性的,但它们具有指示性。

最后我会注意到,是的,MSVC 通常会生成较小的二进制文件 - 但请注意#include 的内容。在 GCC/libstdc++ 中包含 iostream 会拖入大量代码,而在 MSVC 中包含的代码很少。正如其他人所说,更小!= 更快。

【讨论】:

    【解决方案2】:

    根据这个关于减小可执行文件大小的wxwidgets 页面,众所周知,Visual C++ 可以生成更小、更快的可执行文件,至少在 Windows 上是这样。

    1. 在 Windows 上使用 Microsoft Visual C++ 代替 gcc(Cygwin 或 Mingw)。 它确实可以生成更小更快的可执行文件。

    【讨论】:

    • 你有更多的资源吗?因为似乎没有多少人意识到这一点。
    【解决方案3】:

    越小不一定越快。我最新的编译广泛使用了 SIMD 指令,这些指令可以为一行代码提供一组以上的指令,例如一些用于 AVX SIMD,一些用于 SSE SIMD,一些用于 SSE SISD。然后可能会出现大量循环展开(以维持流水线流动),其中包含大量重复的指令序列。

    有些可能通过 Eclipse 遵循与在 Android 上相同的过程,其中编译参数 APP_ABI := all 为 arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86 和 x86-64 生成代码,选中在运行时自动运行。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2011-08-27
      • 2014-09-27
      • 2013-04-26
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多