Разбор массива символов UInt8 в строку с плавающей точкой без выделения

#performance #julia #heap-memory #allocation

Вопрос:

У меня здесь такая проблема:

 function main()
    b = UInt8[0x35, 0x30, 0x2e, 0x30] # This is "50.0" in bytes
    s = parse(Float64, String(b))
end
@btime main()

250.269 ns (2 allocations: 128 bytes)
50.0

 

У меня есть массив UInt8, который содержит число в строковом формате, например «50.0». Я хочу разобрать это число в плавающее число без выделения и как можно быстрее (у меня есть миллионы этих чисел для анализа). Есть ли лучший способ, чем тот, который я описал выше (игнорируя выделение для массива UInt8, так как этого не будет существовать).

Ваше здоровье, ребята!

Ответ №1:

Вы можете использовать:

 julia> using Parsers

julia> b = UInt8[0x35, 0x30, 0x2e, 0x30] # This is "50.0" in bytes
4-element Vector{UInt8}:
 0x35
 0x30
 0x2e
 0x30

julia> @btime Parsers.parse(Float64, $b)
  13.527 ns (0 allocations: 0 bytes)
50.0
 

Обратите внимание, что ваш код распределяется b внутри main , поэтому он включает время и выделение памяти для создания b .

Также разница в том , что в вашем коде String(b) пусто b , в то время как с Parsers.parse b остается нетронутым. Это особенно полезно, если b вы хотите просмотреть фрагмент более длинной ленты UInt8 значений.

Комментарии:

1. Спасибо вам за ответ и особенно за объяснение, это работает.