性能比較は、(b)はJavaにはいくつかの方法のインスタンスを作成します

いくつかの予備的な結論を導き出す、簡単なテストを書くためのいくつかの方法で前。ラムダ原理のこの簡単な概要の後、テストはかなり多くのシーンの実際の開発に合わせて、いくつかの調整、異なる結果を得る見つけ、この調整を行いました。

個人をいくつかのインスピレーションを引き起こし、ラムダ原理を理解するために主にブログから、検証するために、テストコードは、いくつかの改良されていません。

:このブログの作者に感謝https://www.cnblogs.com/UncleWang001/p/10020611.htmlを  ラムダ式のメカニズムを扱います-

調整後コード:

  1つの パッケージcom.supalle.test。
  2  
  3  インポートlombok.AllArgsConstructor。
  4  インポートlombok.Builder。
  5  輸入lombok.Data。
  6  インポートlombok.NoArgsConstructor。
  7  
  8  インポートjava.lang.reflect.Constructor。
  9  インポートにjava.lang.reflect.InvocationTargetException。
10  インポートjava.util.function.Supplier。
11  
12  / ** 
13  * @描述:语法PK
 14  * @作者:Supalle
 15  * @时间:2019年7月26日
 16   * / 
17 パブリック クラスSyntaxPKTest {
 18である 
19。 
20      / * 周期* / 
21である     プライベート 最終 静的 int型 SIZE = 100000000 ;
 22である 
23れる     / * 以下のクラスを持っている* / 
24      @Data
 25      @Builder
 26は     @NoArgsConstructor
 27      @AllArgsConstructor
 28      プライベート 静的 クラスマン{
 29          プライベート文字列名;
 30          プライベート INT 年齢;
 31である     }
 32  
33であります 
34      / ** 
35       *使用新しい男();
36       *
 37       * @return 运行耗时
 38       * / 
39      パブリック 静的 長いrunWithNewConstructor(){
 40          長い開始= にSystem.currentTimeMillis();
41  
42          のためにint型 ; iが大き<I ++は、I = 0 ){
 43              新しいSyntaxPKTest.Man()。
44          }
 45の 
46          リターンのSystem.currentTimeMillis() - 始めます。
47      }
 48  
49     / ** 
50       *使用反射
 51       *
 52       * @return 运行耗时
 53       * / 
54      パブリック 静的 長い runWithReflex()スローないNoSuchMethodException、IllegalAccessExceptionが、にInvocationTargetException、ないInstantiationException {
 55          コンストラクタ<SyntaxPKTest.Man>コンストラクタ= SyntaxPKTest.Man。クラス.getConstructor();
56          長いスタート= にSystem.currentTimeMillis();
57  
58          のためにint型 i = 0; iはSIZE <; iは++ ){
 59             ; Constructor.newInstance()
 60          }
 61である 
62が         返さ -にSystem.currentTimeMillisを();開始
 63がある     }
 64  
65      / ** 
66の      *マンインナークラスは、新しい新しい()を呼び出します;
 67       *
 68       * @return 加工走ら
 69       * / 
70      パブリック 静的 ロングrunWithSubClass(){
 71は         ロングスタート= ;のSystem.currentTimeMillis()
 72  
73サプライヤー<人> =新しい新規サプライヤサプライヤ<男>(){で
 74 @Override 
 75は公衆マンGET(){
 戻り新たな新しい男76(); 
 77} 
 78}; 
79          INT I = 0; Iサイズ<; I ++は){
 80              supplier.get();
 81  
82          }
 83の 
84          リターンのSystem.currentTimeMillis() - 開始;
 85      }
 86  
87      / ** 
88       ラムダコール新新()を使用して、*男、
 89       *
 90       * @return 加工走ら
 91です      * / 
92      公共の 静的な ロングrunWithLambda(){
 93         長いスタート= にSystem.currentTimeMillis();
94  
95サプライヤー<男>サプライヤー=() - >新しい男();
96  
97          のためにint型 ; iが大き<I ++は、I = 0 ){
 98              supplier.get()。
99          }
 100の 
101          戻りのSystem.currentTimeMillis() - 始めます。
102      }
 103  
104  
105      / ** 
106       *使用MethodReference
 107       *
 108       * @return 运行耗时
 109       * / 
110      パブリック スタティック 長いrunWithMethodReference(){
 111          長い開始= にSystem.currentTimeMillis();
112  
113サプライヤー、<男>サプライヤー=マン::新しいです。
114  
115          のためのint型 I 0 =;私はサイズ<; Iは++ ){
 116              supplier.get()。
117          }
 118の 
119          戻りのSystem.currentTimeMillis() - 始めます。
120      }
 121  
122      公共 静的 ボイドメイン(文字列[]引数)がスローないNoSuchMethodException、IllegalAccessExceptionが、ないInstantiationException、にInvocationTargetExceptionを{
123  
124          // ローディングバイトコード男性の試験呼び出しの前に、公正であることを試みる
125          SyntaxPKTest.ManのMAN1 = 新しい新)SyntaxPKTest.Man(;
 126          SyntaxPKTest.ManのMAN2 = 新しい新 SyntaxPKTest.Man( "ジョー・スミス"、20 )、
 127  
128          のSystem.out.println( "試験環境:CPUコア- " + 。Runtime.getRuntime()availableProcessors());
 129  
130          のSystem.out.println()
 131は、 
132          // 次いで、比較時間再びここで呼ばれる
133          System.out.println( "最初の使用新しいマン()かかり:" + runWithNewConstructor());
 134 System.err.println( "再び新しいマン()かかり使用:" + runWithNewConstructor())。
135          のSystem.out.println( "最初の使用加工の反射:" + runWithReflex());
 136 System.err.println( "処理再利用反射:" + runWithReflex());
 137          のSystem.out.println( "新しいマン()を呼び出すための内部クラスの最初の使用は、かかる"+ runWithSubClass());
 138 System.err.println("新マン(呼び出すために再び使用される内部クラス)がかかり:「+ runWithSubClass());
 139          のSystem.out .println( "最初の使用ラムダコール新しいマン()かかり:" + runWithLambda());
 140 System.err.println( "ラムダコール再び使用して、新しいマン()かかり:" + runWithLambda());
 141          システム.out.println( "第1の使用MethodReferenceは、時間がかかり:" + runWithMethodReference())。
142 System.err.println( "処理MethodReferenceを再利用:" + runWithMethodReference());
 143  
144  
145      }
 146  
147 }

この調整、外循環へちょうど内部クラス、ラムダ、メソッド参照、私たちの共通の状況に合わせて、より。

テスト結果は本当に大きな変化に比較されます。

1初めて新しい新しい 4:加工マン()
 再び処理2を使用して、新しいマン():1 
。3初めてが処理反射:237
 4を再度処理反射使用:251 
。5つの最初の内部クラスを呼び出し、新しい新しい加工マン() 5
 。6再度処理新しいマン()を呼び出すために内部クラスを使用して:2 
7。ラムダ使用して最初の呼び出しの新しい新加工マン():41
 。再び8が処理ラムダ新しいマン()を使用してコール:3 
。9第1の使用MethodReference時間:4
 1:10は再びMethodReference時間を使って

 

1初めて新しい新しい 3:加工マン()
 2再び処理新しいマン()の使用:2 
。3 240:加工リフレクション使用初めて
 再び処理反射用いて、4:256 
。5つの第一インナークラスコール新しい新しいマン()が処理:5
 。3:6再び処理新しいマン()を呼び出すために内部クラスを使用する
。7ラムダ使用して最初の呼び出しの新しい新マン()加工:43
 。4:8再びラムダ新しいマン()時間使用して呼び出す
。9初めてMethodReference時間:4
 1:10は再びMethodReference時間を使って

 

最初の使用新しい新マン()時間:3 
2:(再度)時間を新しいマンを用いて
反射時間を使用して初めて: 238 
251:再び反射時間使用して
呼び出すために内部クラスを使用して、初めての新しい新 5)マン(時間を
再び内部を使用して1:クラスは、新しいマン()時間を呼び出し
ラムダコール使用初めて新しい新 39:男()時間
を再び使用してラムダコール新しいマン()時間:5 
:初めてMethodReference時間の 3 
MethodReference時間を使用して再度:2

 

あなたは裏返しクラスとオブジェクトを作成し、インターフェイスを実装するインスタンスの後に主に使用されてサプライヤー<男>を作成し、ラムダメソッドリファレンスにも時間がかかり、非常に小さい見ることができ、本質的に異なるものではないので、パフォーマンスに違いはありません。大規模な。

結論:

  それは究極のパフォーマンスの柔軟なシンプルかつ追求を維持する必要がある場合は、ラムダやメソッドリファレンスは、内側のループで書くことではないしようとすると、使用しています。

 

おすすめ

転載: www.cnblogs.com/supalle/p/11332519.html