为什么这段代码在调试时要慢100倍?

Pat*_*Pat 9 c++ stl visual-c++

我正在使用MSVC 2010.

我正试图从列表中删除重复(不保留任何副本)

为什么这个代码在调试模式下慢100倍?

有没有其他方法可以删除所有等效的对象并使其在调试模式下更快?

到目前为止,我无法使用调试.在发布的几秒钟内处理需要几分钟.

void SomeFunction()
{
    std::list<Something> list;
    std::list<Something>::iterator it1;
    std::list<Something>::iterator it2;

    for (it1 = list.begin(); it1 != list.end(); it1++)
    {
        for (it2 = list.begin(); it2!=list.end(); it2++)
        {
            if (it1->SomeValue() == it2->SomeValue())
            {
                if (it1 != it2)
                {
                    list.erase(it1);
                    list.erase(it2);

                    it2 = list.begin();
                    it1 = it2++;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 17

通常,由于迭代器调试支持,在Visual Studio中调试时STL非常慢.您可以通过设置_HAS_ITERATOR_DEBUGGING为0 来显着提高速度.

  • @Pat:在发布模式下,你总是可以回到试用过的`printf()`调试.如果它对Linux内核开发者来说已经足够好了,那对任何人都应该足够好!另一种可能的解决方案是更改项目的Release配置,以便在关闭优化和符号的情况下进行编译.然后调试Release版本.它将链接到非调试库,但您仍然可以正常执行代码.完成后重新设置优化. (3认同)
  • 对于 msvc 2015,他们已移至 _ITERATOR_DEBUG_LEVEL;结合 _HAS_ITERATOR_DEBUGGING 和问题较少的 _SECURE_SCL (2认同)