在C++中解析浮点:基准测试strtod与from_chars

2020-09-11 21:28:29

程序员经常需要将字符串转换为浮点数。例如,您可能获得字符串“3.1416”,并且希望获得浮点类型的结果值。

Char*string=";3.1416";; Char*string_end=string; DOUBLE x=strtod(string,&;string_end); 如果((string_end==string)||((string_end==nullptr){ //您有错误! }。

不幸的是,与许多字符串处理函数一样,strtod函数也是地区敏感的。这意味着根据您运行代码的系统的不同,它的行为可能会有所不同。但是,所有运行时库似乎都有特定于区域设置的函数,如strtod_l或_strtod_l(Windows)。您可以使用这些特定于区域设置的函数来指定默认区域设置,从而获得在所有系统上行为相同的函数。

Strtod函数的一个很好的特性是,它在解析后的数字末尾返回一个指针。例如,通过这种方式,您可以有效地解析逗号分隔的数字序列。

Std::string st=";3.1416";; 双x; AUTO[p,EC]=std::from_chars(st.data(),st.data()+st.size(),x); 如果(p==st.data()){ //您有错误%s! }。

From_chars的伟大之处在于,根据定义,它是独立于地区的。此外,它是标准化的,所以它应该在任何地方都可以使用。不幸的是,据我所知,唯一带有完全实现的from_chars函数的C++编译器是Visual Studio2019。而且你需要有一个最近发布的版本。

事实上,尽管C++17已经推出一段时间了,而且许多编译器声称完全支持它,但是运行时库需要迎头赶上!当然,您可以独立于_chars实现,但如果运行时库开箱即支持C++17就更好了。

尽管如此,我们应该庆祝微软正在做正确的事情,并热切地支持最新的标准。

我从_chars那里听说了关于Visual Studio的好话。在其他事情中,它是非常快的。

我想知道它的速度要快得多。所以我写了一个基准!我在[0,1]间隔内生成大量随机值,并记录解析它们所需的时间。