-5

我有以下代码,使用 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;
        }

    }
}

编辑:我没有使用优化标志,withing。在 windows xp 32 位上运行...在没有“调试 cout 行”的情况下尝试过 - 没有显着变化。

4

2 回答 2

6

不。

首先,虽然 MSVC++ 确实存在缺陷,但其生成代码的性能通常不被认为是差的。

其次,使用“编译器编写者是否脑残”测试。微软的工程师要多么愚蠢,才能制造出比竞争对手慢十倍的编译器,却不努力改进它?10% 甚至 50% 可以用“微软的编译器只是生成垃圾代码”来解释,但是 1000% 呢?可能不是。所以你应该在别处寻找解释。:)

解释很简单:

您的基准测试并未测试两个编译器生成代码的速度。您正在测试哪个编译器在禁用优化时插入最多的调试检查,当您明确告诉编译器“不,这很好,慢慢来,我不在乎可执行文件有多慢,我只是希望它很容易用于调试目的”

并且当给出这些指令时,微软会插入比 GCC 更多的额外正确性检查和运行时检查。因此,它的可执行文件变得更慢。

在进行基准测试时,规则 1始终是启用优化

其他任何事情都像是试图衡量谁是跑得最快的人,却不告诉竞争对手他们应该跑。那个进厨房做三明治而不是冲向球门的人不一定是跑得慢的,他只是没有得到任何指示他应该跑向球门。

您的代码中最大的违规者(但不是唯一一个)可能是在调试版本中的 MSVC 上,operator[]在向量上包含额外的范围检查。但尽管如此,正确的答案不是“哦,我将停止使用std::vector”,而是“哦,也许我应该在我关心速度的情况下启用优化”。

于 2013-05-18T09:39:37.020 回答
0

不,事实并非如此。GCC 的一个缺陷是,在没有优化的情况下进行编译时,它的调试检查不如微软的编译器那么多。

于 2013-05-18T15:41:07.907 回答