#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. Спасибо вам за ответ и особенно за объяснение, это работает.