我有以下代码,使用g ++运行3秒,在微软编译器运行超过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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我没有使用优化标志.运行在Windows XP 32位...尝试没有"调试cout线" - 没有重大变化.
没有.
首先,虽然MSVC++确实存在缺陷,但其生成的代码的性能通常不被认为是坏的.
其次,使用"是编译器编写者脑力"测试.微软的工程师必须做出多么令人难以置信的愚蠢,制造一个比竞争对手慢十倍的编译器,而不是努力改进它?10%甚至50%可以解释为"微软的编译器只生成垃圾代码",但1000%?可能不是.所以你应该到别处寻找解释.:)
解释很简单:
您的基准测试不是测试两个编译器生成代码的速度有多快.您正在测试哪些编译器在禁用优化时插入最多的调试检查,当您明确告诉编译器"不,它很好,花点时间,我不关心可执行文件有多慢,我只是想让它变得容易用于调试目的".
在给出这些说明时,Microsoft会插入比GCC更多的额外正确性检查和运行时检查.因此,其可执行文件变得更慢.
在进行基准测试时,规则1 始终是启用优化.
其他任何事情就像试图衡量谁是最快的跑步者,而不告诉竞争对手他们应该跑.进入厨房制作三明治而不是朝向球门的那个人不一定是慢跑者,他只是没有得到任何他应该向球门跑的指示.
代码中最大的攻击者(但不是唯一的)可能是在调试版本中的MSVC上,operator[]在向量上包含额外的范围检查.但尽管如此,正确的答案不是"哦,我会停止使用std::vector",但是"哦,也许我应该在我关心速度的情况下启用优化".