fast_float转换效率测试
fast_float是一个轻量级的C++库,通过from_chars函数,将ASCII字符串解析为二进制浮点数值,支持各种不同的输入格式,如固定点、科学记数法等。对于浮点数,它支持以十进制表示的无穷大和NaN值,同时也遵循了C++17的标准规范,包括禁止前导正号、不跳过前导空白字符等。介绍说一般能够提供比标准std库高4~10倍的处理速度,对于csv文件和字节流解析可实现提速;原话是:: 4x to 10x faster than strtod, part of GCC 12, MySQL, Chromium, Redis and WebKit/Safari.
使用fast_float的测试文件string_test对std和fastfloat两种方式进行对比的性能测试;
将partow_test中的strint_list提取到全局,然后新增两个测试函数std_test和ck_test分别对应std和fastfloat测试,测试环境为gcc version 11.4.0 (ubuntu 22.04.2)
template <typename T> bool std_test() {
  
  for (std::string const &st : strint_list) {
    T expected_value;
    strtod_from_string(st, expected_value);
  }
  return true;
}
template <typename T> bool ck_test() {
  for (std::string const &st : strint_list) {
    T result_value;
    fast_float::from_chars(st.data(), st.data() + st.size(), result_value);
  }
  return true;
}
int main() {
  auto start = std::chrono::high_resolution_clock::now(); 
  std::cout << "32 bits std checks" << std::endl;
  Assert(std_test<float>());
  auto end = std::chrono::high_resolution_clock::now();
  auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
  std::cout << "float std Execution time: " << duration.count() << " microseconds" << std::endl;
  start = std::chrono::high_resolution_clock::now();
  std::cout << "32 bits fast float checks" << std::endl;
  Assert(ck_test<float>());
  end = std::chrono::high_resolution_clock::now();
  duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
  std::cout << "float fastfloat Execution time: " << duration.count() << " microseconds" << std::endl;
  start = std::chrono::high_resolution_clock::now();
  std::cout << "64 bits std checks" << std::endl;
  Assert(std_test<double>());
  end = std::chrono::high_resolution_clock::now();
  duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
  std::cout << "double std Execution time: " << duration.count() << " microseconds" << std::endl;
  start = std::chrono::high_resolution_clock::now();
  std::cout << "64 bits fast float checks" << std::endl;
  Assert(ck_test<double>());
  end = std::chrono::high_resolution_clock::now();
  duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
  std::cout << "double fastfloat Execution time: " << duration.count() << " microseconds" << std::endl;
  std::cout << "All ok" << std::endl;
  return EXIT_SUCCESS;
}
最终测试结果输出为一下结果,float基本上满足所说的4x性能指标,double只有2倍左右。
建议使用fast_float,已适应解析出错、科学计数法等不同类型的转换支持,安全又高效。
32 bits std checks
float std Execution time: 58 microseconds
32 bits fast float checks
float fastfloat Execution time: 14 microseconds
64 bits std checks
double std Execution time: 28 microseconds
64 bits fast float checks
double fastfloat Execution time: 11 microseconds

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号