awk は遅いのか!?

ある調べ物をしていたら404 Blog Not Found:sh, awk, perl & ruby - やっぱりforkは遅いというサイトに出会いました。 結果的に awk ではなく fork(2) という結論なのですが、awk の単独結果がないため、awk は遅いという印象が残ったので、実際に試してみます。

awk は以下のようなものを使いました。

#! /usr/local/bin/gawk -f
# split_loop.awk
# split のループ
# usage: nawk -f split_loop.awk

BEGIN {
    str = "aaa,bbb,ccc";
    for (i = 1; i <= 1000000; i++) {
        split(str, arr, /,/);
        print arr[1] > "/dev/null";
    }
}

Perl は以下のものです。

#!/usr/bin/env perl
use strict;
use warnings;
my $str   = "aaa,bbb,ccc";
open my $null, '>', '/dev/null';
for (1..1000000){
  my @words = split /,/, $str;
  print {$null} "$words[1]\n"
}

同様に Ruby は以下のものを使いました。

#!/usr/bin/env ruby
str   = "aaa,bbb,ccc"

open("/dev/null", "w") do |f|
  1000000.times do
    f.puts str.split(/,/)[1]
  end
end

論より証拠で実行してみます。 実行環境は Core2Duo 2.5 GHz の Fedora11 です。

$ perl --version

This is perl, v5.10.0 built for i386-linux-thread-multi

Copyright 1987-2007, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

$ time perl split_loop.pl
perl split_loop.pl  2.75s user 0.02s system 95% cpu 2.907 total

次に Ruby です。

$ ruby --version
ruby 1.8.6 (2009-06-08 patchlevel 369) [i386-linux]

$ time ruby split_loop.rb
ruby split_loop.rb  4.33s user 0.30s system 93% cpu 4.934 total

最後に awk ですが、ここでは手元にあるいろいろな awk で試してみます。

$ gawk --version
GNU Awk 3.1.6g
Copyright (C) 1989, 1991-2009 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.

$ time gawk -f split_loop.awk
gawk -f split_loop.awk  2.07s user 0.00s system 95% cpu 2.160 total

$ time nawk -f split_loop.awk
nawk -f split_loop.awk  3.35s user 0.24s system 96% cpu 3.735 total

$ time mawk -f split_loop.awk
mawk -f split_loop.awk  1.67s user 0.00s system 95% cpu 1.754 total

$ time busybox awk -f split_loop.awk
busybox awk -f split_loop.awk  4.62s user 0.38s system 99% cpu 5.022 total

結論から言えば、awk は Perl, Ruby と比較しても多分遅くないはずです。 Linux などには gawk がインストールされており、BSD 系なら mawk がインストールされているケースが多いので、結果的に Perl, Ruby よりも高速に動作してくれます。 確かに、Solaris のような場合には nawk または broken awk がインストールされていますので、結果が遅くなるかもしれません。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png