tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

Net::FTP の転送モードと転送速度

前にもはまったんだけどねぇ。

Perl の Net::FTP のデフォルトの転送モードは ascii なんです。で、ascii モードで転送すると遅いよ、ってのが今日のお話。

普通の FTP で 1GB のデータを送ると 20秒ちょいで終わるのに、Net::FTP を使うと1分くらいかかって、「なんでかなー」と思っていて、「そういえばデータを送ってるのに、ascii で送るのっておかしくね?」と思って、binary 転送したらめっちゃ早くなったという次第。

再現する簡単なサンプルはこんな感じ。1GB の 1gfile を用意してください。

#!/usr/bin/perl

use strict;
use warnings;
use Net::FTP;

my $file = "1gfile";
my $start = time();

my $ftp = Net::FTP->new("testserver");
$ftp->login("testuser", "testuser");
$ftp->binary();
$ftp->cwd("/var/tmp");
$ftp->put($file);
$ftp->close;

my $end = time();
my $elapsed = $end - $start;
print "elapsed: $elapsed sec\n";

で、コレを実行すると、

tsucchi@test[546]$ perl a.pl
elapsed: 13 sec

まあギガビットイーサなら普通の速さですね。ところが、ftp->binary() をコメントアウトすると、

tsucchi@test[548]$ perl a.pl
elapsed: 78 sec

なんと 6倍も遅くなってしまうのです。でかいデータを送る場合は、テキスト/バイナリ、改行コードを問わずバイナリモードで送っちゃうのがいいかなぁ、と思います。

See Also:
Net::FTP のデフォルトの転送モードについて (tsucchi's tech note)