- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑制作 foldl
适用于无限列表,适用于您无法获得 protected 递归但根据第一个参数可能不会使用第二个参数的情况。
例如乘法,通常你需要两个参数并且保护递归不起作用,但是如果第一个参数是 0 你可以短路。
所以我写了以下函数:
foldlp :: (b -> a -> b) -> (b -> Bool) -> b -> [a] -> b
foldlp f p = go where
go b [] = b
go b (x : xs)
| p b = go (f b x) xs
| otherwise = b
mult :: Integer -> Integer -> Integer
mult 0 _ = 0
mult x y = x * y
main :: IO ()
main = print . <test_function>
-prof -fprof-auto -O2
得到的结果,
+RTS -p
是:
foldlp mult (/= 0) 1 $ replicate (10 ^ 7) 1
total time = 0.40 secs
total alloc = 480,049,336 bytes
foldlp mult (`seq` True) 1 $ replicate (10 ^ 7) 1
total time = 0.37 secs
total alloc = 480,049,336 bytes
foldl' mult 1 $ replicate (10 ^ 7) 1
total time = 0.37 secs
total alloc = 480,049,352 bytes
foldl mult 1 $ replicate (10 ^ 7) 1
total time = 0.74 secs
total alloc = 880,049,352 bytes
foldr mult 1 $ replicate (10 ^ 7) 1
total time = 0.87 secs
total alloc = 880,049,336 bytes
0
时立即终止, 也一样
foldr
,但是
foldr
慢得多。
((1 + 2) + 3, (10 + 20) + 30)
技术上在 WHNF,打破
foldl'
.
foldl
与
flip foldl (const True)
和
foldl'
与
flip foldl (
序列
True)
.而原来受限功能的性能特征似乎是通过这样做重新获得的。
foldlp
将是对
Foldable
的一个有值(value)的补充.
{-# INLINE foldlp #-}
时功能性能显着下降,给我:
foldlp mult (/= 0) 1 $ replicate (10 ^ 7) 1
total time = 0.67 secs
total alloc = 800,049,336 bytes
最佳答案
根据 the GHC docs INLINE
pragma 会阻止其他编译器优化,以便仍然让重写规则生效。
所以我的猜测是,通过使用 INLINE
您删除了一些优化,GHC 会应用这些优化来使您的代码更快。
在内核中进行一些探索(在编译中使用 -ddump-simpl
)后,我找到了 GHC 执行的优化。为此,我查看了 foldlp
的核心。有内联和无内联:
内联:
foldlp =
\ (@ b_a10N)
(@ a_a10O)
(eta_B2 :: b_a10N -> a_a10O -> b_a10N)
(eta1_B1 :: b_a10N -> Bool)
(eta2_X3 :: b_a10N)
(eta3_X5 :: [a_a10O]) ->
letrec {
go_s1Ao [Occ=LoopBreaker] :: b_a10N -> [a_a10O] -> b_a10N
[LclId, Arity=2, Str=DmdType <L,U><S,1*U>]
go_s1Ao =
\ (b1_avT :: b_a10N) (ds_d1xQ :: [a_a10O]) ->
-- Removed the actual definition of go for brevity,
-- it's the same in both cases
}; } in
go_s1Ao eta2_X3 eta3_X5
foldlp =
\ (@ b_a10N)
(@ a_a10O)
(f_avQ :: b_a10N -> a_a10O -> b_a10N)
(p_avR :: b_a10N -> Bool) ->
letrec {
go_s1Am [Occ=LoopBreaker] :: b_a10N -> [a_a10O] -> b_a10N
[LclId, Arity=2, Str=DmdType <L,U><S,1*U>]
go_s1Am =
\ (b1_avT :: b_a10N) (ds_d1xQ :: [a_a10O]) ->
-- Removed the actual definition of go for brevity,
-- it's the same in both cases
}; } in
go_s1Am
foldlp
的步骤。调用
go
并且只是从 foldlp 中创建一个带有两个参数的函数,该函数返回一个带有两个参数的函数。内联不会执行此优化,并且核心看起来与您编写的代码完全相同。
foldlp
的三个变体来验证这一点。 :
module Main where
foldlp :: (b -> a -> b) -> (b -> Bool) -> b -> [a] -> b
foldlp f p = go where
go b [] = b
go b (x : xs)
| p b = go (f b x) xs
| otherwise = b
{-# INLINE foldlpInline #-}
foldlpInline :: (b -> a -> b) -> (b -> Bool) -> b -> [a] -> b
foldlpInline f p = go where
go b [] = b
go b (x : xs)
| p b = go (f b x) xs
| otherwise = b
{-# INLINE foldlp' #-} -- So that the code is not optimized
foldlp' b [] = b
foldlp' b (x : xs)
| (/= 0) b = foldlp' (mult b x) xs
| otherwise = b
mult :: Integer -> Integer -> Integer
mult 0 _ = 0
mult x y = x * y
--main = print $ foldlp mult (/= 0) 1 $ replicate (10 ^ 7) 1
--main = print $ foldlpInline mult (/= 0) 1 $ replicate (10 ^ 7) 1
main = print $ foldlp' 1 $ replicate (10 ^ 7) 1
./test 0,42s user 0,01s system 96% cpu 0,446 total
./test 0,83s user 0,02s system 98% cpu 0,862 total
./test 0,42s user 0,01s system 99% cpu 0,432 total
关于haskell - 为什么添加 INLINE 会减慢我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39991318/
看看这个 fiddle http://jsfiddle.net/9S4zc/2/ 为什么这在 firefox 和 chrome 中看起来不同(文本对齐方式不同) 如何让 inner:before 元素
我从文档中了解到的是 %{ %} 之间的内容。被插入到包装器中,%inline %{ %} 呢? ? 是一样的吗?如果不是,有什么区别? 也许我们可以找到很多%inline %{ %}的出现。但仅出现
当我使用 显示:inline-flex; 或 显示:内联网格; 似乎有一些额外的“空间”或某种额外的重点计算发生。我不确定到底发生了什么。当使用箭头键在 contentediatble div 中导航
如果我想让一个 div 与容器 div 的其他内联元素内联,而我的目的仅此而已,我应该更喜欢使用 inline-block 或 display property 还是 inline-flex?不能使用
这个问题在这里已经有了答案: Why does an inline-block align to top if it has no content? (2 个答案) 关闭 8 年前。
Ada 信息交换所 states the following : The use of pragma Inline does have its disadvantages. It can create
Name
我问这个基本问题是为了让记录更正。已转介 this question和 its currently accepted answer ,这没有说服力。然而second most voted answer
你好, 在管理面板中,我创建了用于添加产品的表单。表单包括 2 个内联表单集,因为有一些与产品相关的模型。用户可以创建产品,然后定义该产品的不同属性的变体。我将举例说明这一点。用户拥有一个品牌的 3
有很多关于 inline 的使用以及如何正确执行此操作以达到所需目的的信息,例如此处(我目前将其用作引用)Inline Functions in C . 当我尝试实现页面中指定的内容时,出现编译器错误
我正在编写 gtk 代码。我经常有不需要闭包的简短回调,因为它们传递了它们需要的所有参数。例如,我在创建一些 gtk.TreeViewColumns 时将其置于循环中: def widthChange
这个问题在这里已经有了答案: What is the difference between display: inline and display: inline-block? (7 个答案) 关闭
我已经搜索了很长时间来找到答案,但是我没有找到解决方案... 我制作了一个无序列表的链接,并将它们放在标题下,就像导航栏一样。然而,在 IE 中(是的那个恶魔..)我的链接似乎没有对齐到中间。下面是我
我想将两张 table 并排放置。由于我不是 floating 或使用“css hacks”的忠实拥护者,您有什么建议?没有它是否可以解决,还是我运气不好? 最佳答案 使用 table-cell显示以
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) 关闭 6 年前。
CSS display 的 inline 和 inline-block 值到底有什么区别? 最佳答案 视觉答案 想象一个 中的元素.如果你给 例如,元素高度为 100px 和红色边框,它看起来像这
我想使用 /纯 CSS 弹出窗口的标签,但是 表现为内联 block ,我无法将其更改为内联。 有没有办法强制表现得像 display:inline 而不是 inline-block?
我的想法是这是不可能的,或者我缺少一个额外的步骤。无论哪种方式,我都被卡住了,无法弄清楚。 使用内联模板的原因是能够使用 Laravel Blade 语法并结合 Vue Js 的强大功能。似乎是两者中
http://christianselig.com/wp/ 对于主导航,如果我使用 display: inline,它们将显示为 block 。我心血来潮添加了 display: inline-blo
Firefox 的 -moz-inline-box 和 -moz-inline-stack 专有显示值有什么区别? 最佳答案 https://developer.mozilla.org/en/CSS/
我是一名优秀的程序员,十分优秀!