古い回答については下記を参照してください。
IRCのGrinnzについて議論した後、私はこの回答の結果をプラグインに入れて、Mojolicious::Plugin::Renderer::WithoutCacheとしてCPANでリリースしました。
あなたはこのようにそれを使用することができます:
use Mojolicious::Lite;
plugin 'Renderer::WithoutCache';
それは何もしない新しいキャッシュオブジェクトを作成し、レンダリングにグローバルことをインストールします。そうすれば、私の最初の答えのように毎回作成する必要はありません。
理論的には、これがあるべきより速いGrinnz' approach(もっと賢明である)、そしてあなたが明示的にキャッシュにしたくないから、あなたは明らかに物事が右に、可能な限り高速になりたいですか?実際のMojo :: Cacheはまだキャッシュを設定しようとする必要がありますが、空きキーがなくなるたびに中断し、毎回キャッシュから値を検索しようとするため、おそらく早いでしょう。
DumbbenchとBenchmarkの両方でこれをベンチマークしました。両方とも無視できる結果を示した。私はそれらを数回走らせましたが、それらは多く変動しました。そして、どちらが速いのかは明らかではありません。私は実装の速いところで実行の出力を含めましたが、それはまだ違いがどれほど小さいかを示しています。 Dumbbenchと
ベンチマーク:ベンチマークと
use Dumbbench;
use Mojolicious::Renderer;
use Mojolicious::Controller;
use Mojolicious::Plugin::Renderer::WithoutCache::Cache;
my $controller = Mojolicious::Controller->new;
my $renderer_zero_keys = Mojolicious::Renderer->new;
$renderer_zero_keys->cache->max_keys(0);
my $renderer_nocache = Mojolicious::Renderer->new;
$renderer_nocache->cache(Mojolicious::Plugin::Renderer::WithoutCache::Cache->new);
my $bench = Dumbbench->new(
target_rel_precision => 0.005,
initial_runs => 5000,
);
$bench->add_instances(
Dumbbench::Instance::PerlSub->new(
name => 'max_keys',
code => sub {
$renderer_zero_keys->render($controller, { text => 'foobar' });
}
),
Dumbbench::Instance::PerlSub->new(
name => 'WithoutCache',
code => sub {
$renderer_nocache->render($controller, { text => 'foobar' });
}
),
);
$bench->run;
$bench->report;
__END__
max_keys: Ran 8544 iterations (3335 outliers).
max_keys: Rounded run time per iteration: 5.19018e-06 +/- 4.1e-10 (0.0%)
WithoutCache: Ran 5512 iterations (341 outliers).
WithoutCache: Rounded run time per iteration: 5.0802e-06 +/- 5.6e-09 (0.1%)
ベンチマーク:
use Benchmark 'cmpthese';
use Mojolicious::Renderer;
use Mojolicious::Controller;
use Mojolicious::Plugin::Renderer::WithoutCache::Cache;
my $controller = Mojolicious::Controller->new;
my $renderer_zero_keys = Mojolicious::Renderer->new;
$renderer_zero_keys->cache->max_keys(0);
my $renderer_nocache = Mojolicious::Renderer->new;
$renderer_nocache->cache(Mojolicious::Plugin::Renderer::WithoutCache::Cache->new);
cmpthese(
-5,
{
'max_keys' => sub {
$renderer_zero_keys->render($controller, { text => 'foobar' });
},
'WithoutCache' => sub {
$renderer_nocache->render($controller, { text => 'foobar' });
},
}
);
__END__
Rate max_keys WithoutCache
max_keys 190934/s -- -2%
WithoutCache 193846/s 2% --
私はそれが最終的に違いを生むが、その考え通話の多い高負荷環境での偵察証明することは非常に難しいです。したがって、キャッシュの内部について考えるのが好きでない場合は、このプラグインが役に立ちます。
旧答え:Mojolicious::Plugin::EPRendererを見て
私はcache
があることが分かりました。 get
、set
、max_keys
のメソッドを持ち、Mojo::Base(おそらくMojoliciousのすべてのもの)から継承したMojo::Cacheインスタンスです。
::EPRenderer gets a $renderer
は、Mojolicious::Rendererです。 Mojo :: Cacheインスタンスを保持します。私は$c
をData::Printerと見て、それらのすべてを保持する$c->app
があることを知りました。
これを知ることで、何もしない独自のキャッシュクラスを簡単に作成できます。
package Renderer::NoCache;
use Mojo::Base -base;
sub get {}
sub set {}
sub max_keys {}
今度は$c
に貼り付けます。
package Foo;
use Mojolicious::Lite;
get '/' => sub {
my $c = shift;
$c->app->renderer->cache(Renderer::NoCache->new);
$c->render(template => 'foo', name => 'World');
};
app->start;
__DATA__
@@ foo.html.ep
Hello <%= $name =%>.
今get
またはset
キャッシュへのあらゆる試みは、単に何もしません。それはキャッシングを試みますが、何も見つけられません。
もちろん、毎回新しいオブジェクトを作成するのは素晴らしいことではありません。起動時にそのオブジェクトを一度作成し、app
の内部パーマネントバージョンにする方がよいでしょう。あなたはCGIを持っているので、違いはありません。
また、単にget
Mojo::Cache
の外をサルは、パッチを当てることができました。これよりハックアプローチは同じことを行います。
package Foo;
use Mojolicious::Lite;
*Mojo::Cache::get = sub { };
get '/' => sub {
my $c = shift;
$c->render(template => 'foo', name => 'World');
};
app->start;
しかしを注意してください:私たちはからモジョ::キャッシュを使用して、アプリケーション内のすべてのキャッシュをフェッチ無効。これはあなたが望むものではないかもしれません。
あなたはtime_をほとんどの_worksで私を持っていました。 :) – simbabque