yesod / yesod-core / widget-benchmark

本文通过使用 Haskell 语言实现了一个包含大量表格数据的 Web 页面,并对比了使用不同技术 (如 HTML 直接渲染、Hamlet 模板、Widget 框架及 Blaze 构建器) 的渲染效率。
摘要由CSDN通过智能技术生成
main = defaultMain
    [ bench "bigTable html" $ nf bigTableHtml bigTableData
    , bench "bigTable hamlet" $ nf bigTableHamlet bigTableData
    , bench "bigTable widget" $ nf bigTableWidget bigTableData
    , bench "bigTable blaze" $ nf bigTableBlaze bigTableData
    ]
  where
    rows :: Int
    rows = 1000
 
    bigTableData :: [[Int]]
    bigTableData = replicate rows [1..10]
    {-# NOINLINE bigTableData #-}
 
bigTableHtml rows = L.length $ renderHtml [$hamlet|
<table
    $forall row <- rows
        <tr
            $forall cell <- row
                <td>#{show cell}
|]
 
bigTableHamlet rows = L.length $ renderHamlet id [$hamlet|
<table
    $forall row <- rows
        <tr
            $forall cell <- row
                <td>#{show cell}
|]
 
bigTableWidget rows = L.length $ renderHtml $ (run [$hamlet|
<table
    $forall row <- rows
        <tr
            $forall cell <- row
                <td>#{show cell}
|]) (\_ _ -> "foo")
  where
  run (GWidget w) =
    let (_, _, GWData (Body x) _ _ _ _ _ _) = runRWS w () 0
     in x
  {-
  run (GWidget w) = runIdentity $ do
    w' <- flip evalStateT 0
        $ runWriterT $ runWriterT $ runWriterT $ runWriterT
        $ runWriterT $ runWriterT $ runWriterT w
    let ((((((((),
         Body body),
         _),
         _),
         _),
         _),
         _),
         _) = w'
 
    return body
    -}
 
bigTableBlaze t = L.length $ renderHtml $ table $ mconcat $ map row t
  where
    row r = tr $ mconcat $ map (td . string . show) r

 

转载于:https://www.cnblogs.com/kelby/archive/2012/03/19/2405842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值