一个文件。13G。逐行读取,将读取到的内容按空格切割为数组,取数组中Key=8的值累加。最后得到这个累加的值。
很简单的文件处理程序。Go和PHP都是单线程顺序执行。
我用Go跑了一遍6分30秒,我又用PHP跑了一遍是2分30秒。
虽然PHP是最好的语言,但是Go作为编译型强类型语言,在我的认知里要比PHP快得多才对,为什么会出现这样的结果?
补充:Go用了300秒,PHP5.6用了200秒,PHP7用了47秒。我是真的不敢相信这就是Google大力推广的Go。我宁愿相信这是我代码的问题。
代码上其实真没什么东西,就是打开文件、逐行读取、按空格切割为数组、取数组第9个字段,累加求和
GO代码:
package main import ( "fmt" "os" "strings" "bufio" "io" "strconv" "time" ) func main(){ startTime := time.Now().UnixNano() path := "./" //读取文件 var filenameList = []string{"cdn.log"} //解析 for _, file := range filenameList{ parseFile(path, file) } endTime := time.Now().UnixNano() fmt.Println(endTime-startTime) } func parseFile(path, file string){ filePath := path + file f, err := os.Open(filePath) defer f.Close() if err != nil { fmt.Println("打开文件失败:"+filePath) os.Exit(1) } //错误信息 var errList []error //总流量 var totalSize uint64 //过滤流量 var keepStoppSize int64 var errMsg error var line []byte var content string var size int64 var lineNum int64 = 0 bfRd := bufio.NewReader(f) for { lineNum += 1 line, errMsg = bfRd.ReadBytes('\n') // line, _, errMsg = bfRd.ReadLine() //判断是否结尾 if errMsg == io.EOF { resultFilePath := path + "/result_" + file + ".out" resultFileHandle, err := os.OpenFile(resultFilePath, os.O_CREATE | os.O_WRONLY, 0755) if err != nil{ fmt.Println(err) } defer resultFileHandle.Close() resultFileHandle.WriteString("TotalSize:" + strconv.Itoa(int(totalSize)) + "\r\n") resultFileHandle.WriteString("KeepStoppSize:" + strconv.Itoa(int(keepStoppSize)) + "\r\n") return } content = string(line) slice := strings.Fields(content) size, _ = strconv.ParseInt(slice[8], 10, 0) if strings.Contains(slice[5], "keep_stopp=on") { keepStoppSize += size continue } totalSize += uint64(size) if errMsg != nil { errList = append(errList, errMsg) continue } } }
PHP代码:
<?php date_default_timezone_set('Asia/Shanghai'); echo "任务开始:".$start."\n\n"; $fileList = array("cdn_qihu360_2015111215.log"); $bd = array(); $allTotalSize = 0; foreach($fileList as $file){ if(!file_exists($file)){ continue; } $handle = fopen($file, 'r'); $total_size = 0; while(!feof($handle)){ $line = trim(fgets($handle)); if(strlen($line) < 5){ continue; } if(preg_match("/keep_stopp=on/", $line)){ continue; } $tmp_arr = explode(' ', $line); $size = intval($tmp_arr[8]); $total_size += $size; } echo $file . ': ' . $total_size."\n"; $allTotalSize += $total_size; }
对 go 不了解 。
看代码 。貌似 是 你的 go 遍历的 13g 的每一个 字符 ,
而php 可以用 fgets 直接读取一行 。估计就是 C的 fgets 的包装 ,性能高。
应该是 这个造成的差距
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。