本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはバウンスメール解析ライブラリSisimai
本稿のサンプルコードは、
コードは遅くなる
ソフトウェアは機能の追加やバグの修正によって次第にコードが膨れ、
本稿では、
速度と保守性を考える
まず、
極端な例を出します。超高速に動くが誰も読めない魔術的なコードと、
前者は速度において優れている、
速度を求める
商業的見地から、
保守性を求める
コードの読みやすさは慣れや経験に基づく個人差があります。組織やチームのコーディングルールで禁止されている書き方もあるでしょう。とはいえ、
速度と保守性は両立できる
速くて読みやすいコードは存在します。いかなる状況においても、
コードを速くする前にまず計測
では、
しかし、
部分を競うベンチマーク
ベンチマークは、Benchmark
モジュールとTest::More
モジュールを使ったベンチマークコードを書き、Devel::Size
モジュールを使ってメモリ使用量の違いも見ます。
複数回実行したベンチマーク結果の中央値Devel::NYTProf
モジュールで複数回プロファイリングを実行します。全体でも高速化ができていれば、
使用したPerlのバージョン
本稿のベンチマークは、
- Perl 5.
18. 2 (2014年1月リリース) - Perl 5.
28. 1 (2018年12月リリース)
Perl 5.
ただし、Benchmark
モジュールが出力した結果は、__
以降にそのまま載せていますので、
誌面で省略した部分
誌面のコードには、
具体的には、
コード冒頭のuse文
ベンチマークコードの冒頭では、use
文が書いてあるものとします。
#!/usr/bin/env perl
use strict;
use warnings;
use Benchmark ':all'; # ベンチマーク用モジュール
use Test::More 'no_plan'; # 比較対象結果の検査で使う
コード末尾の検証と実行部分
ベンチマークコードの末尾では、Test::More
モジュールのisによる結果の検証と、Benchmark
モジュールのcmpthese
によるベンチマーク実行コードが書いてあるものとします。
is ss($Email), '[email protected]';
is yy($Email), '[email protected]';
printf("Perl %s on %s\n%s\n", $^V, $^O, '-' x 50);
cmpthese(6e6, {
's///' => sub { ss($Email) },
'y///' => sub { yy($Email) },
});
環境構築と実行方法
Benchmark
モジュールとTest::More
モジュールはPerlのコアモジュールですので、Devel::Size
モジュールと、Devel::NYTProf
モジュールは、cpanm
モジュール名というコマンドを実行して、
本誌サポートサイトから入手できるベンチマークコードは、
$ perl ./s-vs-y.pl
Rate s/// y///
s/// 928793/s -- -77%
y/// 4054054/s 336% --
Benchmark
モジュールが出力する結果は、Benchmark::cmpthese
に指定した表示名s///
、y///
)、928793/
、4054054/
)、-77%
、336%
)
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT