Сравнение strtod с from_chars (GCC 12)

Читатель (Ричард Эбелинг) предложил мне пересмотреть старую запись в блоге: Разбор чисел с плавающей запятой в C++: бенчмаркинг strtod и from_chars . Тогда я сообщил, что переход с strtod на from_chars в C++ для разбора чисел может привести к увеличению скорости (на 20%). Код почти такой же, мы идем от…

 символ * строка = " 3.1416 " ; 
  
char * string_end = строка ; 
  
двойной х = strtod ( строка и конец_строки ) ; 
  
если ( строка_конец = = строка ) {  
  
  //у вас ошибка! 
  
} 
  

… к чему-то более современному в C++17…

 std :: string st = " 3.1416 " ; 
  
двойной х ;  
  
auto [ p , ec ] = std :: from_chars ( st.data ( ) , st.data ( ) + st.size ( ) , x ) ; 
  
если ( п = = ст . данные ( ) ) { 
  
      //у вас ошибка s! 
  
} 
  

Когда я впервые сообщил об этом результате, только Visual Studio поддерживала from_chars. Библиотека C++ в GCC 12 теперь имеет полную поддержку from_chars. Давайте снова запустим тест :

стртод 270 МБ/с
from_chars 1 ГБ/с

Так что это почти в четыре раза быстрее! Бенчмарк считывает случайные значения в интервале [0,1].

Внутри GCC 12 принял библиотеку fast_float .

Дополнительная литература : Анализ чисел со скоростью гигабайт в секунду , Программное обеспечение: практика и опыт 51 (8), 2021.

Leave a Comment

Ваш адрес email не будет опубликован.