Perl,Python,PHP系の言語について書いていきます。


モジュール名

今さらBenchmarkを使ってみる « 岩家ぶろぐ
Pumpkin Moonshine: PerlでSQLiteとCSVのどちらを使ったほうが検索が速いかを検証
iandeth. - Benchmark モジュールの使い方、結果情報の読み方
YappoLogs: Perlで数有る$selfを取る手法をベンチマーク取った


スクリプト
#!/usr/local/bin/perl 
use strict;
use warnings;
use Benchmark qw(:all);

my $count =1000000;
my $results = timethese($count,
	{'TEST CASE1' => 'sub1;', 'TEST CASE2'=>'sub2;'}
);

cmpthese($results);

sub sub1{
	my $str =  "Hello\n";
}

sub sub2{
	my $str = "Hello World!\n";
	$str = sprintf("%s",  $str);
}	


実行結果
Benchmark: timing 1000000 iterations of TEST CASE1, TEST CASE2...
TEST CASE1:  1 wallclock secs ( 0.65 usr +  0.00 sys =  0.65 CPU) @ 1536098.31/s (n=1000000)
TEST CASE2:  2 wallclock secs ( 1.12 usr +  0.00 sys =  1.12 CPU) @ 892060.66/s(n=1000000)
                Rate TEST CASE2 TEST CASE1
TEST CASE2  892061/s         --       -42%
TEST CASE1 1536098/s        72%         --

今回はあまり意味の無いサブルーチンを2つ書いてみて、ベンチマークをとってみた。
大事なのは、timethese、cmptheseを使うことなので気にしないで。
cmptheseはtimetheseの戻り値を受けて自動的に表と比較をして出力します。

もう一つのベンチマーク

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

use Benchmark qw(:all);
my $bench_start = new Benchmark;
###
forcal();
###
my $bench_end = new Benchmark;
my $disp_bench = timestr(timediff($bench_end,$bench_start)); 
print "$disp_bench\n";
$disp_bench =~ s/.*\((.*?)\).*/$1/;
print "$disp_bench";

sub forcal{
	my $sum =0;
	for(my $i=0;$i<1000000;$i++){
		$sum += $i;
	}
	return $sum;
}

実行結果
 0 wallclock secs ( 0.39 usr +  0.00 sys =  0.39 CPU)
 0.39 usr +  0.00 sys =  0.39 CPU
コードのスタートと終わりにBenchmarkクラスを生成して、
それの時間差を測定することでもベンチマークは取れます。
#! /usr/bin/perl -w

use strict;
use warnings;

use DBI;
my $file = "SQL.csv";
my $table = "earthq";

my $dbh = DBI->connect("DBI:CSV:f_dir=.");
my $query = "SELECT * FROM $file WHERE mag > 5 AND date BETWEEN '2001/01/01 00:00:00' AND '2002/12/31 23:59:59'";

my $sth = $dbh->prepare($query);
$sth->execute() or die "Cannot excute".$sth->errstr();

#実行結果の読み取り
while(my $row = $sth->fetchrow_hashref){
	print "Found $row->{'date'},$row->{'mag'}\n";
}

対象のCSVファイルはこんな感じ。
date、秒、経度、緯度、深度、マグニチュード。
date,sec,lon,lat,dep,mag
2003/1/1 17:20,47,130.38,31.16,146.78,3.9
2003/1/2 14:46,45,123.49,24.06,20.8,4
2003/1/3 22:27,23,121.91,24.8,37,4.3
2003/1/4 10:48,46,129.42,28.07,41.26,3.6
2003/1/5 2:33,19,131.08,31.89,9.27,3.7
2003/1/6 14:57,34,121.71,20.3,0,5.4
2003/1/7 18:06,19,130.17,27.92,52.06,3.7
2003/1/8 20:19,46,125.17,25.85,19.73,4.9
2003/1/9 11:47,30,133.72,33.7,37.53,3.5
2003/1/10 12:01,48,130.36,28.13,23.35,3.6

ファイル名がテーブル名になることに注意して、
DBにconnectさえできれば後は普通にRDBを扱うのと一緒だと思う。

思い通り動いたんだけど、型指定してないけどなんで動くの?
TIMESTAMP型指定しなくてもいいの?(・ω・)?

まぁ、その辺の難しいことは置いてちょっと比較。
レコード数 ベンチマーク
100 0 wallclock secs ( 0.10 usr + 0.03 sys = 0.13 CPU) @ 7.69/s (n=1)
1000 0 wallclock secs ( 0.10 usr + 0.03 sys = 0.13 CPU) @ 7.69/s (n=1)
10000 2 wallclock secs ( 1.31 usr + 0.00 sys = 1.31 CPU) @ 0.76/s (n=1)
50000 8 wallclock secs ( 7.47 usr + 0.01 sys = 7.48 CPU) @ 0.13/s (n=1)
100000 13 wallclock secs (12.86 usr + 0.03 sys = 12.89 CPU) @ 0.08/s (n=1)

10000件より先は時間とレコード数が比例関係がある。
10000件程度までなら意外と早い。
XML::Atom::Entry
XML::Atom::Client
今回のコードはこの辺のモジュールを使いました。
XML::LibXML
XML::Atomのインストール時にLibXMLが無いって言われたんですけど、
これのインストールに関しては結局何とかなったんだけどどうしてうまくいったかうまく書けない。

ライブドアブログに投稿するコードです。
#!/usr/bin/perl -w

use strict;

use XML::Atom;
use XML::Atom::Client;
use XML::Atom::Entry;

#http://cms.blog.livedoor.com/atom
# my $PostURI = 'http://cms.blog.livedoor.com/atom/blog_id=xxxxxxx';
my $PostURI = 'http://cms.blog.livedoor.com/atom/blog_id=';

my $api = XML::Atom::Client->new;
$api->username('loginname'); #ここに自分のログインネーム
$api->password('password'); #ここに自分のlivedoorblogのパスワード

my $entry = XML::Atom::Entry->new;

$entry->title('test entry'); #タイトル
$entry->content('delete this soon.'); #本文

my $EditURI = $api->createEntry($PostURI,$entry);

print $EditURI."\n"; #出力結果: http://cms.blog.livedoor.com/atom/blog_id=xxxxxxx/entry_id=1234567

インストール手順
ref:http://tech.bayashi.jp/archives/entry/perl/2007/00...
Rubyのコードですけど同じライブドアなので掲載
ref:Ruby で livedoor blog の Atom API にアクセス - WebOS Goodies
use Encode;
$string='表示';
print encode('UTF-8',$string);
UrlEncode.net URLエンコード
http://urlencode.net/

DBIモジュール|http://search.cpan.org/~timb/DBI-1.609/DBI.pm?

下準備
mysql> GRANT ALL ON *.* TO 'user_perl'@'localhost' IDENTIFIED BY 'password';
mysql> CREATE DATABASE prime DEFAULT CHARSET utf8;

MySQLに接続するコード
#!/usr/bin/perl

use strict;
use warnings;

use DBI;

# データソース
my $dsn = 'DBI:mysql:prime';
# ユーザ名
my $user = 'user';
# パスワード
my $password = 'password';

# データベースへ接続
my $dbh = DBI->connect($dsn, $user, $password,
    { RaiseError => 1, AutoCommit => 0 });

# CREATE TABLE num (prime INTEGER PRIMARY KEY);

my @array = (2,3,5,7,11,13,17,19);
for my $i (@array){
	my $statement ="INSERT INTO num VALUES ($i)";
	$dbh->do($statement) || die $dbh->errstr;
}
$dbh->disconnect;

第2章 DBI クイックリファレンス [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/02.html
第5章 データベースハンドル [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/05.html
PerlでMySQL操作CGIを作ろう(2/4)
http://www.atmarkit.co.jp/flinux/rensai/mysql04/my...
#!/usr/bin/perl

use strict;
use warnings;
use Cache::Memcached;

my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
    servers => ["127.0.0.1:11211"],
    compress_threshold => 10_000
});

$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n";
このサンプルコードだとあんまりメリットを感じないかもしれないけど、
ちゃんとBenchmarkをとれば効果は分かるかもしれない。
memcachedを知り尽くす:第1回 memcachedの基本|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/memcached/0001?page...
[perl] Memcachedのインストール・利用方法 - ありんく tech-log
http://www.alink.co.jp/tech/blog/2009/04/16/perl-m...
Cache::Memcached::Fastを試す : blog.nomadscafe.jp
http://blog.nomadscafe.jp/archives/000734.html
  • twitter
  • livedoor クリップ
  • はてなブックマーク
  • delicious
  • Yahoo! ブックマーク
  • niftyブックマーク
  • Buzzurl

Menu

メニューサンプル1

メニューサンプル2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム

【メニュー編集】

Wikiをはじめる

マイページ