いくつかの予備的な結論を導き出す、簡単なテストを書くためのいくつかの方法で前。ラムダ原理のこの簡単な概要の後、テストはかなり多くのシーンの実際の開発に合わせて、いくつかの調整、異なる結果を得る見つけ、この調整を行いました。
個人をいくつかのインスピレーションを引き起こし、ラムダ原理を理解するために主にブログから、検証するために、テストコードは、いくつかの改良されていません。
:このブログの作者に感謝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
あなたは裏返しクラスとオブジェクトを作成し、インターフェイスを実装するインスタンスの後に主に使用されてサプライヤー<男>を作成し、ラムダメソッドリファレンスにも時間がかかり、非常に小さい見ることができ、本質的に異なるものではないので、パフォーマンスに違いはありません。大規模な。
結論:
それは究極のパフォーマンスの柔軟なシンプルかつ追求を維持する必要がある場合は、ラムダやメソッドリファレンスは、内側のループで書くことではないしようとすると、使用しています。