【问题标题】:Does g++ compilation time depend on array size?g++ 编译时间是否取决于数组大小?
【发布时间】:2012-04-19 15:25:55
【问题描述】:

我有一个包含 3 个数组声明的 C++ 代码。

float A[NUM]; float B[NUM]; float C[NUM];

当我使用NUM=512 编译时,编译速度很快

time g++ -DNUM=512 trials trials.cpp -lm

0.16s 用户 0.04s 系统 94% cpu 0.219 总

但是,当我使用NUM=167772160 编译时,需要更多时间。

time g++ -DNUM=167772160 trials trials.cpp -lm

7.90s 用户 0.69s 系统 99% cpu 8.604 总

我已经好几年没用过 C++了。我很想知道为什么编译后的目标文件大小相同,但编译时会存在时间差异。

【问题讨论】:

  • 那些数组是静态数据吗?
  • 它们是全局声明。
  • 谁知道 g++ 试图做什么优化。也许它会分配这样一个数组来检查以警告无效的内存访问。尝试使用 -O0 再次运行基准测试(可能多次运行)并分别进行编译和链接。
  • 可能与此错误或其中提到的错误有关:gcc.gnu.org/bugzilla/show_bug.cgi?id=20923您使用的 gcc 版本是什么?
  • 标准(C 和 C++)要求将全局变量/静态变量初始化为 0。现在,GCC 通常将此类数据放在 .bss 部分中。您可以执行以下操作:1) 检查 .bss 部分的值和 2) 查看汇编器输出。尝试将-fno-zero-initialized-in-bss 选项传递给编译器,看看是否有什么不同。

标签: c++ g++


【解决方案1】:

这是一个众所周知的难题。在此过程中,将分配数组的实际内存

见: Linker performance related to swap space?

看起来,正如我们可能怀疑的那样,看起来 ld 实际上是在尝试匿名映射这个数组的整个静态内存空间(或者可能是整个程序,很难说,因为程序的其余部分是这么小,它可能都适合额外的 4096)。

也相关:

【讨论】:

    【解决方案2】:

    您的数组是在本地还是全局声明的? 如果是全局的,因为链接器应该在 .data 段分配内存,这可能需要很长时间。 但是,如果您在本地声明它,因为内存是在运行时分配的,而不是链接时分配的。应该是链接器的问题,而是编译器的分析器或优化器引起的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2022-01-12
      • 2022-06-10
      • 1970-01-01
      相关资源
      最近更新 更多