- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我这样写 map_tail
的尾递归版本:
let map_tail f l =
let rec map acc = function
| [] -> List.rev acc
| hd::tl -> map (f hd :: acc) tl
in
map [] l
然后是一个基于数组的 map_by_array
:
let map_by_array f l =
Array.of_list l |> Array.map f |> Array.to_list
这是基准代码
let ran_list n =
Random.self_init();
let rec generate acc i =
if i = n then acc
else generate (Random.int 5::acc) (i+1)
in
generate [] 0
let _ =
let l = ran_list 10000000 in
let f x = x+1 in
let t1 = Sys.time() in
let l1 = map_tail f l in
let t2 = Sys.time() in
let l2 = map_by_array f l in
let t3 = Sys.time() in
Printf.printf "map_tail: %f sec\nmap_by_array: %f sec\n" (t3-.t2) (t2-.t1)
我发现基于数组的 map 速度更快,这让我有点吃惊。
在map_tail
中,它遍历列表两次
,而map_by_array
遍历列表三次
,为什么还是更快?
最佳答案
这可能取决于列表的大小。
在大小为 N 的长列表上,map_tail
将进行 2*N 分配(映射期间为 N,然后为 List.rev
),而 map_by_array
将执行 N+2 分配(1 个用于 Array.of_list
,1 个用于 Array.map
和 N for Array.to_list
,实际上,也可以优化为只进行一次分配)。
由于分配可能是此代码中最昂贵的操作,因此这种差异应该可以解释性能差异。
关于ocaml - 为什么 Array.map 比尾递归映射(相当)快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676544/
假设已经定义了一个 Point2D 类来存储具有 x 和 y 坐标(均为 double )的二维点。该类包括以下成员: 您的任务是通过添加适当的compareTo 方法将该类修改为Comparable
首先,设计:我需要某种树,其中每个节点可以有任意数量的子节点。每个节点携带一个有效负载。节点的总负载是特定节点的负载+其所有祖先直到根节点的负载。 预期在树上执行的操作有:插入、更新、删除(相当频繁)
如果您愿意,可以快速提问或发表意见。 我需要为数据库表生成一些 UUID。 自动递增键不会削减它,因为我还需要键在数据库和系统中是唯一的。 UUID 工作正常,但它的输出对于行将导出到的某些系统来说太
我这样写 map_tail 的尾递归版本: let map_tail f l = let rec map acc = function | [] -> List.rev acc |
我正在为我当前的项目编写自己的测试运行程序。一个特性(这可能在测试运行器中很常见)是每个测试用例都在子进程中执行,因此测试运行器可以正确检测并报告崩溃的测试用例。 我还想测试测试运行器本身,因此一个测
内存中的 H2 - 插入 - 错误 42000 尝试过版本 1.4.196、1.4.197、1.4.199。 我还尝试在 H2 服务器(本地)上执行 INSERT:也失败 给出错误的行:(抱歉,出于安
我正在评估从 Joda-Time 的使用中迁移我的项目到java.time package在 Java 8 。在 Joda-Time 中,我大量使用了 Interval类(class)。我在 java
我是 C# 新手 -- 不到 50 行代码。 所以问题是 C# 中的 ArrayList 是 Java 中 ArrayList 的一个很好的替代品。 以下是我注意到的一些差异: C# 中的 Array
我需要在一个包含将近 100 万条条目的表中进行查询,但有趣的部分只有前 500 条。 我想知道在查询行的末尾使用 Take() 方法是否是速度(和内存)优化方面的最佳选择,或者只是执行整个查询然后获
我从另一篇文章中读到,c++11 提供了闭包功能。据我了解,闭包非常类似于具有私有(private)成员和公共(public)方法的对象。如果不是,那么它有何不同? 最佳答案 闭包是一种从外部作用域访
我是一名优秀的程序员,十分优秀!