Разбираюсь с производительностью bitstring в erlang
Написал простой тест для to_upper функции.
Код теста тут:
https://github.com/Egobrain/erlperf_tests.gitВот в чем вопрос:
Написал 2 варианта char_to_upper/1.
1-й проверяет $a < ch < $z и исли да прибавляет $A-$a
2-й проверка влоб.
И 2 варианта пробега по бинарнику:
1-й binary comprehension
2-й binary to list |> list comprehension |> list to binary
получилось 4 варианта для теста. Тестил на строке 100000 символов. Erlang R16B
Результаты, мягко говоря меня удивили.
perf_test:test(100000, 100).
[{comprehension,7100},
{comprehension2,4562},
{conversion,6084},
{conversion2,3298}]
Я думал самый быстрый будет comprehension, а он почти в 2 раза хуже чем conversion2.
Самым быстрым оказалась проверка в лоб с конвертированием бинарь->список->бинарь.
Как-то не логично работает VM.
Потом добавил флаг "+native" и снова проверил.
Все вернулось на круги своя.
[{comprehension,2636},
{comprehension2,3994},
{conversion,3094},
{conversion2,4389}]
Кто-нибудь может объяснить, почему так странно работает erlang без native. И что такого магического сделал hipe,
раз он мало того, что самый медленный вариант сделал самым быстрым, так еще и profit > чем 2.5 раза ?