【发布时间】:2014-05-21 19:50:46
【问题描述】:
所以基本上我在我的 ocaml 程序中使用列表,最初它是这样的:
val mutable ll : string list = []
.....
ll <- ll@[(foo ar1 ar2)]
然后在相对较大的数据集(超过 50k)上进行测试时,我的程序运行速度太慢了。
我还以为是因为上面代码中有一个整个列表复制的过程,(每次ll <- ll@[]时)
所以我以这种方式更改了我的代码:
ll <- (foo ar1 ar2)::ll (* extend the head for N times *)
.....
List.rev ll
但是,令我惊讶的是,似乎没有明显的性能提升..
然后我尝试了这样的数组:
let arr = Array.make len "" in
arr.(counter) <- (foo ar1 ar2);
counter := !counter + 1
.....
Array.to_list arr
以我的理解,应该比第一种方法好,但是,可能是因为我的代码中可能存在其他低性能错误,即使我更改了我的list操作代码,我仍然无法显式提高性能在上述方法中..
所以我的问题是,理论上,在上述三种策略中,哪一种表现最好?
我自己应该可以做一些实验,但是作为一个更笼统的问题,在处理相关问题上有没有更好的性能策略?
【问题讨论】:
-
“所以我以这种方式更改了我的代码:”要么你解释错了,而且你正在对
List.rev进行 N 次调用,正如 Jeffrey 似乎假设的那样。或者您执行了错误的操作并且您没有测试此代码(编译器是否可能发出错误并让您执行以前的版本?)。ll <- x::ll是恒定时间且非常便宜。 -
嗨@PascalCuoq,是的,我解释错了,我将头部延长了N次然后做了一次
List.rev
标签: arrays performance linked-list ocaml