erlang读文件的速度为啥这么慢?
今天公司技术比武,比赛题目是给一个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在计算密集型的计算上确实比其他语言没有啥优势
但是我想实际**一下,别的都不测,先**一下用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在计算密集型的计算上确实比其他语言没有啥优势
没有找到相关结果
已邀请:
0 个回复