gpt4 book ai didi

c++ - 附加调试器时 unique_ptr dtor 调用速度慢得离谱 (msvc)

转载 作者:可可西里 更新时间:2023-11-01 18:36:09 24 4
gpt4 key购买 nike

struct test_struct
{
test_struct() {}
~test_struct() {}
};

#include <vector>
#include <memory>
#include <cstdio>

int main()
{
printf("ctor begin\n");
{
std::vector<std::unique_ptr<test_struct>> test_vec;
const int count = 100000;

for (auto i = 0; i < count; i++) {
test_vec.emplace_back(new test_struct);
}
printf("dtor begin\n");
}
printf("dtor end\n");
}

我正在使用 VS2010,发现了一些荒谬的性能问题。上面的代码在调试和发布版本 (ctrl+f5) 中都运行良好,但是当附加调试器 (f5) 时,dtor 调用 unique_ptr 类的速度慢得无法忍受。结果机器代码是相当优化的,所以我不认为这是编译器问题而不是调试器问题,但我不知道如何处理它。我的问题是

  • 这个问题能否在您的机器上重现?
  • 这种行为的原因是什么?
  • 有什么解决方法吗?

最佳答案

变慢的原因是每当释放内存时都会进行内存检查。但是,这是一个特殊的系统级/调试器级堆,不是您可以从程序中控制的任何东西。

有一个 great article on the issue .总结一下:你必须设置一个环境变量来禁用它!

幸运的是,您可以从项目设置的调试选项中为您的项目设置特定于项目的环境变量,以便环境变量仅应用于您的程序。

我用这个简化的程序来测试:

#include <iostream>
#include <memory>
#include <vector>

int main()
{
std::cout << "ctor begin" << std::endl;
{
std::vector<std::unique_ptr<int>> test_vec;

for (unsigned i = 0; i < 100000; i++)
test_vec.emplace_back(new int);

std::cout << "dtor begin" << std::endl;
}
std::cout << "dtor end" << std::endl;
}

通过将 _NO_DEBUG_HEAP=1 设置为环境变量(无论是系统范围的,我不推荐,还是通过调试选项),代码运行的时间大致相同,无论是否附加了调试器。

关于c++ - 附加调试器时 unique_ptr dtor 调用速度慢得离谱 (msvc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10680005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com