gitit performance: happstack vs yesod

I've been working on a port of gitit to Yesod, which is currently called gitit2 (https://github.com/jgm/gitit2). At this point I have implemented most of the basic wiki functionality. I've really been enjoying some of Yesod's features -- especially the type-safe URLs, form support, internationalization, and widgets -- and the code is much cleaner and shorter than the original gitit code. But today I thought I'd look at performance, and I was surprised to find that gitit2 is considerably slower than the original gitit (built on happstack). For example, on one simple test page, siege recorded 9 transactions per second for gitit2, 18 for the original gitit. (This is with caching turned off, so each hit involves getting content from the git repository, parsing it, and creating an HTML wiki page. Of course most of that work is done by filestore and pandoc, which are used by both gitit and gitit2.) I'm really curious why gitit2 is so much slower, and I wonder whether I'm making some basic mistake. At this point most of the code is in one module, https://github.com/jgm/gitit2/blob/master/Network/Gitit2.hs . This defines a Yesod subsite which is wrapped by a Yesod site in the main executable, https://github.com/jgm/gitit2/blob/master/src/gitit2.hs . The benchmark I did just involved fetching the front page, so most of the handlers are irrelevant. If anyone has any useful ideas, I'd be grateful. John

Never mind -- I've traced the slowness to a difference unrelated to happstack and Yesod. Once I get this sorted out, I'll post here about the new benchmarks. John +++ John MacFarlane [Jul 06 12 19:50 ]:
I've been working on a port of gitit to Yesod, which is currently called gitit2 (https://github.com/jgm/gitit2). At this point I have implemented most of the basic wiki functionality.
I've really been enjoying some of Yesod's features -- especially the type-safe URLs, form support, internationalization, and widgets -- and the code is much cleaner and shorter than the original gitit code. But today I thought I'd look at performance, and I was surprised to find that gitit2 is considerably slower than the original gitit (built on happstack). For example, on one simple test page, siege recorded 9 transactions per second for gitit2, 18 for the original gitit. (This is with caching turned off, so each hit involves getting content from the git repository, parsing it, and creating an HTML wiki page. Of course most of that work is done by filestore and pandoc, which are used by both gitit and gitit2.)
I'm really curious why gitit2 is so much slower, and I wonder whether I'm making some basic mistake. At this point most of the code is in one module, https://github.com/jgm/gitit2/blob/master/Network/Gitit2.hs . This defines a Yesod subsite which is wrapped by a Yesod site in the main executable, https://github.com/jgm/gitit2/blob/master/src/gitit2.hs . The benchmark I did just involved fetching the front page, so most of the handlers are irrelevant. If anyone has any useful ideas, I'd be grateful.
John
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel

The problem (an extra call to filestore's 'latest' in 'getRawContents') is fixed with the latest github code. With the fix, gitit2 (yesod) comes out slightly faster than gitit (happstack) -- by about a 7/6 ratio in one test. That's what I had expected originally. +++ John MacFarlane [Jul 07 12 09:27 ]:
Never mind -- I've traced the slowness to a difference unrelated to happstack and Yesod. Once I get this sorted out, I'll post here about the new benchmarks.
John
+++ John MacFarlane [Jul 06 12 19:50 ]:
I've been working on a port of gitit to Yesod, which is currently called gitit2 (https://github.com/jgm/gitit2). At this point I have implemented most of the basic wiki functionality.
I've really been enjoying some of Yesod's features -- especially the type-safe URLs, form support, internationalization, and widgets -- and the code is much cleaner and shorter than the original gitit code. But today I thought I'd look at performance, and I was surprised to find that gitit2 is considerably slower than the original gitit (built on happstack). For example, on one simple test page, siege recorded 9 transactions per second for gitit2, 18 for the original gitit. (This is with caching turned off, so each hit involves getting content from the git repository, parsing it, and creating an HTML wiki page. Of course most of that work is done by filestore and pandoc, which are used by both gitit and gitit2.)
I'm really curious why gitit2 is so much slower, and I wonder whether I'm making some basic mistake. At this point most of the code is in one module, https://github.com/jgm/gitit2/blob/master/Network/Gitit2.hs . This defines a Yesod subsite which is wrapped by a Yesod site in the main executable, https://github.com/jgm/gitit2/blob/master/src/gitit2.hs . The benchmark I did just involved fetching the front page, so most of the handlers are irrelevant. If anyone has any useful ideas, I'd be grateful.
John
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
participants (1)
-
John MacFarlane