关于GO逐行读取大文件的问题,Go为什么耗费时间是PHP7的8倍?

xyzasd01 · 2015-12-18 03:43:59 · 3706 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-12-18 03:43:59 的主题,其中的信息可能已经有所发展或是发生改变。

最近写了个脚本,作为学习Go以来第一个实战。但是效果不理想。

一个文件。13G。逐行读取,将读取到的内容按空格切割为数组,取数组中Key=8的值累加。最后得到这个累加的值。

很简单的文件处理程序。Go和PHP都是单线程顺序执行。

虽然PHP是最好的语言,但是Go作为编译型强类型语言,在我的认知里要比PHP快得多才对,就像C的速度是PHP5的1000倍。可现在Go为什么会出现这样的结果?

Go用了300秒,PHP5.6用了200秒,PHP7用了47秒。我是真的不敢相信这就是Google大力推广的Go。我宁愿相信这是我代码的问题。

代码我贴在开源中国了。没得到理想的答案。突然想起了这里。

代码:http://www.oschina.net/question/938918_2145778


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3706 次点击  
加入收藏 微博
10 回复  |  直到 2015-12-22 01:23:34
blov
blov · #1 · 9年之前

为了便于测试验证,你给下一行数据例子,方便构造一些数据试验。

polaris
polaris · #2 · 9年之前

我测试了一下,Go的 strings.Fields 性能比 php 的 explode 差挺多

qkb_75_go
qkb_75_go · #3 · 9年之前

我试了楼主的代码,磁盘IO内存CPU都不高,很慢很慢,估计慢在 strings,fields这个。---- 等一下楼主,你在server上鼓捣一个13G的文件合适吗? 你对 golang 的这种期望,合理性再哪里?

easycody
easycody · #4 · 9年之前

楼主代码的GO语言的处理逻辑与PHP的逻辑根本就不一样. GO的处理逻辑是 1 每一行按空格分隔 生成slice 2 然后解析slice[8] 3 判断slice[5]是不是“keep_stopp=on,如果是计数 4 计算计数的和 PHP的逻辑是 1 每一行去空格,然后计算长度是否小于5,如果小于5,下一行. 2 .. 3 .. 4 ..

下面的就不用多讲了,逻辑不一样怎么进行比较,如果你的文件80%的行长度都是小于5的,根本就不会2,3,4.条件判读了。

这样比较GO 和PHP性能有什么意义?

grassroots
grassroots · #5 · 9年之前

毫无意义的对比,吐槽都是多余。

mutouzhang
mutouzhang · #6 · 9年之前

看来大家都认为楼主的代码存在逻辑问题,我觉得想对比可以简单点嘛 都复制一个13G的文件 比比看速度就知道啦

ksnmmmm
ksnmmmm · #7 · 9年之前

速度应该是golang稍快,涉及到硬盘读取的时候,瓶颈肯定在硬盘,你看看go与 php 的 cpu 占用率就知道了,至于结果为什么php快,我只能呵呵呵,我以前也是一个非常有优越感的phper,玩了半年golang,才发现世界之大,以前完全是坐井观天

qkb_75_go
qkb_75_go · #8 · 9年之前
ksnmmmmksnmmmm #7 回复

速度应该是golang稍快,涉及到硬盘读取的时候,瓶颈肯定在硬盘,你看看go与 php 的 cpu 占用率就知道了,至于结果为什么php快,我只能呵呵呵,我以前也是一个非常有优越感的phper,玩了半年golang,才发现世界之大,以前完全是坐井观天

磁盘IO不是瓶颈;CPU 占用率也不高,也不太像string.Fields() 的问题;我觉得问题可能出在 垃圾回收,可能是这种情况下,引发GC的性能 问题

ksnmmmm
ksnmmmm · #9 · 9年之前
qkb_75_goqkb_75_go #8 回复

#7楼 @ksnmmmm 磁盘IO不是瓶颈;CPU 占用率也不高,也不太像string.Fields() 的问题;我觉得问题可能出在 垃圾回收,可能是这种情况下,引发GC的性能 问题

呵呵,golang 的 GC 完全不是外面传的那么糟糕,再说你整个程序都是局部变量,根本用不到GC,代码看起累,懒得看了,粗看了下,php 有一个length < 5 的条件,如果 有length < 5 的情况存在的话,你再访问 index为 8 的数组,golang是会崩溃的,呵呵呵

easonxie
easonxie · #10 · 9年之前

这样比对不对吧!代码有问题

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传