Java例外ループ却はでURLEncodingこんなことをしたのだろう。)
-
05-09-2019 - |
質問
私が書いた体blurbかしここまでやってきましたが、作るのが難しいのですが、コードのう:)
調査を実施しているのは、同じ考えて性能のtest3()とのものと同じでなければならなtest1()-唯一の違いは、例外のって国内のメソッドを呼び出しのためのtest1()内のメソッド呼び出し時に実行されたtest3())
なぜtest3()を定期的に時間をかtest1()およびtest2()を完了ですか?
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class Test {
public static void main(String[] args) {
warmup();
test1(2500000); // Exception caught inside the loop
test2(2500000); // Exception caught outside the loop
test3(2500000); // Exception caught "inside" the loop, but in the URLEncoder.encode() method
}
private static void warmup() {
// Let URLEncoder do whatever startup it needs before we hit it
String encoding = System.getProperty("file.encoding");
try {
URLEncoder.encode("ignore", encoding);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void test1(int count) {
String encoding = System.getProperty("file.encoding");
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
try {
URLEncoder.encode("test 1 " + i, encoding);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
System.out.println("Performed " + count + " encodings trying to catch each in " + (end - start) + "ms");
}
private static void test2(int count) {
String encoding = System.getProperty("file.encoding");
long start = System.currentTimeMillis();
try {
for (int i = 0; i < count; i++) {
URLEncoder.encode("test 2" + i, encoding);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Performed " + count + " encodings trying to catch all in " + (end - start) + "ms");
}
private static void test3(int count) {
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
URLEncoder.encode("test 3 " + i);
}
long end = System.currentTimeMillis();
System.out.println("Performed " + count + " encodings with a deprecated method in " + (end - start) + "ms");
}
}
走ているわけで、なぜならば私(JDK1.6.0_13Windows XP)を出力:
Performed 2500000 encodings trying to catch each in 4906ms
Performed 2500000 encodings trying to catch all in 2454ms
Performed 2500000 encodings with a deprecated method in 2953ms
なので、対応もありちゃんな些細なも無関係),btu思!
後...
人が関与することが示唆され、JVMの最適化にどのような様子だったのかになっているのです。そこで、ま壊れたそれぞれの試験下での自分のクラス/メイン方法です。その結果からこの:
1 - Performed 2500000 encodings trying to catch each in 5016ms
1 - Performed 5000000 encodings trying to catch each in 7547ms
1 - Performed 5000000 encodings trying to catch each in 7515ms
1 - Performed 5000000 encodings trying to catch each in 7531ms
2 - Performed 2500000 encodings trying to catch all in 4719ms
2 - Performed 5000000 encodings trying to catch all in 7250ms
2 - Performed 5000000 encodings trying to catch all in 7203ms
2 - Performed 5000000 encodings trying to catch all in 7250ms
3 - Performed 2500000 encodings with a deprecated method in 5297ms
3 - Performed 5000000 encodings with a deprecated method in 8015ms
3 - Performed 5000000 encodings with a deprecated method in 8063ms
3 - Performed 5000000 encodings with a deprecated method in 8219ms
興味深い考察
- との間の間隙を引く話対くもの以外のループが縮でJVM(思最適化しない、全体をひとり占めにすべての試験の一例によりその他繰り返して行う)
- の間のギャップをtry/catch私の側に対し、try/catch内URLEncoder.encode()が小さい(半二以上5000000回)もconsistantlyがあ---
解決
あなたが投稿順にそれを実行します
しようとしている出演2500000のエンコーディング 34208msにそれぞれをキャッチ
すべてをキャッチしようとして行っ2500000のエンコーディング 31708msで2500000エンコードを行った
30738msで非推奨メソッドと
の順序を逆:
と2500000エンコーディングを行いました 32598msで非推奨メソッドが実行
すべてをキャッチしようとしている2500000件のエンコーディング 31239msで2500000エンコードを行った
31208msの各をキャッチしようとしている。
そこで私は実際にあなたがあなたが(確かに、test1のは、あなたのベンチマークが示唆するものである、test3に比べて66%も遅いではありません)。
を見ていると思うものを見ているとは思いません他のヒント
うん、あなたの説明を持って、私は考えてます:
3による関与余分なメソッド呼び出しに1よりも若干遅くなります。
2がより高速であるのいずれか、それを「セットアップ」と「ティアダウン」しないため、例外を引く関連の各ループでバイトコードを。あなたはてjavapとの違いを見るためにバイトコードをオープンクラックすることができます - を見ますhttp://www.theserverside.com/tt/articles/article.tss?l=GuideJavaBytecodeする
彼らは同じではありませんので、あなたは2を使用するか、1かどうかは、あなたが望むどの行動に依存します。あなたは小さな速度が上昇するよりも重要である非推奨メソッドを使用していないので、私は3以上の1を選ぶだろう - 。しかし、1が速くとにかくで起こるように
私を修正しますが、forループテスト2は、理由投げる例外の、唯一の1ステップを実行して、test1のは、ループ内の例外をキャッチし、2500000回実行されるしてください。
あなたはループの外で例外をキャッチすると、ループが再び開始されません。ループが作られたどのように多くの手順を確認するために、「私はint型」プリントアウトします。
方法委譲推奨されないメソッドの呼び出しので3つ目は、最も遅い。