`
mozhenghua
  • 浏览: 330080 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

对erlang的怀疑

 
阅读更多

       任何时候都不能人云亦云,别人说好的东西必须亲自尝试过之后才会有真切的体会。

 

        对于erlang也是如此,因为自己之前一直是用java开发的,所以自觉不自觉得喜欢用java 和erlang来作比较,不比较还好,一比较之后真的会使自己陷入对erlang的怀疑。

        

测试1:  

     erlang执行速度和java比较:

      测试内容是,创建1000万个有5个字符的随机字符串。 

      非常抱歉的高速各位,我测试的结果是erlang慢很多,我真希望是我代码写的有问题。

      测试用的服务器是 16核24G内存的服务器,公平起见,都没有使用并发多进程,多线程。

 

Java代码如下:

public class TestDict {

	public static void main(String[] args) {
		final long current = System.currentTimeMillis();
		for (int i = 0; i < 10000000; i++) {
			createRandomWord();
		}
		System.out.println("consume:" + (System.currentTimeMillis() - current));
	}

	private static String createRandomWord() {
		char[] chars = new char[5];
		for (int i = 0; i < chars.length; i++) {
			chars[i] = (char) (97 + (int) (Math.random() * 26));
		}
		return new String(chars);
	}
}

编译:

javac  TestDict.java

执行:

java TestDict

执行结果:

consume:1868

 

Erlang代码:

 

-module(test_dict).

-compile(export_all).

just_create_words(0)->
  ok;
just_create_words(N)->
  create_random_word(),
 just_create_words(N-1).


create_random_word()->
  create_random_word([],0).

create_random_word(Acl,5)->
  Acl;
create_random_word(Acl,N)->
  create_random_word([97+ trunc(random:uniform()*26) |Acl],N+1).

 

编译:

 erlc test_dict.erl

执行:

  timer:tc(test_dict,just_create_words,[10000000]).

执行结果:

   {29546820,ok} 29.5秒

 

结果对比:

    看见了吧 java执行只需要1.8秒,而erlang需要29.5秒,如果说相差个1秒那还说得过去,为啥相差这么多?难道我写的代码有问题?

 

测试2:

    测试二是在上测试1的基础上,将创建出的随机字符串put到map对象中他,map对象的value是一个Integer值,当map对象中如果已经有一个相同的key的话就将对应key的value值加一。

 还是创将1000万个5个字符串的随机字符串,分别统计执行时间。

以下是java代码:

public class TestDict {

	public static void main(String[] args) {
		Map<String, AtomicInteger> wordCount = new HashMap<String, AtomicInteger>();
		final long current = System.currentTimeMillis();
		String key = null;
		AtomicInteger value = null;

		for (int i = 0; i < 10000000; i++) {
			key = createRandomWord();
			value = wordCount.get(key);
			if (value == null) {
				wordCount.put(key, new AtomicInteger(1));
			} else {
				wordCount.get(key).incrementAndGet();
			}
		}
		System.out.println("consume:" + (System.currentTimeMillis() - current));
		System.out.println("key size:" + wordCount.size());
	}

	private static String createRandomWord() {
		char[] chars = new char[5];
		for (int i = 0; i < chars.length; i++) {
			chars[i] = (char) (97 + (int) (Math.random() * 26));
		}
		return new String(chars);
	}
}

 编译:

javac  TestDict.java

执行:

java TestDict

执行结果:

consume:13698
key size:6759849

 

Erlang代码:

-module(test_dict).

-compile(export_all).

test_create_word(Dict,0)->
 ok;
test_create_word(Dict,N)->
  dict:update_counter(create_random_word(),1,Dict),
  test_create_word(Dict,N-1).


create_random_word()->
  create_random_word([],0).

create_random_word(Acl,5)->
  Acl;
create_random_word(Acl,N)->
  create_random_word([97+ trunc(random:uniform()*26) |Acl],N+1).

编译:

 erlc test_dict.erl

执行:

  timer:tc(test_dict  , test_create_word ,  [dict:new(),10000000]).

执行结果:

  {38897271,ok}  38,8秒

 

结果对比:

   对比两次执行操作时间,需要减去测试一的执行时间,多出来的时间就是操作K->V对象的时间:

Java版本执行时间:13.6-1.8=11.8秒

erlang版本执行时间:38.8-29.5=9.3秒

 

      从测试结果来看,erlang的dict 对象执行速度还是比java的map对象快的,还快了两秒多。之前我有一个担心,那就是erlang的immutable object,我总是在想erlang是如何操作dict数据结构的呢,因为每次更新dict中的一个k-value值都会创建一个新的dict对象(这个操作对象的方式,在java中是完全不可以接受的),那么随着dict中key越来越多,操作dict数据结构的时间也会越来越长的,但是经过测试2的结果,让我完全打消对erlang dict性能的怀疑。

 

总结:

      通过两个测试结果综合来看,erlang在计算随机数环节慢了,估计是random:uniform()执行比较慢的原因,另外欣慰的是在测试2中对k-v操作中erlang的dict胜出了,今后我可以在erlang的代码中放心地使用dict了。

分享到:
评论
2 楼 wudixiaotie 2015-07-20  
计算速度本身就不是erlang的强项 你非要比这个那就只能得到这个结果啊,erlang强项在于对大并发的处理,你java处理1W个TCP链接的程序和erlang处理1W个TCP链接的程序你写写试试看看哪个容易。elrang是天生分布式的,java是么?erlang天生支持多CPU,同样的函数在任何CPU和任何机器上 只要输入参数一样 得到结果就一样,java可以么?用erlang 我不需要考虑锁,不需要考虑内存管理,java可以么?
1 楼 jiemar 2014-12-03  
random:uniform() 是个坑, 不要用.改用 hash算法

相关推荐

    BLDC无刷直流电机Simulink双闭环调速系统仿真设计及应用

    内容概要:本文详细介绍了BLDC无刷直流电机在Matlab Simulink环境下的仿真设计,特别是转速和电流双闭环调速系统的实现方法。首先解释了为什么需要进行BLDC电机的仿真设计及其优势,接着简述了Simulink仿真环境的特点和功能。重点在于双闭环调速系统的设计,包括转速外环的PID控制器和电流内环的PWM技术的具体实现方式。最后展示了仿真过程与结果分析,附带简单的代码片段供参考。 适合人群:从事电机控制系统研究的技术人员、高校师生及相关领域的研究人员。 使用场景及目标:适用于希望深入了解BLDC电机控制原理和技术细节的人群,旨在帮助他们掌握基于Simulink平台的BLDC电机建模与仿真的技能。 其他说明:文中提供的代码片段仅为示意,具体实现还需参照完整文档和资料进一步学习。

    实训商业源码-匹饲养养殖场网站模板-毕业设计.zip

    实训商业源码-匹饲养养殖场网站模板-毕业设计.zip

    西门子S7-200SMART恒压供水系统:一对一变频调节与PID控制的全自动解决方案

    内容概要:本文介绍了基于西门子S7-200SMART PLC的恒压供水系统设计方案。该系统采用一对一变频调节,四台主泵与一台辅泵配置,通过PID调节实现自动投切电机和频率调整。系统配有详细的电气图纸和IO点号表,确保安装、调试和维护的便利性。同时,系统集成了西门子触摸屏,提供友好的人机交互界面,便于用户操作和监控。实际工程应用表明,该系统运行稳定,节能效果显著。 适合人群:从事自动化控制系统设计、安装和维护的技术人员,尤其是熟悉西门子PLC和变频器的应用工程师。 使用场景及目标:适用于工业和民用建筑中的恒压供水项目,旨在提高供水系统的稳定性、可靠性和节能效率。 其他说明:文中附有简化的PLC代码示例,展示了如何根据压力变化调整电机状态和频率,为读者提供了实用的参考。

    STM32学习第一课-工程建立

    STM32学习第一课-工程建立

    人力资源分析数据集.rar

    该数据集为结构化人力资源分析数据,涵盖员工全生命周期管理指标,包含员工编号、年龄、部门、职位、教育背景、薪资结构(时薪/日薪/月薪)、绩效评级、培训记录及离职原因等核心字段。数据维度覆盖员工满意度(工作环境、职业发展、工作生活平衡)、任职稳定性(工龄、晋升年限、通勤距离)以及组织效能(部门效能、项目完成量)三大方向,涉及招聘效率、薪酬公平性、人才流失预警等典型人力资源管理场景。 数据采用CSV/XLSX标准化格式存储,包含超过30项可量化指标,包含定量数据(工作时长、薪资数值)与定性指标(满意度评分、离职类型)的混合数据类型。适用于社会科学研究中的人力资本分析、组织行为学模型构建,支持通过Python/Pandas、Tableau等工具开展描述性统计、相关性分析和预测建模。数据集已进行匿名化处理,符合GDPR等数据隐私保护规范,包含完整的数据字典和元数据说明文件。

    中国省市区旅游景点数据.rar

    中国省市区旅游景点数据是以行政区划为单位的全国性旅游资源结构化数据集,覆盖31个省级行政区域(含直辖市、自治区),包含2443条景点信息。数据集包含11个核心字段:城市、景点名称、星级(含4A/5A等级评定)、评分(0-5分游客满意度)、门票价格、销量(门票或游客量)、省/市/区归属、地理坐标(经纬度定位)、简介(含历史文化背景及特色)、是否免费标识、具体地址。数据来源于公开采集的景区官方信息及旅游平台统计,可支持多维分析应用,包括全国景点地理空间分布、游客行为偏好、景区价格体系比较、热门景区客流量预测等研究方向。 该数据集采用Excel格式存储,便于使用Pandas、R等工具进行数据清洗与统计分析,并可通过Pyecharts、Tableau等工具实现可视化呈现。典型应用场景包括:通过坐标字段生成省级热力图,结合销量和评分分析区域旅游经济贡献度,或基于星级和价格字段研究景区评级与消费水平关联性。数据内容已应用于社科领域研究,如《中国A级旅游景区空间分结构研究》等文献,为区域经济规划、文旅政策制定提供基础数据支撑。数据集包含完整字段说明文档,适用于旅游管理、人文地理、区域经济学等学科量化研究。

    论文模板-2022 多个分类随机海量高清壁纸系统源码-实训商业源码.zip

    论文模板-2022 多个分类随机海量高清壁纸系统源码-实训商业源码.zip

    实训商业源码-大气的影视公司网站源码-毕业设计.zip

    实训商业源码-大气的影视公司网站源码-毕业设计.zip

    基于MATLAB的车牌定位算法设计.doc

    基于MATLAB的车牌定位算法设计.doc

    基于Matlab Simulink的双馈风力发电机电网模型及其外扰波形变化研究

    内容概要:本文主要介绍了利用Matlab Simulink平台搭建双馈风力发电机(DFIG)在电网中的模型,并对其在外扰条件下的转矩、功率和电压波形变化进行了深入的研究。首先,文章阐述了双馈风力发电机的基本原理和结构,接着详细描述了如何在Simulink环境中构建DFIG模型并设置相关参数。随后,通过对不同类型的外部干扰进行模拟实验,分析了这些干扰对DFIG各项电气参数的具体影响,如转矩波动、有功无功功率变化以及电压稳定性的改变。最后,作者提供了详尽的技术文档和支持材料来帮助读者进一步理解DFIG的工作机制及其在电力系统中的表现。 适合人群:从事风能发电领域的研究人员和技术人员,特别是那些希望深入了解双馈风力发电机特性和行为的专业人士。 使用场景及目标:适用于想要探索DFIG在复杂电网环境下动态响应特征的研究项目;也可用于指导工程实践中针对DFIG系统的优化设计与故障诊断。 其他说明:文中不仅包含了理论分析,还有大量的实验数据支持,确保研究成果的真实可靠。同时提供的参考资料有助于初学者快速掌握相关知识。

    基因工程(一)基因的结构和基因工程的基本工具.doc

    基因工程(一)基因的结构和基因工程的基本工具.doc

    实训商业源码-App软件落地页网站源码-毕业设计.zip

    实训商业源码-App软件落地页网站源码-毕业设计.zip

    基于遗传算法优化SVM的多输入单输出预测模型及其可视化分析

    内容概要:本文详细介绍了如何利用遗传算法(GA)优化支持向量机(SVM)进行多输入单输出的拟合预测建模。首先,通过sklearn生成模拟数据集并进行预处理,然后采用DEAP库实现遗传算法寻找SVM的最佳超参数(如C和gamma)。接着,使用最佳参数训练SVM模型并对测试集进行预测,最终通过多种图表形式展示预测结果与真实值之间的关系以及误差分布情况,并给出多个性能评估指标。 适合人群:对机器学习尤其是SVM和支持向量回归有一定了解的数据科学家、研究人员和技术爱好者。 使用场景及目标:适用于希望提高SVM模型预测精度的研究人员或从业者,在面对复杂非线性数据时能够自动寻优超参数,减少人工试错成本,提升模型泛化能力。 其他说明:文中提供了完整的代码实现步骤,从数据准备到模型训练再到结果可视化,帮助读者全面掌握整个流程。此外还提到了一些注意事项,比如遗传算法可能存在局部最优解的问题,提醒使用者灵活调整相关参数设置。

    嵌入usb控制器的51系列单片机ez-usb的应用.doc

    嵌入usb控制器的51系列单片机ez-usb的应用.doc

    基于空间矢量控制的永磁同步电机转速系统设计与仿真:MATLAB Simulink平台实现

    内容概要:本文详细介绍了基于空间矢量控制(SVM)的永磁同步电机(PMSM)状态反馈控制转速系统的设计与仿真。首先,文章阐述了永磁同步电机的基本模型及其组成部分,包括电机本体、驱动电路和控制电路。接着,重点讨论了空间矢量控制策略,这是一种能根据电机实时状态调整输入电压幅度和相位的高效控制方法。然后,深入讲解了状态反馈控制机制,即通过实时采集电机的状态信息并计算实际运行状态,与期望状态进行比较,进而得出控制信号以调整电机运行。最后,在MATLAB/Simulink平台上进行了系统建模与仿真,展示了电机在不同负载和输入条件下的性能变化,并通过调整参数和控制策略找到了最优设计方案。 适合人群:电气工程专业学生、电机控制系统研究人员和技术人员。 使用场景及目标:适用于需要深入了解永磁同步电机控制原理的研究人员和技术人员,旨在帮助他们掌握空间矢量控制和状态反馈控制的方法,提升电机运行效率和寿命。 其他说明:文中还提供了一段简短的Simulink模型代码示例,便于读者理解和实践。

    实训商业源码-蓝色营销型五金配件网站源码-毕业设计.zip

    实训商业源码-蓝色营销型五金配件网站源码-毕业设计.zip

    实训商业源码-教育培训机构网站-毕业设计.zip

    实训商业源码-教育培训机构网站-毕业设计.zip

    第8章S7-200通信及网络.ppt

    第8章S7-200通信及网络.ppt

    python相关学习资源,python

    python

    实训商业源码-HTML5响应式健身俱乐部类pbootcms网站模板-毕业设计.zip

    实训商业源码-HTML5响应式健身俱乐部类pbootcms网站模板-毕业设计.zip

Global site tag (gtag.js) - Google Analytics