Haskell не перестает удивлять меня!
Есть старый проект https://github.com/kni/redis-sharding-hs-strict.
В нем для определение типа команды используется поиск по списку пар:
https://github.com/kni/redis-sharding-hs-strict/blob/master/RedisSharding.hs#L59
Давном-давно
thesz посоветовал заменить это на дата-тип.
Заменил на:
Ожидал рост производительности, но получил ухудшение на 20-25%!
Измерял при следующих условиях, и, разумеется несколько раз и разной очередности:
Вот результат профилирования (при профилировании замедление меньше).
Старая версия:
А вот - новая с data CmdType:
Почему?!
UPDATE.
Загвоздка была, в том, что cmdType, так как много строк, поместил в другой файл, а не в тот, где case cmdType cmd of
И Haskell не смог оптимизировать. Когда все слил в один - скорость вернулась!!!
Есть старый проект https://github.com/kni/redis-sharding-hs-strict.
В нем для определение типа команды используется поиск по списку пар:
https://github.com/kni/redis-sharding-hs-strict/blob/master/RedisSharding.hs#L59
Давном-давно
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Заменил на:
data CmdType = CmdToAll -- На все сервера | CmdToOne -- На конкретные сервер | CmdToMany -- На множество серверов. CMD key1 ... keyN | CmdToManyValues -- На множество серверов. CMD key1 value1 ... keyN valueN | CmdToManyTimeout -- На множество серверов. CMD key1 ... keyN timeout (блокирующие команды) cmdType "PING" = Just CmdToAll cmdType "AUTH" = Just CmdToAll ....
Ожидал рост производительности, но получил ухудшение на 20-25%!
Измерял при следующих условиях, и, разумеется несколько раз и разной очередности:
cpuset -l 0 ./redis_sharding --port=8090 --nodes=127.0.0.1:8081,127.0.0.1:8082,127.0.0.1:8083,127.0.0.1:8084 +RTS -s -N1 -A10M -qa redis-benchmark -p 8090 -n 10000 -c 10 -q -t set,get,mset -P 10
Вот результат профилирования (при профилировании замедление меньше).
Старая версия:
COST CENTRE MODULE %time %alloc throwSocketErrorIfMinus1RetryMayBlock Network.Socket.Internal 12.2 0.5 endOfLine Data.Attoparsec.ByteString.Internal 11.5 7.5 servers_sender RedisSharding 10.0 13.2
А вот - новая с data CmdType:
COST CENTRE MODULE %time %alloc cmdType RedisParser 12.5 12.4 throwSocketErrorIfMinus1RetryMayBlock Network.Socket.Internal 11.9 0.4 endOfLine Data.Attoparsec.ByteString.Internal 9.2 6.4
Почему?!
UPDATE.
Загвоздка была, в том, что cmdType, так как много строк, поместил в другой файл, а не в тот, где case cmdType cmd of
И Haskell не смог оптимизировать. Когда все слил в один - скорость вернулась!!!