Haskell 中判断一个整数是否在某个闭区间内哪种方法更快,>= && <=,还是 elem ?
假设我有一个整数 x,我要判断该整数是否在 [1, limit] 这个区间内,在 Haskell 中我能想到两种方案:
x >= 1 and x <= limit
elem x [1..limit]
我使用了 GCI 的 Profiling,代码如下:
main = do
print $ {-# SCC larger_than #-} lth 10000
print $ {-# scc in_range #-} inr 10000
lth :: Integer -> Bool
lth x = (x >= 1 && x <= 65535000000000)
inr :: Integer -> Bool
inr x = let m = 65535000000000::Integer in
x `elem` [1..m]
显示的结果:
不知方法对不对,请问两种方案哪一种更快?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
没想到SF有Haskell问题:)
其实你看Profiling的结果,
in_range
的inherited %time
和inherited %alloc
都比larger_than
大,占了整个程序执行的100%和93.3%。所以第一种方法快。写个rewrite rule也许可以对
elem
和enumFromTo
进行优化。试了写rewrite rule,发现enumFromTo有inline,导致rewrite rule没有生效,所以先自己实现一个
myEnumFromTo
看看效果:Profile结果是这样的:
还不知道怎让才能对
enumFromTo
生效:(