Note:首先要了解,Erlang里面的列表,比如 [1,2,3,4],其实是这样的方式来存储 [1,[2,[3,[4]]]],因此在头部插入一个元素,很简单,但是在尾部插入就比较困难了。
闲来对Erlang中的2个列表操作进行了测试,先上代码:
-module(test_list).
-compile(export_all).
main() ->
test_concat(),
test_flatten(),
test_append_tail(),
test_append_header().
test_concat() ->
statistics(wall_clock),
test_concat(1000000).
test_concat(0) ->
{_, Duration} = statistics(wall_clock),
io:format("Concat Duration ~pms~n", [Duration]),
ok;
test_concat(N) ->
"<title>" ++ integer_to_list(N) ++ "</title>",
test_concat(N-1).
test_flatten() ->
statistics(wall_clock),
test_flatten(1000000).
test_flatten(0) ->
{_, Duration} = statistics(wall_clock),
io:format("Flatten Duration ~pms~n", [Duration]),
ok;
test_flatten(N) ->
lists:flatten(["<title>",integer_to_list(N),"</title>"]),
test_flatten(N-1).
test_append_tail() ->
statistics(wall_clock),
test_append_tail(100000).
test_append_tail(0) ->
{_, Duration} = statistics(wall_clock),
io:format("Append tail Duration ~pms~n", [Duration]),
ok;
test_append_tail(N) ->
append_last([], 97, 122),
test_append_tail(N-1).
append_last(List, N, N) ->
List ++ [N];
append_last(List, Curr, N) ->
append_last(List ++ [Curr], Curr+1, N).
test_append_header() ->
statistics(wall_clock),
test_append_header(100000).
test_append_header(0) ->
{_, Duration} = statistics(wall_clock),
io:format("Append header Duration ~pms~n", [Duration]),
ok;
test_append_header(N) ->
append_header_and_reverse([], 97, 122),
test_append_header(N-1).
append_header_and_reverse(List, N, N) ->
lists:reverse([N|List]);
append_header_and_reverse(List, Curr, N) ->
append_header_and_reverse([Curr|List], Curr+1, N).
test_concat() 和 test_flatten(),测试使用 ++ 构造一个 list,和使用 lists:flatten() 构造list的开销;test_append_tail() 和 test_append_header(), 测试使用 ++ 和 [H|T]再lists:reverse() 方式将大量字符构造成一个列表的开销。
引用
1> c(test_list).
{ok,test_list}
2> test_list:main().
Concat Duration 1637ms
Flatten Duration 6743ms
Append tail Duration 2144ms
Append header Duration 624ms
ok
3> c(test_list, [native]).
{ok,test_list}
4> test_list:main().
Concat Duration 863ms
Flatten Duration 6084ms
Append tail Duration 1974ms
Append header Duration 362ms
ok
可见,使用 ++ 合并列表,比使用 lists:flatten() 高效;而使用[H|T]再lists:reverse()的方式比 ++ 高效。使用HIPE编译后,++操作和[H|T]操作的性能也得到了较大的提高。
经常在Erlang的程序代码里面看到类似
foo([], List) ->
lists:reverse(List);
foo([H|T], List) ->
...
foo(T, [H|List])
这样的代码,里面就是使用了头部插入,然后反转列表的方式。
分享到:
相关推荐
本简易性能测试报告主要关注接口性能,适用于功能测试工程师和性能测试工程师进行参考。 1. **请求接口**: - 在这个测试中,测试的对象是一个用于匹配平台话费商品的接口,具体表现为(pre环境)的域名加上特定的...
本入门指南将带你走进性能测试的世界,了解其基本概念、重要性以及如何进行实际操作。 一、性能测试定义与目的 性能测试是一种评估软件系统在特定工作负载下的性能表现的测试类型。它关注的是系统处理能力、响应...
"JMeter性能测试-day04-all"可能涵盖分布式测试,这是在大规模并发测试时非常重要的一个特性。通过在多台机器上运行JMeter,可以模拟更多的并发用户,更准确地评估系统在高负载下的表现。 "JMeter性能测试-day05-...
CS 架构性能测试 CS 架构性能测试是对客户/服务器软件的测试,旨在评估软件的性能、可靠性和安全性。测试通常发生在三个不同的层次:个体的客户端应用、客户端软件和关联的服务器端应用、完整的 C/S 体系结构。 ...
【性能测试-Jmeter.pptx】的培训内容涵盖了性能测试的多个重要环节,包括数据制造、性能测试方案设计、脚本执行、性能监控与调优以及编写性能测试报告。以下是对这些知识点的详细阐述: 1. **如何制造数据**: - ...
"Linux内存性能测试工具stream"是一个专门用于评估计算机内存(RAM)性能的工具。本文将深入探讨STREAM的作用、工作原理以及如何在Linux环境中使用它。 STREAM,全称是“Simple Triad Memory Benchmark”,是由John...
以下是对如何简单完成一个性能测试的详细解析: 1. **前期准备**:在需求阶段就需要性能测试人员参与,了解系统业务和关键功能的业务逻辑,以便后续工作。 2. **性能需求分析(评审)**:明确测试范围和目标,这...
总结,这个NFS性能测试工具以其简易的操作和全面的功能,为IT专业人员提供了一个有力的测试助手。无论是日常维护还是项目优化,都能显著提升工作效率,确保NFS服务在各种复杂环境下的稳定和高效。
性能测试参数化设置是软件测试领域中一个关键的实践,主要目的是模拟真实环境中用户的不同行为和数据输入,提高测试的覆盖率和准确性。在性能测试中,我们常常需要为多个虚拟用户分配不同的数据,以反映实际的并发...
- **闭环流程图**:展示了一个闭环反馈机制,用于不断改进性能测试过程。 - **TPS计算公式**:通过交易每秒(Transactions Per Second, TPS)来衡量系统处理能力。 - **影响因子**:列出可能影响系统性能的各种因素...
Web模型与性能测试的研究分析: Web的起源与发展: Web是互联网上的一种应用,它起源于1989年,由英国科学家蒂姆·伯纳斯-李提出。Web的发展经历了多个阶段,从最初简单的文档分享,到如今包括多媒体交互、社交网络...
其中,性能测试作为软件测试的一个重要分支,对于评估软件在特定负载条件下的表现至关重要。 #### 二、性能测试概述 ##### 2.1 软件测试概述 软件测试是为了发现软件中的错误或缺陷而执行程序的过程。它包括多种...
测试中使用的软件工具为pgbench,它是PostgreSQL自带的一个简单但功能强大的性能测试工具。pgbench可以通过执行一系列预定义的SQL命令来模拟不同的工作负载,并测量事务处理的速度。默认情况下,它模拟了一个类似于...
MySQL性能测试工具是数据库管理员和开发人员用于评估MySQL数据库系统性能的重要工具。这些工具通过模拟大量并发用户执行各种SQL操作,如插入(增)、删除、更新(改)和查询(查),来测量数据库的响应时间、吞吐量...