[personal profile] iamjaph
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] thesz посоветовал заменить это на дата-тип.

Заменил на:
 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 не смог оптимизировать. Когда все слил в один - скорость вернулась!!!
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

iamjaph

March 2025

S M T W T F S
      1
2345678
9101112131415
16171819 202122
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 29th, 2025 03:28 am
Powered by Dreamwidth Studios