在 C / C++ 处理将UTF-8字符串内容输出到终端控制台时,平时惯用一个广泛使用的 `wprintf()` 函数,虽然它支持 Unicode 、UTF-8 字符,但在测试过程中发现它输出大文件时会有严重拖累性能,
测试打印文件:一个将近6万行的 JavaScript 代码文件。
`wprintf()` 函数在打印改文件时,文本在命令行窗口里哗哗直流,最终耗时超过81秒。
对比 Windows 自带的 type 命令,type 命令输出同一个文件需要大约5秒。C / C++说好的卓越性能在哪?
我查阅了相关文档得悉,Windows API 函数中有一个` WriteConsoleW() ` ,该函数以高效处理 Unicode 字符而闻名,允许直接写入控制台,而且支持 UTF-16 编码的字符串。
// fileContent 是保存文件内容的字符串
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()”值得拥有!