热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SMP与小消息大计算的测试

代码:ViewCode1-module(lib_misc).2-export([pmap2]).3-import(lists,[foreach2]).45pmap(F

代码:

View Code

1 -module(lib_misc).
2 -export([pmap/2]).
3 -import(lists, [foreach/2]).
4
5 pmap(F, L) ->
6 S = self(),
7 %%Ref = erlang:make_ref(),
8 lists:foreach(fun(I)->
9 spawn(fun() ->do_f(S, F, I) end)
10 end, L),
11 gether(length(L), []).
12
13 do_f(P, F, I) ->
14 P ! {self(), catch F(I)}.
15
16 gether(0, L) -> L;
17 gether(Len, L) ->
18 receive
19 {_Pid, I} -> gether(Len-1, [I|L])
20 end.

 

View Code

1 -module(ptests).
2 -export([tests/1, fib/1, simple/1]).
3 -import(lists, [map/2]).
4 -import(lib_misc, [pmap/2]).
5
6 tests([N]) ->
7 Nsched = list_to_integer(atom_to_list(N)),
8 run_tests(1, Nsched).
9
10 run_tests(N, Nsched) ->
11 case test(N) of
12 stop ->
13 init:stop();
14 Val ->
15 io:format("~p,~n", [{Nsched, Val}]),
16 run_tests(N+1, Nsched)
17 end.
18
19 test(1) ->
20 seed(),
21 S = lists:seq(1, 100),
22 L = map(fun(_) -> mkList(1000) end, S),
23 {Time1, S1} = timer:tc(lists, map, [fun lists:sort/1, L]),
24 {Time2, S2} = timer:tc(lib_misc, pmap, [fun lists:sort/1, L]),
25 {sort, Time1, Time2, equals(S1, S2)};
26 test(2) ->
27 L = lists:duplicate(100, 27),
28 {Time1, S1} = timer:tc(lists, map, [fun ptests:fib/1, L]),
29 {Time2, S2} = timer:tc(lib_misc, pmap, [fun ptests:fib/1, L]),
30 {fib, Time1, Time2, equals(S1, S2)};
31 test(3) ->
32 L = lists:duplicate(100, 27),
33 {Time1, S1} = timer:tc(lists, map, [fun ptests:simple/1, L]),
34 {Time2, S2} = timer:tc(lib_misc, pmap, [fun ptests:simple/1, L]),
35 {simp, Time1, Time2, equals(S1, S2)};
36 test(4) ->
37 stop.
38
39 equals(S, S) -> true;
40 equals(S1, S2) when S1 /= S2-> different.
41
42 fib(0) -> 0;
43 fib(1) -> 1;
44 fib(N) -> fib(N-1) + fib(N-2).
45
46 simple(N) -> N*2.
47
48 seed() -> random:seed(44, 55, 66).
49
50 mkList(K) -> mkList(K, []).
51 mkList(0, L) -> L;
52 mkList(N, L) -> mkList(N-1, [random:uniform(1000000) | L]).

 

执行脚本:

1 #! /bin/sh
2 echo "">results
3 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
4 do
5 echo $i
6 erl -noshell -smp +S $i -s ptests tests $i >> results
7 done


其中的一次执行结果:(经过我整理,便以查看,如下:)

View Code

1 {1, {sort,46801,53680,different}},
2 {2, {sort,46816,34387,different}},
3 {3, {sort,47577,22461,different}},
4 {4, {sort,49070,24194,different}},
5 {5, {sort,46981,21199,different}},
6 {6, {sort,48144,21853,different}},
7 {7, {sort,51281,21976,different}},
8 {8, {sort,47351,16202,different}},
9 {9, {sort,49418,18515,different}},
10 {10,{sort,47851,18385,different}},
11 {11,{sort,47211,17063,different}},
12 {12,{sort,51277,16826,different}},
13 {13,{sort,48071,17808,different}},
14 {14,{sort,47557,19034,different}},
15 {15,{sort,47976,16434,different}},
16 {16,{sort,47507,18308,different}},
17 {17,{sort,47713,18712,different}},
18 {18,{sort,46753,18683,different}},
19 {19,{sort,47454,16730,different}},
20 {20,{sort,47541,18095,different}},
21 {21,{sort,46717,18154,different}},
22 {22,{sort,47381,18109,different}},
23 {23,{sort,47441,17849,different}},
24 {24,{sort,47130,16926,different}},
25
26 {1, {fib,2249210,2239440,true}},
27 {2, {fib,2237625,1142294,true}},
28 {3, {fib,2314723,776341,true}},
29 {4, {fib,2219352,589694,true}},
30 {5, {fib,2223962,458944,true}},
31 {6, {fib,2205473,383569,true}},
32 {7, {fib,2228012,329824,true}},
33 {8, {fib,2201455,289698,true}},
34 {9, {fib,2222083,295472,true}},
35 {10,{fib,2196697,289709,true}},
36 {11,{fib,2221117,292360,true}},
37 {12,{fib,2201498,288787,true}},
38 {13,{fib,2447176,289420,true}},
39 {14,{fib,2230599,288047,true}},
40 {15,{fib,2221310,290624,true}},
41 {16,{fib,2200155,288700,true}},
42 {17,{fib,2196464,288331,true}},
43 {18,{fib,2231116,288998,true}},
44 {19,{fib,2223387,287379,true}},
45 {20,{fib,2223563,289634,true}},
46 {21,{fib,2208410,288783,true}},
47 {22,{fib,2230869,288493,true}},
48 {23,{fib,2593730,335768,true}},
49 {24,{fib,2229330,290668,true}},
50
51 {1, {simp,10,313,true}},
52 {2, {simp,15,724,true}},
53 {3, {simp,13,819,true}},
54 {4, {simp,19,857,true}},
55 {5, {simp,19,827,true}},
56 {6, {simp,17,813,true}},
57 {7, {simp,19,860,true}},
58 {8, {simp,15,916,true}},
59 {9, {simp,17,822,true}},
60 {10,{simp,19,870,true}},
61 {11,{simp,16,816,true}},
62 {12,{simp,18,775,true}},
63 {13,{simp,19,864,true}},
64 {14,{simp,19,825,true}},
65 {15,{simp,17,859,true}},
66 {16,{simp,18,868,true}},
67 {17,{simp,15,846,true}},
68 {18,{simp,19,805,true}},
69 {19,{simp,19,843,true}},
70 {20,{simp,14,795,true}},
71 {21,{simp,17,775,true}},
72 {22,{simp,21,843,true}},
73 {23,{simp,17,837,true}},
74 {24,{simp,18,772,true}},



执行环境:

  CentOS release 5.5 (Final),4核,8超线程,8G内存

结论:

  map是单进程的,开多少SMP根本对它没什么影响,这是毋庸置疑的;

  pmap是多进程的,开多少SMP根据不同的情况是有不同影响的,sort是小计算,随着SMP的增大性能提高相对于fib并不大,而fib是大计算,随着SMP的增大性能提高有明显幅度;
另外SMP要开多少个,基本是和逻辑CPU个数一样,基本上能保持稳定的最佳性能;最后对于simple这么简单的计算,采用什么SMP和进程策略都是弄巧成拙的,-smp disable和单进程就行了。
  总之,单进程or多进程?SMP开多少?都是根据不同情况判断的。
  最后将会测试pmap如果要处理很大的列表,开多少个进程合适?

转:https://www.cnblogs.com/MaxLin/archive/2012/02/07/2340994.html



推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
果子露强逼_604
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有