この記事では、java に関する関連知識を提供します。主にパフォーマンスに関連する設計パターンを紹介します。ほとんどの設計パターンはコードを整理する方法にすぎず、パフォーマンスに関連するのは設計パターンの一部のみです。 、プロキシ モード、シングルトン モード、フライウェイト モード、プロトタイプ モードなどが含まれます。一緒に見てみましょう。皆さんの参考になれば幸いです。
推奨学習: 「java ビデオ チュートリアル 」
コードの構造は、コードの全体的なパフォーマンスに重要な影響を与えます。応用。優れた構造を持つコードは、多くの潜在的なパフォーマンスの問題を回避し、コードのスケーラビリティに大きな役割を果たします。明確な構造と明確な層を持つコードは、システム内のボトルネックを見つけて特別な最適化を実行するのにも役立ちます。
デザイン パターンは一般的な開発テクニックを要約したもので、プログラマーがより専門的かつ便利な方法で問題を伝達できるようにします。
実際、ほとんどのデザイン パターンはプログラムのパフォーマンスを向上させるものではなく、コードを整理する単なる方法です。この記事では、プロキシ モード、シングルトン モード、フライウェイト モード、プロトタイプ モードなど、パフォーマンスに関連するいくつかの設計パターンを 1 つずつ例を挙げて説明します。
プロキシ モード (プロキシ) では、プロキシ クラスを通じてオブジェクトへのアクセスを制御できます。
Java で動的プロキシを実装するには、主に 2 つのモードがあります。1 つは JDK を使用する方法、もう 1 つは CGLib を使用する方法です。このうち、JDK メソッドはインターフェイス指向であり、主な関連クラスは InvocationHandler と Proxy、CGLib は通常のクラスをプロキシでき、主な関連クラスは MethodInterceptor と Enhancer です。
このナレッジポイントに関するインタビューの頻度は非常に高いです。
package cn.wja.proxy.cglibproxy;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects); }}
package cn.wja.proxy.cglibproxy;import cn.wja.proxy.jdkproxy.Target;import cn.wja.proxy.jdkproxy.TargetImpl;import org.springframework.cglib.proxy.Enhancer;public class CglibFactory { public static Target newInstance() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(TargetImpl.class); enhancer.setCallback(new CglibInterceptor()); return (Target) enhancer.create(); } public static void main(String[] args) { Target target = newInstance(); System.out.println(target.targetMetod(4)); }}
package cn.wja.proxy.jdkproxy;public interface Target { int targetMethod(int i);}
package cn.wja.proxy.jdkproxy;public class TargetImpl implements Target { @Override public int targetMethod(int i) { return i * i; }}
package cn.wja.proxy.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class JdkInvocationHandler implements InvocationHandler { private Target target; public JdkInvocationHandler(Target target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //before Object object = method.invoke(target, args); //after return object; }}
package cn.wja.proxy.jdkproxy;import java.lang.reflect.Proxy;public class JdkFactory { public static Target newInstance(Target target) { Object object = Proxy.newProxyInstance(JdkInvocationHandler.class.getClassLoader(), new Class>[]{Target.class}, new JdkInvocationHandler(target)); return Target.class.cast(object); } public static void main(String[] args) { Target t = new TargetImpl(); Target target = newInstance(t); System.out.println(target.targetMethod(4)); }}
以下は、JDK モードと CGLib モードのプロキシ速度の JMH テスト結果です:
ベンチマーク | モード | Cnt | スコア | エラー | 単位 |
---|---|---|---|---|---|
thrpt | 10 | 78499.580 | ±1771.148 | ops/ms | |
thrpt | 10 | 88948.858 | ±814.360 | ops/ ms |
プロキシの作成速度を見てみましょう。結果は次のとおりです。プロキシ クラスの初期化に関して、JDK のスループットは CGLib の 2 倍であることがわかります。
モード | Cnt | スコア | エラー | 単位 | |
---|---|---|---|---|---|
thrpt | 10 | 7281.487 | ± 1339.779 | #ops/ms##ProxyCreateBenchmark.jdk | |
10 | ##15612.467± 268.362 | ops/ms |
以上がJava のパフォーマンス関連の設計パターンについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。