6

最近、私はOO Perlで遊び始め、現在取り組んでいる新しいプロジェクトのためにかなりの数の新しいオブジェクトを作成しています。私はOOPerlに関するベストプラクティスに不慣れであり、それを成し遂げるために急いで親切にしています:P

私はこの種のコードを各関数にたくさん入れています:

sub funcx{
    use ObjectX; # i don't declare this on top of the pm file 
                 # but inside the function itself
    my $obj = new ObjectX;
}

use Object関数スコープの外でPerlモジュールの上に行を置くのと比べて、これが悪影響を引き起こすのではないかと思っていました。

機能を変更する必要がある場合に備えて、よりクリーンに感じるようにこれを行っていました。

そして、私が気付いたもう1つのことは、オブジェクトをテストするUNIXサーバー自体でtest.plスクリプトを実行しようとすると、非常に遅くなることです。ただし、Apacheサーバーに接続されているCGIを介して同じコードを実行すると、Webページの読み込みが遅くなります。

4

3 に答える 3

10

どこに使用しますか?

useコンパイル時に発生するため、どこに置いてもかまいません。少なくとも純粋に実用的な観点からは、「それは機能しますか」という観点から。コンパイル時に発生するためuse、条件付きでも常に実行されます。これは絶対にしないでください。if( $foo eq 'foo' ) { use SomeModule }

私の経験では、すべてのuseステートメントをファイルの先頭に置くのが最善です。ロードされているものと依存関係を簡単に確認できます。


アップデート:

brian d foyが指摘しているように、ステートメントの前にコンパイルされたものはuse影響を受けません。したがって、場所が重要になる可能性があります。通常のモジュールの場合、場所は重要ではありませんが、コンパイルに影響を与えること(たとえば、プロトタイプを持つ関数をインポートすること)を行う場合は、場所が重要になる可能性があります。

また、 Chas Owensは、コンパイルに影響を与える可能性があると指摘しています。コンパイルを変更するように設計されたモジュールは、プラグマと呼ばれます。プラグマは、慣例により、すべて小文字で名前が付けられます。これらの効果は、モジュールが使用されるスコープ内でのみ適用されます。チャスはinteger彼の答えの例としてプラグマを使用しています。キーワードを使用して、限定されたスコープでプラグマまたはモジュールを無効にすることもできますno

use strict;
use warnings;

my $foo;
print $foo;  # Generates a warning

{   no warnings 'unitialized`;  # turn off warnings for working with uninitialized values.

    print $foo;  # No warning here
}
print $foo; # Generates a warning

間接目的語構文

サンプルコードには、がありますmy $obj = new ObjectX;。これは間接目的語構文と呼ばれ、あいまいなバグにつながる可能性があるため、避けるのが最善です。次のフォームを使用することをお勧めします。

my $obj = ObjectX->new;

サーバーでテストスクリプトが遅いのはなぜですか?

あなたが提供した情報で見分ける方法はありません。

ただし、コードをプロファイリングして、時間が消費されている場所 を確認するのが簡単な方法です。NYTProfは、もう1つの人気のあるプロファイリングツールです。

ベストプラクティス

Perlのベストプラクティスとクイックリファレンスカードを確認してください。このページには、PBPからのDamianConwayのOOPアドバイスの概要が記載されています。

また、 Mooseの使用を検討することもできます。スクリプトの起動時間が長いことが使用に適している場合は、Mooseが大きなメリットになります。

于 2009-09-22T02:41:05.003 に答える
6

質問1

モジュールが何をするかによって異なります。字句効果がある場合、それが使用されているスコープにのみ影響します。

my $x;
{
    use integer;
    $x = 5/2; #$x is now 2
}
my $y = 5/2; #$y is now 2.5

通常のモジュールであればどこで使用しても問題はありませんが、プログラムの先頭でそれらのモジュールをすべて使用するのが一般的です。

質問2

マシン間のプログラムの速度に影響を与える可能性のあるもの

  1. プロセッサの速度
  2. インストールされているモジュールのバージョン (一部のモジュールには、はるかに高速な XS バージョンがあります)
  3. Perlのバージョン
  4. PERL5LIB のエントリ数
  5. ドライブの速度
于 2009-09-22T03:09:59.307 に答える
3

daotoad とチャス。Owens は、使用ステートメントの位置に関する質問の一部に既に回答しています。ここで別のことを述べさせてください。

関数を移動する必要がある場合に備えて、よりクリーンに感じるように、これを行っていました。

個人的には、使用されているすべてのモジュールをファイルの先頭に 1 か所にまとめた方がずっときれいだと思います。他のどのモジュールが使用されているかを確認するために use ステートメントを検索する必要はありません。一目で何が使用されていて、何が使用されていないかさえわかります。

パフォーマンスの問題について: Apache と mod_perl を使用すると、Perl インタープリターは使用したモジュールを一度だけ解析してコンパイルする必要があります。次回スクリプトを実行すると、実行速度が大幅に向上するはずです。ただし、コマンド ラインでは、2 回目の実行ではこの利点が得られません。

于 2009-09-22T07:16:35.267 に答える