パフォーマンスは休日です

JPoint 2017から戻って、非常に多くのメガクールなプログラマーと話をしたことを喜びとして、帽子をかぶってさまざまな種類の最適化を掘り下げることにしました。







https://xkcd.com/1781/









JPoint 2017は、2016年10月にジョーカーで発表したAlexei Shipilevによる大規模なプレナリーレポートで始まりました。それから、私はオンラインでそれを見て、 Curve Shを吹き込みました







それらを曲げます。 W







そして、 赤のゾーン多少とも透明度が高い場合、 緑と黄色の境界線ではそれほど明確ではありません-それは何ですか? 例がありますか?







System.arraycopy



叙事詩から始めましょう スラチャ 質問-より速い-ジェダイ手剣







for (int i = 0; i < src.length; i++) target[i] = src[i];
      
      





または人種的に忠実なSystem.arraycopy









現時点では、ベクトル化と組み込みにより、両方のオプションが同等になります-好みの好みの問題です。







collection.toArray()



たとえば、行のコレクションがあり、配列を受け取ります。







最良の(善の敵)ソリューション:







 String[] array = collection.toArray(new String[collection.size]);
      
      





忘れて!



古代の知恵の配列は 、新しいものは忘れられた古いものであることを教えています







 String[] array = collection.toArray(new String[0]);
      
      





新しいArrayList



以前(ツリーが高かったとき)ArrayList / HashMap /などのインスタンスを作成すると、初期サイズの配列が内部に作成されました(ArrayListの場合は10、HashMapの場合は0x10)。







別のことは、コレクションに入れる要素の数を事前に知っていたときです-経験豊富なジェダイはすぐに次のようなものを作成します







 List<String> strings = new ArrayList<>( values.length );
      
      





すぐにあなたのvalues



と幸福を詰め込みます-あなたの目標への10の要素からの偽の配分はありません。







しかし、値自体がまだ存在しない場合はどうなるでしょう-nullを台無しにしたくないのですが、もう3つ 、たとえば3つはないことを知っていますか?







 List<String> strings = new ArrayList<>( 3 );
      
      





そして、彼らはそれを運転しました-そのようなリストごとに保存された7セルの利益(〜7 * 16バイト/リスト)、一度満たされます。







忘れて!



openjdkで空のHashMapとArrayListのコミットを最適化 -コンストラクターから作成されたすべてのArrayList / HashMapはデフォルトで空の静的スタブを保持します-最初の追加は10個の要素の配列を作成します(ArrayList、HashMapの16)、 new ArrayList( int )



配列を活発かつ即座に作成します。







String.split(正規表現)



ジェダイは正規表現について何を知っていますか?

https://xkcd.com/208/







毎回正規表現をコンパイルするのは高価で、経験豊富なパダワンは代わりにstringValue.split(regexp)



ようなことをします







 private static final Pattern PATTERN = Pattern.compile(regex); .... String[] strings = PATTERN.split(stringValue);
      
      





利益は、テンプレートが毎回コンパイルされないことです。







忘れて!







忘れて!



シンプルなユースケースのためのString.splitの軽量実装







1文字のセパレーターがある場合、それはタイプ( スペース )または,



コンマ )のセパレーターであり、特殊ではありません。 正規表現タイプ文字.



ピリオド )-その後、正規表現は作成されません。







においのするコード



私は明らかに匂いがするコードについても話しません







 return new StringBuilder().append("value:").append(value).toString();
      
      





それによる利点はありませんが、読みやすさはありません。







XXフラグ



ヒープサイズやその他のXXフラグを非常に手間をかけて選択できますが、時間が経つにつれて、プロジェクトコードに別の1000および1のビジネス機能が追加されると、これらのフラグはすべて、必要な速度の結果を簡単にもたらせなくなります。 腐っていると考えてください。







結論



あなたのプロジェクトが生きており、繁栄していて、あなたが百年か二百年に一度の公演を手配するように頼まれたなら(酔っぱらったテーブルで裸で踊ることも公演ですが、私は他のことについて少しです)、あらゆる種類の最適化が現れ、その黄色から可能性があります有効期限が過ぎると臭いがするだけでなく、元のタスクとは逆のタスクを実行するゾーン-アプリケーションの速度が低下します。













PMDのようなアナライザー、またはお気に入りのIDEが、PRODで実行するJavaのバージョンに関連する推奨事項を持っているという希望はありません ==>







監査 手品 知識。








All Articles