Perlの代替として(11)

ファイルの読み込み

ファイルを読むのがやけに遅い。
例えば、こんな100万行のファイルを読む。

0
1

999998
999999

Perlでこうやって吐いて、リダイレクトする。


$n = 1e6;
for(my $i = 0; $i < $n; $i++) {
printf "%d\n", $i;
}

これをふつうにDとPerlで読むと、
次のように処理時間がかかった。

D : 20.234s
Perl : 2.750s

前から感じていたが、改めて計ってみると、おそろしく遅い。
Dのソースは、


import std.stream;
import std.cstream;
import std.conv;

import std.date;
import std.process;

void main(char[][] args) {
d_time starttime = getUTCtime();

long sum = 0L;
File inp = new File(args[1], FileMode.In);
foreach(char [] line ; inp) {
sum += toLong(line);
}
inp.close();

derr.writefln("%.3fs",
cast(double)(getUTCtime() - starttime) / TicksPerSecond);

dout.writefln("sum : %d", sum);
}

Perlは、


$start = (times)[0];
while(<>) {
$sum += $_;
}
printf "%.3fs\n", (times)[0] - $start;
print "sum : $sum\n";

書く方は、

D : 2.984s
Perl : 1.375s

ソースは、


import std.stream;
import std.cstream;
import std.conv;

import std.date;
import std.process;

void main(char[][] args) {
d_time starttime = getUTCtime();

long sum = 0L;
File inp = new File(args[1], FileMode.In);
foreach(char [] line ; inp) {
sum += toLong(line);
}
inp.close();

derr.writefln("%.3fs",
cast(double)(getUTCtime() - starttime) / TicksPerSecond);

dout.writefln("sum : %d", sum);
}

書く方は、それほどでもない。
標準入出力だとそれほどでもないのだろうか。
ファイルに書くと、

D : 24.516s
Perl : 1.313s

ソースは、


import std.stream;
import std.cstream;

import std.date;
import std.process;

const int n = cast(int)1e6;

void main(char[][] args) {
d_time starttime = getUTCtime();

File fp = new File(args[1], FileMode.Out);
for(int i = 0; i < n; i++)
fp.writefln("%d", i);
fp.close();

derr.writefln("%.3fs",
cast(double)(getUTCtime() - starttime) / TicksPerSecond);
}

やはり遅い。
標準入力だと、

D : 1.797s
Perl : 2.766s

なんか知らんが逆転した。
ソースは、


import std.cstream;
import std.conv;

import std.date;
import std.process;

void main(char[][] args) {
d_time starttime = getUTCtime();

long sum = 0L;
foreach(char [] line ; din) {
if(din.eof())
break;
sum += toLong(line);
}

derr.writefln("%.3fs",
cast(double)(getUTCtime() - starttime) / TicksPerSecond);

dout.writefln("sum : %d", sum);
}

これは、


> read2 < int.txt

のように使うのだが、
ふつうにファイルを読むときに速くできないのだろうか。
何か手があると思うのだが。