`
mozhenghua
  • 浏览: 324599 次
  • 性别: 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算法

相关推荐

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    erlang25.0 windows版本

    2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...

    erlang_版本24.3.4.4

    版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误恢复能力和轻量级进程(称为Erlang进程)而闻名,这些进程具有内置的并发性和容错性。 在安装Erlang 24.3.4.4之前,首先...

    erlang22最新下载包

    Erlang22是Erlang的第22个主要版本,它包含了对语言特性的改进、性能优化以及一些新的库和工具。 在“erlang22最新下载包”中,提供的文件是`otp_src_22.1`,这表明这是一个源代码包,包含Erlang/OTP(开放电信平台...

    Erlang/OTP 26.2.1

    Erlang/OTP 26.2.1,Erlang,OTP,26.2.1

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    erlang programming

    这通常需要对Erlang的VM(Virtual Machine)和调度器有深入理解。 8. **Erlang与其他技术的集成**:Erlang可以与其他语言如Java、Python等集成,用于构建混合系统。例如,使用Erlang的Ranch和Cowboy库可以构建高...

    Erlang 20.3linux安装包

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性、并发性和内存管理机制而被广泛应用于网络通信、数据库系统以及消息中间件,如...

    xiandiao_erlang_Erlang课后习题_

    【Erlang编程语言及其应用】 Erlang是一种并发式、函数式的编程语言,由瑞典电信设备制造商Ericsson开发,最初用于构建高可用性、容错性和可扩展性的分布式系统。"xiandiao_erlang_Erlang课后习题_"这个压缩包文件...

    erlang安装包.zip

    erlang安装包

    erlang9.rar

    Erlang是一种高级编程语言,特别适用于并发、分布式和实时计算系统。它的设计目标是创建一个高可用性、容错性强、低延迟的系统。Erlang9指的是Erlang/OTP(Open Telephony Platform)的第9个主要版本。OTP是Erlang...

    erlang23.2版windows64位.zip

    这个版本可能包含了对Windows平台的优化,以确保在该系统上高效运行。 描述中的"erlang23.2版windows64位"进一步确认了这个软件包是Erlang 23.2,适用于64位的Windows操作系统。这意味着它能够充分利用64位系统的...

    windows下安装Erlang环境

    **软实时性**:Erlang采用递增式垃圾收集,确保系统能及时响应,但不保证严格的时间限制,适合于那些对响应时间有一定要求但又不是硬实时要求的系统。 **热代码升级**:Erlang允许在运行时升级代码,新旧版本的代码...

    erlang otp25 win安装包

    erlang otp25 win安装包

    两本erlang电子书

    Erlang的独特之处在于其对并发的处理方式,它使用轻量级进程(Lightweight Processes,LWP)实现微内核架构,这使得在单个节点上可以同时运行数千个进程。OTP的引入进一步强化了这种并发能力,提供了诸如GenServer、...

    erlang趣学指南

    这本书不仅适合Erlang初学者阅读,而且对于那些对Erlang设计哲学和应用开发感兴趣的人也是极好的资源。通过学习本书,读者将能够掌握Erlang的基础知识,为编写可靠和高效的并发系统打下坚实的基础。

    二郎助手erlang开发工具、erlang编辑器

    6. **完全免费**:对个人和商业用户都免费,无任何使用限制,这使得更多的人能够接触到Erlang开发并提高生产力。 在提供的压缩包文件“ErlangIDE”中,包含了二郎助手的安装程序或者源代码。通过安装这个工具,...

    erlang深度分析.pdf

    Erlang的性能定量分析涉及对VM行为的深入研究,包括内存使用、进程调度以及垃圾回收(GC)等方面的性能指标。这涉及到监控ERTS的运行时参数,例如ETS(Erlang Term Storage)使用的内存、进程的数量和状态,以及SMP...

Global site tag (gtag.js) - Google Analytics