为什么<?php
$query = "INSERT INTO products(name, price, type, des, img)VALUES('".$name."', '".$price."', '".$type."', '".$des."', '".$img."')";
?>
在Core i7 9700K处理器上使用-O3进行gcc编译需要花费超过17分钟的时间?
我偶然发现了gcc的问题,我在头文件中用std::array<std::string, 65536> a = {};
空初始化了一个std::array
,而不是在源文件的专用构造函数中进行了初始化。该文件包含在多个位置,这导致了几乎无限的优化循环。使用std::string
时,它迅速完成,但是使用-O0
,我在核心i7-9700K处理器上等待了一个多小时,而gcc仍在运行。
我最终将问题缩小为-O1
的空初始化,其中std::array<std::string, N>
是一个很大的数字。对于其他类型的其他非平凡构造函数,在编译时间随元素数量线性增加的情况下,也可能会遇到类似的问题。像下面的示例。
N
为了弄清楚这个问题,我将上面的代码编译为汇编代码。使用#include <array>
struct A {
A() : i(0) {}
int i;
};
int main() {
std::array<A, 65536> a = {};
return 0;
}
时,程序集看起来像是展开的-O0
调用构造函数的循环,其行数约为数组大小的4倍。启用优化功能时,似乎一并消除了初始化。
for
当用#include <array>
#include <string>
int main() {
std::array<std::string, 65536> a = {};
return 0;
}
替换数组的内容时,即使启用了优化,编译器似乎也无法删除std::string
的初始化。
我想这是为什么我的初始构建陷入无尽的优化循环的原因的一部分,但是它并不能完全解释它,也不是为什么clang似乎能更好地处理这一问题。有没有人可以进一步阐明这个问题?
我尝试了几种gcc版本,从gcc-6到gcc-8。即使使用gcc-4.9,也需要花费一些时间,但花费的时间并不多,大约需要4.5分钟。将clang与-stdlib = libstdc ++一起使用时,编译时间为0m0,120s。