- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获得向量的摊销 O(n) 时间串联。它似乎正在工作,但如果我需要存储装箱值(例如向量),结果仍然很慢。
import qualified Data.Vector as V
import qualified Data.Vector.Generic.Mutable as GM
import Data.Vector(Vector)
import Control.Monad.State.Strict
import Control.Monad.ST
data App = S !(Vector Int) !Int deriving (Show)
main = do
x <- liftM (map read . words) getContents
print $ execState (mapM_ (add . V.singleton) x) (S V.empty 0)
add :: Vector Int -> State App ()
add v1 = do
S v2 n <- get
let v3 = vectorGrowAdd v1 v2 n
put (S v3 (n + V.length v1))
vectorGrowAdd v1 v2 n = runST $ do
m1 <- V.unsafeThaw v1
m2 <- V.unsafeThaw v2
m3 <- if GM.length m2 > (GM.length m1 + n)
then do
return m2
else do
GM.unsafeGrow m2 (GM.length m1 + 2*(GM.length m2))
let copyTo = GM.unsafeSlice n (GM.length m1) m3
GM.unsafeCopy copyTo m1
V.freeze m3
testVals
是一个包含 100000 个整数的文本文件,
Boxed.hs
是上面的代码和
Unboxed.hs
与
Boxed.hs
相同进口除外
Data.Vector.Unboxed
代替
Data.Vector
.
> ghc -v
Glasgow Haskell Compiler, Version 7.0.3
> ghc --make -O2 Boxed.hs
> time (cat testVals | ./Boxed.hs)
...
real 1m39.855s
user 1m39.282s
sys 0m0.252s
> ghc --make -O2 Unboxed.hs
> time (cat testVals | ./Unboxed.hs)
...
real 0m4.372s
user 0m4.268s
sys 0m0.088s
最佳答案
我不知道为什么它对盒装 Vector
有如此巨大的影响s,但你在上面浪费了很多时间
V.freeze m3
m3
的副本每一次。所以你复制了 100,000
Vector
s 的长度增加。你不再需要旧的了,所以它们被垃圾收集了。盒装垃圾收集
Vector
s 比收集未装箱的
Vector
花费的时间要长得多s 因为必须遵循所有指针才能查看是否也可以收集指针。不过,我对它产生的差异感到有些惊讶。
$ cat ./testVals | ./OldBoxed +RTS -t > Bxd.txt
<<ghc: 72590744976 bytes, 79999 GCs, 5696847/15655472 avg/max bytes residency (16 samples),
802M in use, 0.00 INIT (0.00 elapsed), 36.97 MUT (37.01 elapsed), 52.60 GC (52.67 elapsed) :ghc>>
$ cat ./testVals | ./OldUnboxed +RTS -t > UBxd.txt
<<ghc: 72518297568 bytes, 78256 GCs, 1013955/2294848 avg/max bytes residency (63 samples),
81M in use, 0.00 INIT (0.00 elapsed), 9.14 MUT (9.16 elapsed), 0.60 GC (0.60 elapsed) :ghc>>
freeze
通过
unsafeFreeze
,我们得到
$ cat ./testVals | ./Boxed +RTS -t > Bxd.txt
<<ghc: 1149880088 bytes, 2214 GCs, 5236803/17102432 avg/max bytes residency (11 samples),
39M in use, 0.00 INIT (0.00 elapsed), 0.53 MUT (0.53 elapsed), 0.29 GC (0.29 elapsed) :ghc>>
$ cat ./testVals | ./Unboxed +RTS -t > UBxd.txt
<<ghc: 1152277200 bytes, 2229 GCs, 767477/2267200 avg/max bytes residency (31 samples),
7M in use, 0.00 INIT (0.00 elapsed), 0.61 MUT (0.62 elapsed), 0.04 GC (0.04 elapsed) :ghc>>
Vector
所需的更改器(mutator)时间比未装箱时少。不过,GC 时间仍然要高得多,因此整体拆箱仍然更快,但在 0.66 秒与 0.82 秒之间,这并没有什么戏剧性的。
关于haskell - 为什么盒装向量这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978130/
我正在努力寻找任何教程来帮助我将 SurfaceView 放入盒子中。一个指向正确方向的指针会很棒——而不是通过它寻找一只手。 我希望能够在屏幕顶部分配一个区域,例如做按钮等,然后让表面 View 填
我需要一个返回所提供类类型实例的方法。让我们假设提供的类型被限制为可以创建它们的“空”实例。例如,提供 String.class 将返回一个空字符串,提供一个 Integer.class 将返回一个初
小问题:是否保证此代码始终打印 true? Boolean b1 = true; Boolean b2 = true; System.out.println(b1 == b2); boolean 值的
我昨晚在开发一个应用程序时遇到了一个特定的问题,我确信它可能有一个有效的算法来解决它。谁能推荐一下? 问题: TL;DR:也许图片会有所帮助:http://www.custom-foam-insert
我正在使用 ggplot2 开发一个图形,其中我需要将文本叠加在其他图形元素上。根据文本下方元素的颜色,文本可能难以阅读。有没有办法在半透明背景的边界框中绘制geom_text? 我可以用plotri
使用 rustc 1.10.0,我正在尝试编写一些绕过盒装闭包的代码——最终目标是按程序生成分形动画。现在我有一些像这样的函数签名: pub fn interpolate_rectilinear(wi
这个问题在这里已经有了答案: The trait bound `futures::Future, Error=Box>: Send` is not satisfied (1 个回答) Sending
我是一名优秀的程序员,十分优秀!