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