[Haskell-cafe] mine sockets lib vs yesod

Branimir Maksimovic branimir.maksimovic at gmail.com
Sun Sep 26 15:29:43 UTC 2021


just to translate all thing into Haskell, I have it whole in Rust currently:
https://github.com/bmaxa/web_server_rust <https://github.com/bmaxa/web_server_rust>

Greets, Branimir.

> On 26.09.2021., at 17:27, Carter Schonwald <carter.schonwald at gmail.com> wrote:
> 
> That would be fun to share ! Look forward to learning what’s different 
> 
> On Sat, Sep 25, 2021 at 3:51 AM Branimir Maksimovic <branimir.maksimovic at gmail.com <mailto:branimir.maksimovic at gmail.com>> wrote:
> 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 <mailto: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.
> 
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe <http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe>
> Only members subscribed via the mailman list are allowed to post.

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


More information about the Haskell-Cafe mailing list