序言

由于前段时间需要写一个脚本统计一个日志里面的某个字段的值出现的次数,需要写一个脚本。一开始是使用php写的,写完后执行,发现实在是太慢了,不能忍,于是用nodejs写了一遍,对比测试后惊呆了。

配置

  • 总记录条数 29w 条
  • 文件大小 190MB
  • 系统 I5 win7
  • php版本 5.5.12
  • node版本 4.4.2

对比

php

$account = [];
$i = 0;
$started = time();

$handle = fopen("hour.log", "r");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $array = explode("\t", $buffer);

        $i ++;
        if($i % 10000 == 0){
            echo $i . "\r\n";
            echo count($account) . "\r\n";
        }

        if(count($array) > 2 && !in_array($array[1], $account)){
            $account[] = $array[1];
        }
    }
    fclose($handle);
}

$ended = time();

echo count($account). "\r\n";
echo ($ended - $started) . "\r\n"; // 1120s

最终耗时:1120秒

nodejs

'use strict';

const fs = require('fs'),
      readline = require('readline');

let s = new Set(),
    started = Date.now(),
    file = 'hour.log';

if(fs.existsSync(file)){
    let inStream = fs.createReadStream(file),
        outStream = new (require('stream'))(),
        rl = readline.createInterface(inStream, outStream),
        i = 0;

    rl.on('line', function(line){
        i++;
        if(i % 10000 == 0){
            console.log(i + "\r\n");
            console.log(s.size + '\r\n');
        }
        let string = line.split('\t');
        if(string.length > 2 && !s.has(string[1])){
            s.add(string[1]);
        }
    });

    rl.on('close', function(){
        console.log('close');
        console.log(s.size + '\r\n');
        let ended = Date.now();
        console.log(ended - started); // 2423 ms => 2.4s
    });
}

最终耗时:2.4秒

image

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: 临时统计脚本耗时测试PHP vs NodeJS - hisune.com