【言語別】複数行の標準入力→int型配列 の高速化(Tips)


【言語別】複数行の標準入力→int型配列 の高速化(Tips)

最近paizaとかcodeiqがマイブームなのですが、POH1でI/Oで色々つまづいたので、言語別にそこそこ高速だと思われるプログラムを載せてみます。

標準入力1000000行の配列化&数値変換です。
(他のプログラムとの比較とかはないです。ごめんなさい。)

変数名とか色々まとまってません!

C,C++

#include <cstdio>
#include <vector>
#include <string>
#include <iostream>

static const int N = 1000000;
static char _buf[10*N];
int read_int(){
    static uint64_t c=0;

    int r=0;
    while( _buf[c] >= '0' && _buf[c] <= '9' ){
        r = r*10 + _buf[c++]-'0';
    }
    c++;
    return r;
}

int main(){
    /* C++ライクに書いてみた。がとても遅い。
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    std::vector<int> v(N);
    std::vector<int>::iterator it=v.begin();
    while(std::cin >> *it++);
    */

    fread(_buf,1,sizeof(_buf),stdin);

    int lines[N];
    for(int i=0;i<N;i++){
        lines[i] = read_int();
    }

    return 0;
}

C#

using System;

class Io {
    const int N=1000000;
    const int SIZE=N*10;
    static byte[] buf=new byte[SIZE];
    static int count=0;

    static int read_int(){
        int r=0;
        while(buf[count] >= '0' && buf[count] <= '9' ){
            r = r * 10 + buf[count++] - '0';
        }
        count++;
        return r;
    }

    public static void Main(string[] args){
        Console.OpenStandardInput().Read(buf,0,SIZE);

        int[] lines=new int[N];
        for(int i=0;i<N;i++){
            lines[i] = read_int();
        }
    }
}

Java

class Main {
    static final int N=1000000;
    static final int SIZE=N*10;
    static byte[] buf=new byte[SIZE];
    static int count=0;

    static int read_int(){
        int r=0;
        while(buf[count] >= '0' && buf[count] <= '9' ){
            r = r * 10 + buf[count++] - '0';
        }
        count++;
        return r;
    }

    public static void main(String[] args){
        try{
            System.in.read(buf,0,SIZE);
            int lines[] = new int[N];
            for(int i=0;i<N;i++){
                lines[i] = read_int();
            }
        }catch(Exception e){
            System.err.println(e);
        }
    }
}

Ruby

lines = $stdin.read.split(?\n).map(&:to_i)

Perl

=pod こちらは思ったより遅かった。。。
my $input = do { local $/; <> };
my @lines = split(/\n/,$input);
=cut

my @lines = ();
while(<>){
    push(@lines,int($_));
}

Python

import sys
_to_i=int
lines = map(_to_i,sys.stdin.read().splitlines())

PHP

<?php
/* これも思ったより遅かった。。。
$stdin = file_get_contents('php://stdin');
$lines = array_map(intval,preg_split('/\n/', $stdin));
*/
$lines = array();
while(($v = intval(fgets(STDIN)))){ 
    array_push($lines, $v);
}
?>

実行速度

最後に言語別の実行速度です。
(OS:Mac OS 10.9.1, CPU:Intel Core i5 2.9GHz)

言語 実行速度(timeコマンドのuser)
C,C++ 0.0022s
C# 0.046s
java 0.077s
perl 0.181s
ruby 0.257s
python 0.504s
php 0.590s

もっと速く...

なる方法を知っている方教えて下さい。お願いします。