繁体   English   中英

为什么 VSCode 中的代码性能会更好?

[英]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 控制台(或您用来托管 mingw 的控制台应用程序)的缓冲区大小
  • 重定向到 Windows 上的 /dev/null 或 nul:(例如f1 > /dev/nullf1 > nul: )。 当然,您不会看到 output,但您可以更改要发送到cerrExecution Time语句,而cout仍用于运行 function。但是话又说回来,我不确定您在测量什么。

  • 尝试使用 -O2 优化进行编译。 这可能会消除差异。

  • 尝试在默认控制台 window 中运行已编译的程序,而不是它现在可能正在运行的 Bash/Mingw/Cygin 东西。 您也可以尝试在 powershell 中运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM