[英]Why would code performance be better in VSCode?
我使用 g++ 12.2.0(通过 MSYS2 的 MinGW-w64)并且从 VSCode(带有 Code Runner 扩展)和命令行运行相同的代码时遇到奇怪的性能行为。 对于两者,使用的命令是g++ f1.cpp -o f1 && f1
。
出于示例目的,给定此代码:
#include <iostream>
#include <chrono>
#include <string.h>
using
std::chrono::high_resolution_clock,
std::chrono::duration_cast,
std::chrono::nanoseconds;
void timeit(void (*func)(std::string), std::string message){
auto time_start = high_resolution_clock::now();
func(message);
auto time_end = high_resolution_clock::now();
auto duration = duration_cast<nanoseconds>(time_end - time_start).count();
std::cout << "Execution Time: " << duration * 1e-6f << " [ms]" << std::endl;
}
void run(std::string message){
std::cout << message.c_str() << std::endl;
}
int main() {
for (size_t i = 0; i < 100; i++)
timeit(&run, std::to_string(i));
}
VSCode Output:
...
96 执行时间:0.0025 [ms] 97 执行时间:0.0022 [ms] 98 执行时间:0.0034 [ms] 99 执行时间:0.0029 [ms]
命令行 Output:
...
96 执行时间:0.5091 [ms] 97 执行时间:0.5168 [ms] 98 执行时间:2.4943 [ms] 99 执行时间:0.7385 [ms]
如上所示,性能明显不同。 它在 PowerShell 甚至 VSCode 终端本身也是一致的。
我尽我所能搜索 Stack Overflow 和其他资源,但一无所获。
编辑 1:我已经尝试通过优化和最多 1e6 次迭代来运行它,但问题仍然存在。
编辑 2: teapot418的回答很准确。 它确实受到终端性能的限制,用\n
替换std::endl
在性能上有很大的不同。 用不同的(甚至计算量更大的)操作替换打印操作显示出相同的性能。 三十二上校的回答也提出了一个重点,我应该事先澄清一下。 问题解决了。
您正在对run
时间 function 进行基准测试,这是一个单独的 std::cout 语句。 测量单个 output 行的 I/O 时间会有很大的差异,并且取决于 stdout 被路由到哪里。
我的通灵能力表明 VSCode 正在将 stdout 重新路由到它自己的 output window,它比默认控制台 window 具有更多的缓冲和性能。我猜你的控制台 window 在 88874814 上的某种 bash/unix 仿真下运行.(或者这是 Linux?)
一些尝试:
重定向到 Windows 上的 /dev/null 或 nul:(例如f1 > /dev/null
或f1 > nul:
)。 当然,您不会看到 output,但您可以更改要发送到cerr
的Execution Time
语句,而cout
仍用于运行 function。但是话又说回来,我不确定您在测量什么。
尝试使用 -O2 优化进行编译。 这可能会消除差异。
尝试在默认控制台 window 中运行已编译的程序,而不是它现在可能正在运行的 Bash/Mingw/Cygin 东西。 您也可以尝试在 powershell 中运行它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.