[Haskell-cafe] mine sockets lib vs yesod

Branimir Maksimovic branimir.maksimovic at gmail.com
Sat Sep 25 07:49:37 UTC 2021


It is mine lib for https://www.volomp.com <https://www.volomp.com/>
I work now here https://www.rt-rk.com <https://www.rt-rk.com/>
on this http://www.vti.mod.gov.rs/index.php?view=actuality&type=projects&category=1&id=72 <http://www.vti.mod.gov.rs/index.php?view=actuality&type=projects&category=1&id=72>

I guess that if I port it to Haskell purely from CPP, I won’t have problems with copyright?

Greetings, Branimir

> On 25.09.2021., at 09:22, Branimir Maksimovic <branimir.maksimovic at gmail.com> wrote:
> 
> Let’s compare:
> 1000 parallel connections 100k requests
> 
> yesod :
> 7658 recs/sec
> Errors 85808
> Timeouted 0
> 
> Mine::
> 12699 recs/sec
> Errors 0
> Timeouted 0
> 
> 10k connections, 100k requests:
> yesod:
> 5205 recs/sec
> Errors 81152
> Timeouted 3842
> 
> Mine:
> 8160 recs/sec
> Errors 0
> Timeouted 46
> 
> Sources:
> Yesod:
> / HomeR GET
> |]
> 
> instance Yesod HelloWorld
> 
> getHomeR :: Handler ()
> getHomeR = do
>              number <- liftIO (randomIO :: IO Float)
>              let txt = pack $ "hello world " ++ show number
>              sendResponse (txt:: Text)
> 
> main :: IO ()
> main = warp 3838 HelloWorld
> 
> Mine:
> import Sockets
> import Foreign.C.String
> import Data.IORef
> import Control.Concurrent
> 
> main = do
>    ref <- newIORef 1
>    s <- socket defaultCallbacks {
>                                    constructor = \ci -> set_cb ci defaultCallbacks {
>                                        done_connected = binded ref,
>                                        done_reading = process
>                                        }
>                                 }
>    pl <- epoll 1000
>    pl1 <- epoll 1000
>    pl2 <- epoll 1000
>    pl3 <- epoll 1000
>    listen s "8080"
>    pl_accept pl s
>    pl_accept pl1 s
>    pl_accept pl2 s
>    pl_accept pl3 s
>    let run pl = do forkIO $
>                     run_loop pl (-1)
>    run pl
>    run pl1
>    run pl2
>    run_loop pl3 (-1)
> 
> binded ref pl s = do
>    i <- readIORef ref
>    putStrLn $ "connection nr:"++show i
>    writeIORef ref (i+1)
>    pl_read pl s
>    return 0
> 
> process pl s buf len = do
>        str <- peekCStringLen (buf,fromIntegral len)
>        ip <- client s
>        str1 <- peekCString ip
>        putStrLn $ "from "++str1++" \ngot "++str
>        write pl s "Hello World!!!\r\n"
>        return 0
> 
> if using -threaded performance is *worse*.
> 
> Greetings, Branimir.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20210925/0a1d96ec/attachment.html>


More information about the Haskell-Cafe mailing list