gpt4 book ai didi

haskell - 如何防止GHC共享?

转载 作者:行者123 更新时间:2023-12-03 17:23:17 25 4
gpt4 key购买 nike

我试图找到打破haskell中顶级常量共享的方法,但到目前为止,这些方法都无效:

module Main where

import Debug.Trace

x1 :: Int
x1 = trace "Eval1" $ 10 + 10

x2 :: () -> Int
x2 = \() -> trace "Eval2" $ 10 + 10

x3 :: () -> Int
x3 () = trace "Eval3" $ 10 + 10

x4 :: () -> Int
x4 () = v
where v = trace "Eval4" $ 10 + 10

x5 :: () -> Int
x5 = \() -> v
where v = trace "Eval5" $ 10 + 10

x6 :: () -> Int
x6 () = let v = trace "Eval6" $ 10 + 10 in v

x7 :: () -> Int
x7 = let v = trace "Eval7" $ 10 + 10 in \() -> v

x8 :: () -> Int
x8 = \() -> let v = trace "Eval8" $ 10 + 10 in v


f :: Int -> Int -> Int
f y z = y + z

main :: IO ()
main = do
putStrLn "Start"

print (f x1 3)
print (f x1 4)

print (f (x2 ()) 3)
print (f (x2 ()) 4)

print (f (x3 ()) 3)
print (f (x3 ()) 4)

print (f (x4 ()) 3)
print (f (x4 ()) 4)

print (f (x5 ()) 3)
print (f (x5 ()) 4)

print (f (x6 ()) 3)
print (f (x6 ()) 4)

print (f (x7 ()) 3)
print (f (x7 ()) 4)

print (f (x8 ()) 3)
print (f (x8 ()) 4)


我发现在我将 {-# INLINE#-}编译指示放到定义上时,它破坏了共享(然后对所有定义都起作用)。

所以我的问题是:是否有另一种方法可以打破haskell与GHC中不涉及 INLINE编译指示的顶级常量的共享?是否保证即使在更大的定义下,放置 INLINE实用程序也会破坏共享?如果没有,有没有保证的方法?

我为什么需要这个?例如,当我编写一个基准时,我有一个遍历的树结构。该结构不应在基准测试的运行之间共享,因为构建它是基准的一部分。

最佳答案

我得到了您的示例,以避免与-O2 -fno-full-laziness -fno-cse共享。我怀疑总体而言这是否足够,但请为您的特定应用提供帮助。

(请注意,即使未进行任何优化,也共享x1x5,因为它们的结构显式共享计算)。

关于haskell - 如何防止GHC共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21891096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com