ファイルの読み込み
ファイルを読むのがやけに遅い。
例えば、こんな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
のように使うのだが、
ふつうにファイルを読むときに速くできないのだろうか。
何か手があると思うのだが。