C / C++的wprintf打印速度太慢,改WriteConsoleW输出提速200+倍

在 C / C++ 处理将UTF-8字符串内容输出到终端控制台时,平时惯用一个广泛使用的 `wprintf()` 函数,虽然它支持 Unicode 、UTF-8 字符,但在测试过程中发现它一个弊端:如果先前使用了 locale 库的“setlocale(LC_CTYPE,"");”或“setlocale(LC_CTYPE,"zh-cn.UTF-8");”语句,那么接下来 wprintf 输出大文件内容时会有严重拖累性能,比如:

 

测试打印文件:一个将近6万行的 JavaScript 代码文件。

`wprintf()` 函数在打印改文件时,文本在命令行窗口里哗哗直流,最终耗时超过81秒。

对比 Windows 自带的 type 命令,type 命令输出同一个文件需要大约5秒。C / C++说好的卓越性能在哪?

我查阅了相关文档得悉,Windows API 函数中有一个` WriteConsoleW() ` ,该函数以高效处理 Unicode 字符而闻名,允许直接写入控制台,而且支持 UTF-16 编码的字符串。

// fileContent 是保存文件内容的字符串,类型是wchat_t*

    if (fileContent != NULL) {
        clock_t t = clock();

        HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
        WriteConsoleW(console, fileContent, wcslen(fileContent), NULL, NULL);

        t = clock() - t;
        double duration = ((double)t) / CLOCKS_PER_SEC;

        wprintf(L"\n\n使用 WriteConsoleW 输出文件耗时:%.3f秒。\n", duration);
        free(fileContent);
    }

测试方法 耗时
C / C++ 的 wprintf() 函数 81.616 秒
Windows 命令行的 type 命令 大约 5 秒
C / C++ 的 WriteConsoleW() 函数 0.361 秒

测试结果清楚地表明“WriteConsoleW()”输出只需要0.36秒,速度快如闪电!比“wprintf()”快225倍!我感觉这个函数调用了硬件级方法直接拷贝输出到终端。如果要处理大文件输出,“WriteConsoleW()”值得拥有!

猜你喜欢

转载自blog.csdn.net/Scott0902/article/details/131578890
C