我有以下代码,使用g ++运行3秒,在microsoft编译器运行超过30秒,我不明白......
struct constraint{
int bitline;
int result;
};
// this vector is filled with about 1 milion items
vector<constraint> constraints;
for (int a = 0; a < constraints.size(); ++a)
{
if (a% 100 == 0) cout << a << " "<<endl;
for (int b = a; b < constraints.size(); ++b)
{
int anded = constraints[a].bitline & constraints[b].bitline;
int ored = constraints[a].bitline | constraints[b].bitline;
// a subset of b
if (anded == constraints[a].bitline && constraints[a].result >= constraints[b].result )
{
// delete a
constraints[a].bitline = 0;
}
if (anded == constraints[b].bitline && constraints[b].result >= constraints[a].result )
{
constraints[b].bitline = 0;
}
}
}
编辑:我没有使用优化标志。在Windows XP上运行32位...尝试没有“调试cout线” - 没有重大变化。
答案 0 :(得分:6)
没有
首先,虽然MSVC ++确实存在缺陷,但其生成的代码的性能通常不被认为是坏的。
其次,使用“是编译器编写者脑力”测试。微软的工程师必须做出多么令人难以置信的愚蠢,使编译器的速度<竞争者的速度<10> ,而不是改进它? 10%甚至50%可以解释为“微软的编译器只生成垃圾代码”,但1000%?可能不是。所以你应该到别处寻找解释。 :)
解释很简单:
您的基准测试不是测试两个编译器生成代码的速度有多快。 您正在测试哪些编译器在禁用优化时插入最多的调试检查,当您明确告诉编译器时“不,它很好,花点时间,我不关心可执行文件有多慢,我只是想要它易于用于调试目的“。
当给出这些说明时,Microsoft会插入比GCC更多的额外正确性检查和运行时检查。因此,它的可执行文件会变慢。
进行基准测试时,规则1 始终启用优化。
其他任何事情就像试图衡量谁是最快的跑步者而不告诉竞争对手他们应该运行。那个走进厨房制作三明治而不是朝着球门前进的球员并不一定是一个慢跑者,他只是没有得到任何他应该向球门跑的指示。
代码中最大的攻击者(但不是唯一的攻击者)可能在调试版本中的MSVC上,向量上的operator[]
包含其他范围检查。但尽管如此,正确的答案不是“哦,我会停止使用std::vector
”,但是“哦,也许我应该在我关心速度的情况下启用优化”。
答案 1 :(得分:0)
不,事实并非如此。 GCC的一个缺点是,在没有优化的情况下进行编译时,它不会像微软的编译器那样接近调试检查。