问题描述
今天公司技术比武,比赛题目是给一个1.1g的大文本,统计文本中词频最高的前十个词。花了两天用erlang写完了代码,但是放到公司16核的机器上这么一跑,结果不比不知道,一比吓一条。erlang写的代码执行时间花了55秒左右,同事们有的用java,有的用C,还有的用C++,用C最快一个老兄只花了2.6秒,用java的也只用了3.2秒。相比之下erlang的代码,真是一头大蜗牛,太慢了。 但是我想实际**一下,别的都不测,先**一下用erlang遍历完一个1.1G的文本到底要花多久(只遍历,其他啥都不做)。 代码如下:-module(file_read). -export(). read(File)-> case file:open(File, ) of {ok, Fd} -> scan_file(Fd,file:read(Fd, 1024)); {error, Reason} -> {error, Reason} end . scan_file(Fd, {ok, Binary}) -> scan_file(Fd, file:read(Fd, 1024)); scan_file(Fd, eof) -> file:close(Fd); scan_file(Fd, {error, Reason}) -> file:close(Fd). 在打开文件的地方特地用了option是,这样可以保证在打开文件erlang不会起一个额外的进程,并且是以二进制流的方式去打开文件,应该是最快了。但是经过**:C代码timer:tc(file_read,read,). 结果确是:C代码 {26286000,ok} 整整花了26秒,就算在16核的机器上,把文件切成16份,用16各进程去读文件,读完文件也要花 26/16=1.6秒,这还只是光读文件所要花的时间,没有算上其他计算词频所用的时间。 貌似erlang在计算密集型的计算上确实比其他语言没有啥优势