Domanda

Ho appena scritto un intero Testo in evidenza come ho raggiunto questo punto, ma pensato è più facile inserire il codice e lasciare le cose come stanno:)

Per quanto posso dire, le prestazioni di test3 () dovrebbe essere lo stesso di test1 () - l'unica differenza è dove e 'colto l'eccezione (all'interno del metodo chiamante per test1 (), all'interno del metodo chiamato per test3 ())

Perché test3 () prendere tempo regolarmente da qualche parte tra test1 () e test2 () per completare?

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");
    }

}

L'esecuzione mi dà (JDK 1.6.0_13 su Windows XP) l'output:

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

Quindi, le risposte sono abbastanza vicino (stiamo parlando di qualcosa che è così banale è irrilevante), btu sono curiosa!

Più tardi ...

La gente ha suggerito che ci sia l'ottimizzazione JVM intralcio - Sono d'accordo. Così, ho rotto ogni test giù in essa la propria classe / metodo principale e ciascuna di esse. I risultati di questo:

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

osservazioni interessanti:

  • Il divario tra la cattura di ogni chiamata contro la cattura di tutto al di fuori del ciclo viene ridotta in essa la propria JVM (presumo ottimizzazione non è andare fino in fondo nel caso tutti i test-in-one a causa delle altre iterazioni che sono stati eseguito)
  • Il divario tra il try / catch dalla mia parte contro il try / catch all'interno URLEncoder.encode () è ora molto più piccolo (mezzo secondo più di 5000000 iterazioni), ma ancora decisamente lì ...
È stato utile?

Soluzione

L'esecuzione nell'ordine che avete inviato:

  

Performed 2500000 codifiche cercando di   prendere ciascuno in 34208ms
  Eseguita 2500000 codifiche che cercano di catturare tutti   in 31708ms
Eseguita 2500000 codifiche   con un metodo deprecato in 30738ms

Invertire l'ordine:

  

Eseguito 2500000 codifiche con un   metodo deprecato in 32598ms
Eseguita   2500000 codifiche che cercano di catturare tutti   in 31239ms
Eseguita 2500000 codifiche   cercando di catturare ciascuno in 31208ms

Per questo Io in realtà non credo che si sta vedendo quello che pensi che stai vedendo (certamente, test1 non è del 66% più lento di test3, che è quello che i tuoi punti di riferimento suggeriscono)

Altri suggerimenti

Sì avete la vostra spiegazione, penso:

3 è leggermente più lento di 1 a causa del metodo di chiamata più coinvolti.

2 è più veloce rispetto sia in quanto non 'istituito' e 'abbattere' eccezione che cattura legate bytecode in ogni ciclo. È possibile crack aprire il codice di byte per vedere la differenza con javap - vedi http://www.theserverside.com/tt/articles/article.tss?l=GuideJavaBytecode

Sia che si utilizzi 2 o 1 dipende da quale comportamento che si desidera, dal momento che non sono equivalenti. Vorrei scegliere 1 su 3 dal momento che si sono poi non utilizza un metodo deprecato, che è più importante di piccoli aumenti di velocità -. Ma come accade 1 è più veloce in ogni caso

Vi prego di correggere, ma il test2 per-ciclo viene eseguito solo 1 punto, a causa dell'eccezione lancio e test1 catturato l'eccezione all'interno del ciclo e viene eseguito 2500000 volte.

Quando si cattura l'eccezione di fuori del ciclo, il ciclo non ricomincerà. Stampare "int i" per essere sicuri quanti passi il ciclo fatto.

Il terzo è il più lento, perché i delegati metodo della chiamata al metodo deprecato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top