11

最近Mooseをダウンロードしました。実験的に、Mooseの既存のモジュールを書き直しました。繰り返しの多いコードを書かないようにするのに便利な方法のようです。モジュールのテストを実行しましたが、少し遅れていることに気づきました。-d:DProfを使用してコードをプロファイリングしましたが、この行を含めるだけのようです。

no Moose;

コード内では、実行時間が約0.25秒増加します(私のコンピューターでは)。これは典型的なことですか?私は何か間違ったことをしていますか、それを誤ってインストールしましたか、それともこれだけの遅延を本当に期待する必要がありますか?

4

3 に答える 3

20

はい、Mooseを使用することには少しペナルティがあります。ただし、これは起動時のペナルティであり、実行時ではありません。すべてを適切に記述した場合、実行時に非常に高速になります。

この行も含めましたか:

__PACKAGE__->meta->make_immutable;

あなたがするときあなたのすべてのクラスでno Moose;?このメソッドを呼び出すと、(実行時)が速くなります(起動時間が犠牲になります)。特に、オブジェクトの構築と破棄はクラスに効果的に「インライン化」され、メタAPIを呼び出さなくなります。クラスを不変にすることを強くお勧めします。コンパイル時のコストを抑えながら、コードを大幅に高速化します。これは、多くのオブジェクトを作成するときに特に顕著になります。1 2

ただし、このコストが高すぎる場合もあります。スクリプト内でMooseを使用している場合、またはコンパイル時間が全体の使用時間のかなりの部分を占めるその他の方法で使用しているs/Moose/Moo/g場合は、試してみてください。MooseXモジュールを使用していない場合は、Mooに切り替えることができます。目標は、Mooseの柔軟性の90%を維持しながら、(起動時に)高速化することです。

Webアプリケーションを使用しているので、Plack / PSGIの使用を検討しましたか?

1make_immutableのドキュメントからMoose::Cookbook :: Basics ::Recipe7に
あります。2StevanLittleの記事も参照してください:Mooseクラスにmake_immutableが推奨される理由

于 2010-07-02T01:09:38.030 に答える
12

Moose :: Cookbook :: FAQ:を参照してください。

ムースが遅いと聞きましたが、本当ですか?

繰り返しますが、これはトリッキーなので、はい、いいえ。

第一に、人生で無料のものはなく、Mooseの機能の中には他の機能よりもコストがかかるものがあります。また、Mooseのポリシーでは、使用した機能に対してのみ課金し、使用していない機能のコードの実行に余分な負担をかけないように最善を尽くします。もちろん、Moose自体の使用にはある程度のオーバーヘッドが伴いますが、ほとんどの場合、コンパイル時間です。この時点で、必要な速度を得るために利用できるいくつかのオプションがあります。

現在、速度を上げる手段として、クラスを不変にするオプションを提供しています。これは、コンパイル時間のコストがわずかに大きくなることを意味しますが、実行時の速度の向上(特にオブジェクトの構築)はかなり重要です。これは、次のコードで実行できます。

MyClass->meta->make_immutable();

Class::MOPのホットスポットを定期的にXSに変換しています。FlorianRagwitzとYuvalKogmanは現在、アクセサーとインスタンスを直接Cにコンパイルする方法に取り組んでいます。これにより、誰もが非常に高速なOOを楽しむことができます。

一方、私はDancerMooseを使用するWebアプリケーションに取り組んでいます。アプリケーションはHTTPDデーモンとして実行されているため、サーバーが初期化されると、これは実際には関係ありません。限られたハードウェアまたは仮想サーバーでの私の要件に対して、パフォーマンスは十分すぎるようです。

このプロジェクトにMooseとDancerを使用すると、私の小さなデモアプリケーションが約5,000行から1,000行未満に縮小されるという追加の利点があります。

アプリに依存させたいものの量は、考慮しなければならないトレードオフの1つです。CGIアプリは、依存関係を制限することで応答性が向上します。

于 2010-07-02T13:56:26.157 に答える
6

あなたの質問は少し欺瞞的です。はい、Mooseには測定可能な初期費用がかかりますが、その後は遅くはありません。起動コストが法外な場合は、いつでもアプリケーションをデーモン化できます。

于 2010-07-02T00:46:03.887 に答える