Windows 用户在 C++ 编程方面有多种选择。您可以选择坚持使用常规的 Visual Studio。如果您愿意,Microsoft 提供了 ClangCL,它将 LLVM 编译器(通常由 Apple 使用)与 Visual Studio 后端结合在一起。此外,在 Windows 下,您可以使用Windows Subsystem for Linux轻松地为 Linux 构建软件。
程序员经常需要将字符串(例如 312.11)转换为二进制浮点数。在进行数据科学时,这是一项常见的任务。
我写了一小组基准程序来测量速度。为了运行,我使用最新的 Visual Studio (2022) 和最新的 ClangCL 组件,以及最新版本的 CMake。
在您的机器上下载后,您可以使用 CMake 构建它。在 Linux 下,你可以这样做:
cmake -B 构建 && cmake --build 构建
然后你可以像这样执行:
./build/benchmarks/benchmark -f data/canada.txt
Microsoft Visual Studio 用法类似,只是您必须指定构建类型(例如,Release):
cmake -B build && cmake --build build --config 发布
对于 ClangCL,它几乎相同,除了您需要添加-T ClangCL :
cmake -B build -T ClangCL && cmake --build build --config 发布
在 Windows 下,二进制文件不是在build/benchmarks/benchmark中生成的,而是在build/benchmarks/Release/benchmark.exe中生成的,但命令在其他方面是相同的。我使用与发布版本对应的默认 CMake 标志。
我在配备Tiger Lake 英特尔处理器(i7-11370 @ 3.3 GHz) 的笔记本电脑上运行基准测试。它不是基准测试的理想机器,因此我在速度测量中指出了误差范围。
在其他库中,我的基准测试对fast_float 库进行了测试:它是用于浮点数和双精度数的 C++17 from_chars函数的实现。 Microsoft 有自己的此功能实现,我将其包含在组合中。
当我切换系统或编译器时,我的基准测试代码保持不变(在 C++ 中):我只是重新编译它。
Visual Studio std::from_chars | 87 MB/秒(+/- 20 %) |
Visual Studio 快速浮动 | 285 MB/秒(+/- 24 %) |
ClangCL fast_float | 460 MB/秒(+/- 36 %) |
Linux GCC11 fast_float | 1060 MB/秒(+/- 28 %) |
我们可以观察到性能差异很大。所有测试都在同一台机器上运行。 Linux 构建在适用于 Linux 的 Windows 子系统下运行,您不希望子系统运行计算比 Windows 本身更快。基准测试不涉及磁盘访问。基准测试没有分配新内存。
这不是我第一次注意到Visual Studio 编译器提供令人失望的性能。我还没有读到一个很好的解释为什么会这样。有些人责怪内联,但我还没有发现 Visual Studio 的发布版本内联很差的情况。
我不排除方法论问题,但我几乎系统地发现在进行 C++ 微基准测试时,Visual Studio 下的性能较低,尽管使用了不同的基准测试方法和库(例如,Google Benchmark)。这意味着如果存在方法论问题,那么它比单纯的编程错字更深。