如何解决严重且异常的性能问题
更新
好的,我删除了 3 个 cout
并将其替换为 *buffer = 'a'
,性能差异很大。删除该行使程序速度提高了 2 倍。如果您继续使用 Godbolt 并使用 msvc
编译它,那一行代码会更改大部分程序。 (它增加了更多的复杂性)
以下内容可能看起来非常奇怪,但在我的计算机上确实如此:
好的,所以我正在对一些代码进行一些基准测试,我注意到 100% 一致的极其奇怪的性能异常。我正在运行 windows-10
和 visual-studio-2019
。基本上,删除一行从不调用的代码会完全改变程序的性能。
具体操作如下:
- 创建新的 VS-2019 控制台 C++ 应用项目
- 将配置设置为Release & x64
- 粘贴以下代码:
#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 运行程序,而不是在调试中。现在记住运行需要多长时间。 (几秒钟)
再次运行程序,您应该会看到性能显着提高。我用 4 个全新的不同项目和 3 台不同的计算机测试了这个完全相同的代码。
析构函数在最后调用,当整个程序完成测量时间时。额外的 cout
应该不会影响任何事情。
编辑:
如果您删除 3 个 cout
并将其替换为单个 *buffer = 'a'
,您也可以看到类似的情况。然后再次CTRL+F5,记录时间,然后删除我们刚刚添加的那一行。然后再次运行,时间神奇地减少了一半。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。