- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的两段代码摘自RWH书籍的并发章节:
force :: [a] -> ()
force xs = go xs `pseq` ()
where go (_:xs) = go xs
go [] = 1
randomInts :: Int -> StdGen -> [Int]
randomInts k g = let result = take k (randoms g)
in force result `seq` result
randomInts
是一个生成随机数列表的函数,用于测试并行排序算法的性能。书中已经提到,他们避免了上述代码中的一些潜在问题。书上是这么说的:
Invisible data dependencies.
When we generate the list of random numbers, simply printing the length of the list would not perform enough evaluation. This wouls evaluate the spine of the list, but not its elements. The actual random numbers would not be evaluated until the sort compares them.
This can have serious consequences for performance. The value of a random number depends on the value of the preceding random number in the list, but we have scattered the list elements randomly among our processor cores. If we did not evaluate the list elements prior to sorting, we would suffer a terrible “ping pong” effect: not only would evaluation bounce from one core to another, performance would suffer.
Try snipping out the application of force from the body of main above: you should find that the parallel code can easily end up three times slower than the non-parallel code.
所以基本上他们是说,通过使用 force
函数,他们避免了乒乓问题。但在解释force函数时,他们再次这样描述:
Notice that we don't care what's in the list; we walk down its spine to the end, then use pseq once. There is clearly no magic involved here: we are just using our usual understanding of Haskell's evaluation model. And because we will be using force on the left hand side of par or pseq, we don't need to return a meaningful value.
从force
函数的定义和上面的解释可以看出,各个列表元素中的元素不会被求值。那么 randomInts 函数实际上是如何避免乒乓效应的呢?这是书中的错误还是我理解有误?
最佳答案
randomInts
实际上似乎并没有受到乒乓
效应的影响。函数force
实际上不仅是遍历列表的整个样条线,而且还对列表的元素进行求值。
import Control.Parallel (par, pseq)
force :: [a] -> ()
force xs = go xs `pseq` ()
where go (_:xs) = go xs
go [] = 1
在 ghci 中:
ghci > let a = [1..10]
ghci > :sprint a
a = _
ghci > force a
()
ghci > :sprint a
a = [1,2,3,4,5,6,7,8,9,10]
因此,force
函数会全面评估列表,使其免受乒乓效应的影响。
关于haskell - randomInts 是否受到乒乓效应的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22749951/
下面的两段代码摘自RWH书籍的并发章节: force :: [a] -> () force xs = go xs `pseq` () where go (_:xs) = go xs
请不要仅仅因为它只讨论随机函数就关闭这个问题。 嗨, 我有一个关于 d3.randomInt() 的虚拟问题; d3.randomInt() 的输出是一个函数而不是一个值。因此,要获得 0,10
我的第一个请求是:GET http://example.com?int={{$randomInt}} . 我需要向同一地址运行第二个请求(其中包含其他测试),因此我需要保存生成的变量。我该怎么做? 我
我是 Java 的新手,我反复尝试修复这个问题......我有三十个错误 * @(#)Input.java * * Input application * * @author * @version 1
我正在学习 Horstmann 的 java 书中的代码: Integer key = new Random().nextInt(elements.length) + 1; 令我困惑的是 +1 部分,
尝试创建一个随机数组以通过所有标准排序算法进行排序。 我不记得我以前是怎么解决这个问题的,最近电脑崩溃了,我的工作丢了。我知道我必须知道如何使用转换来包装一个 int 数组,但不记得具体是怎么做的。
我是一名优秀的程序员,十分优秀!