2

Java のパフォーマンスとメソッドの実行に関する質問があります。

私のアプリには、いくつかのパラメーターを検証する必要がある場所がたくさんあるので、Validator クラスを作成し、すべての検証メソッドをそこに入れました。次に例を示します。

public class NumberValidator {
    public static short shortValidator(String s) throws ValidationException{
        try{
            short sh = Short.parseShort(s);

            if(sh < 1){
                throw new ValidationException();
            }
            return sh;
        }catch (Exception e) {
            throw new ValidationException("The parameter is wrong!");
        }
    }
...

しかし、私はそれについて考えています。これでよろしいですか?オブジェクト指向でモジュール化されていますが、パフォーマンスを考えると、それは良い考えですか? 同時に非常に多くの呼び出しがあった場合はどうなりますか? 上記のスニペットは短くて速いですが、もっと時間がかかる方法もあります。

同じクラス内の静的メソッドまたはインスタンス メソッドへの呼び出しが多く、メソッドが同期されていない場合はどうなりますか? すべての呼び出しメソッドが一列に並ぶ必要があり、JVM はそれらを順番に実行しますか?

上記と同一のクラスをいくつか用意し、それらの同一のメソッドをランダムに呼び出すことは良い考えですか? 「同じことを繰り返すな」や「複製は悪」などの理由から、そうではないと思いますが、パフォーマンスはどうでしょうか。

よろしくお願いします。

4

5 に答える 5

1

メソッドの再入可能性: 静的な場合、状態を保持しないため、完全に安全です。

パフォーマンスについて: ユースケースを見てください。文字列を検証しているので、ユーザー入力を検証しているとしか思えません。いずれにせよ、システムの同時ユーザー数がパフォーマンスのボトルネックになる可能性はありません。

于 2010-04-21T13:51:45.113 に答える
1

2 つのコメントのみ:

1) 検証をメソッドに分解すると、実際にはパフォーマンスが少し向上する場合があります。私の知る限り、JIT コンパイラは頻繁なメソッド呼び出しを検出するように設計されています。したがって、検証方法は JIT 最適化の有力候補です。

2) 「catch(Exception e)」を回避してみてください。すべての種類の RuntimeException もキャプチャするため、これはお勧めできません。重要な検証のいずれかにバグがある場合は、コード内のバグを隠す ValidationException をスローすることがあります。

于 2010-04-21T13:56:37.760 に答える
0

パフォーマンスの問題が発生していますか?

最初にコードを保守しやすいものにしてください。期待に応えられない場合は、読みやすく、リファクタリングしやすくなります。

すべての選択肢で速度を最適化するようにコードを作成すると、コードが判読不能になることが多く、単純なバグを修正するために最初からやり直す必要があります。

つまり、メソッドはstaticであり、一度だけ初期化する必要があります。それ高速バージョンです。:-)

于 2010-04-21T13:54:29.683 に答える
0

あなたの懸念が何であるかわかりません。メソッドが同期されていないと述べたので、複数のスレッドからの同時呼び出しがあると思います。また、メソッドは同期されていないため、どの呼び出しも問題なく同時に実行できます。

このメソッドをコピーして呼び出し元のクラスに貼り付けても、パフォーマンスが向上することはありません。コードサイズが大きくなり、プロセッサキャッシュのスペースが浪費されるため、パフォーマンスが低下する可能性がありますが、このような短い方法では、トラスキュラブルな効果だと思います。

于 2010-04-21T13:40:45.040 に答える
0

私はこのコードを疑っていますが、パフォーマンス上の理由からではなく、抽象化に値するものをうまく抽象化していないと思います。

ユーザー入力をチェックするための場合は、「許可されているウィジェットの最大数は 9999 です」などの妥当なエラー メッセージを「ValidationException」に置き換えます。また、引数 (または try/catch 句) のようなものを追加してメッセージをコンテキストで正しく取得する場合、ほぼ確実に、必要な呼び出しサイト コードは単純な方法よりも複雑になり、作成と保守が難しくなります。

内部の健全性チェックの場合、引数を文字列としてあちこちに渡し、それらを継続的に解析および検証している場合、意味のあるパフォーマンスが失われ始め、複雑さとバグが大幅に増加する可能性があります。

于 2010-04-21T14:16:35.717 に答える