严重且异常的性能问题

问题描述

更新 好的,我删除了 3 个 cout 并将其替换为 *buffer = 'a'性能差异很大。删除该行使程序速度提高了 2 倍。如果您继续使用 Godbolt 并使用 msvc 编译它,那一行代码会更改大部分程序。 (它增加了更多的复杂性)

以下内容可能看起来非常奇怪,但在我的计算机上确实如此:

好的,所以我正在对一些代码进行一些基准测试,我注意到 100% 一致的极其奇怪的性能异常。我正在运行 windows-10visual-studio-2019。基本上,删除一行从不调用代码会完全改变程序的性能

具体操作如下:

  1. 创建新的 VS-2019 控制台 C++ 应用项目
  2. 将配置设置为Release & x64
  3. 粘贴以下代码
#include <iostream>
#include <chrono>
class Test {
public:
    size_t length;
    size_t doublingVal;
    char* buffer;
    test() : length(0),doublingVal(2) {
        buffer = static_cast<char*>(malloc(1));
    }
    ~test() {
        std::cout << "called" << "\n";
        std::cout << "called" << "\n";
        std::cout << "called" << "\n"; // Remove this line and the time decreases DRASTICALLY (ie remove line 14)
    }
    void append() {
        if (doublingVal == length) {
            doublingVal <<= 1;
        }
        *buffer = 'a';
        ++length;
    }
};
int main()
{
    Test test;
    auto start = std::chrono::high_resolution_clock::Now();
    for (size_t i = 0; i < static_cast<size_t>(1024) * 1024 * 1024 * 4; ++i) {
        test.append();
    }
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::Now() - start).count() << "\n";
}

使用 CTRL+F5 运行程序,而不是在调试中。现在记住运行需要多长时间。 (几秒钟)

然后,在 Test 的析构函数中,删除包含注释的第三行。

再次运行程序,您应该会看到性能显着提高。我用 4 个全新的不同项目和 3 台不同的计算机测试了这个完全相同的代码

析构函数在最后调用,当整个程序完成测量时间时。额外的 cout 应该不会影响任何事情。

编辑: 如果您删除 3 个 cout 并将其替换为单个 *buffer = 'a',您也可以看到类似的情况。然后再次CTRL+F5,记录时间,然后删除我们刚刚添加的那一行。然后再次运行,时间神奇地减少了一半。

WTF正在进行中,奇怪的性能差异如何解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)