首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈姆雷特模板的编译时与运行时成本

哈姆雷特模板的编译时与运行时成本
EN

Stack Overflow用户
提问于 2015-06-08 23:44:47
回答 3查看 180关注 0票数 9

对于哈姆雷特模板机制,我了解到在编译时对模板进行了解析,从而生成了源代码,其中包含对blaze-html组合器的调用(可能还有其他由于插值而产生的表达式)。因此,插值发生的点(子树)在编译时就知道了。

在运行时,我们需要计算插值值(当然),并将其插入到树中,即应用html组合器。所有的人?实际上,其中一些应用程序可以在编译时进行评估(那些在它们下面没有插值的应用程序)。会发生这种事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-09 03:12:17

我已经有一段时间没有编写代码了,所以不要把它当作是授权的(正如Daniel提到的,-ddump-simpl是一个很好的调用)。但我不相信我们使用的是blaze html组合器,而是数据类型。Hamlet本身在编译时尽可能多地连接字符串,以避免运行时的开销。我知道我上一次基准测试(这是几年前)的时候,这种优化确实取得了很好的效果。

票数 7
EN

Stack Overflow用户

发布于 2015-06-09 00:03:38

可能不是:您所要求的听起来很像部分评估(不要与部分应用程序混淆),这是一个编译器-性能雷区,因此经常避免。但是您可以自己检查;使用-ddump-simpl和首选的优化级别来查看GHC生成的核心。

票数 5
EN

Stack Overflow用户

发布于 2015-06-09 08:33:05

正如Michael所说:"Hamlet本身在编译时尽可能多地连接字符串,以避免运行时的开销。“

书中的例子是,

代码语言:javascript
复制
main = putStrLn $ renderHtml [shamlet|
<p>Hello, my name is #{name person} and I am #{show $ age person}.
<p>
    Let's do some funny stuff with my name: #
    <b>#{sort $ map toLower (name person)}
<p>Oh, and in 5 years I'll be #{show ((+) 5 (age person))} years old.
|]
  where
    person = Person "Michael" 26

-ddump-simpl包含以下内容:

代码语言:javascript
复制
               (>>
                  @ Text.Blaze.Internal.MarkupM
                  Text.Blaze.Internal.$fMonadMarkupM
                  @ ()
                  @ ()
                  (id
                     @ (Text.Blaze.Internal.MarkupM ())
                     (. @ Data.Text.Internal.Text
                        @ Text.Blaze.Internal.Markup
                        @ String
                        Text.Blaze.Internal.preEscapedText
                        Data.Text.pack
                        (GHC.CString.unpackCString#
                           ".</p>\n\
                           \<p>Let's do some funny stuff with my name: <b>"#)))

实际上,这不是HTML的语法树(最后一行--字符串包含一个结束标记和下一个开始标记)。

这个哈姆雷特功能应该做更多的广告!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30720812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档