[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