Domanda

Dato che io non so in fase di distribuzione che tipo di sistema il mio codice sarà in esecuzione su, come faccio a scrivere un punto di riferimento delle prestazioni che utilizza la potenzialità di un sistema come il suo metro di misura.

Quello che voglio dire è che se un sistema è in grado di eseguire il pezzo di codice 1000 volte al secondo, mi piacerebbe il test per assicurare che sia rientra più vicino al 1000 come possibile. Se si può fare solo 500, allora questo è il tasso che vorrei confrontarla.

Se aiuta a rendere la risposta più specifica, sto usando JUnit4.

Grazie.

È stato utile?

Soluzione

Un test significa che hai un pass / fail soglia. Per un test delle prestazioni, questo significa troppo lento e non si riesce, abbastanza veloce e si passa. Se non si riesce, si avvia facendo rilavorazione.

Se non si può fallire, allora siete di benchmarking, in realtà non prova.

Quando si parla di "sistema è in grado di eseguire" è necessario definire "capace". È possibile utilizzare qualsiasi di un gran numero di benchmark delle prestazioni hardware. Whetstone, Dhrystone, ecc, sono popolari. O, forse si dispone di un'applicazione ad alta intensità di dati, allora si potrebbe desiderare di guardare il benchmark TPC. O, forse si dispone di un'applicazione ad alta intensità di rete e si desidera utilizzare netperf. O un'applicazione ad alta intensità di GUI e si desidera utilizzare un qualche tipo di benchmark grafico.

Uno di questi vi darà un qualche tipo di misura "capacità". Scegli uno o più. Sono tutti buoni. Altrettanto discutibile. Altrettanto orientato alla vostro concorrente e lontano da voi.

Una volta eseguito il punto di riferimento, è possibile eseguire il software e vedere cosa realmente fa il sistema.

Si potrebbe - se raccogliere abbastanza dati - stabilire una correlazione tra alcuni numeri di riferimento ei vostri numeri di spettacolo. Vedrete tutti i tipi di variazioni in base al carico di lavoro, la configurazione hardware, versione del sistema operativo, macchina virtuale, DB server, ecc

Con dati sufficienti dal scatole a sufficienza con abbastanza diverse configurazioni, alla fine sarete in grado di sviluppare un modello di spettacolo che dice "dato a questo hardware, il software, i parametri di ottimizzazione e la configurazione, mi aspetto che il mio software per fare transazioni [X] al secondo ". Questa è una solida definizione di "capace".

Una volta che avete quel modello, si può quindi confrontare il software contro il numero di funzionalità. Fino a quando si dispone di un modello molto completo, non si ha realmente sapere quali sistemi sono anche in grado di eseguire il pezzo di codice 1000 volte al secondo.

Altri suggerimenti

Non vorrei usare unità di test per le prove di performance per un paio di motivi.

Innanzitutto, test di unità non devono avere dipendenze al sistema / codice circostante. I test delle prestazioni dipendono fortemente dall'hardware / OS, per cui è difficile ottenere misure uniformi che sarà utilizzabile su entrambe le workstation degli sviluppatori, la costruzione del server ecc.

In secondo luogo, gli unit test dovrebbero eseguire veramente veloce. Quando si esegue test di performance, di solito si desidera avere abbastanza grandi insiemi di dati e ripetere il numero di corse un paio di volte in numero medio degli ordini / sbarazzarsi di testa e così via. Questi tutti i lavori contro l'idea di prove veloci.

Sono d'accordo con Brian quando dice che test di unità non è il modo appropriato per fare prestazioni test . Tuttavia ho messo insieme un breve esempio che potrebbe essere utilizzato come un test di integrazione per l'esecuzione su diverse configurazioni di sistema / ambienti.
Si noti che è solo per dare un'idea di quello che potrebbe essere fatto a questo proposito , e non fornisce i risultati che sono abbastanza precisi per eseguire il backup alcuna dichiarazione ufficiale circa le prestazioni di un sistema.

import static org.junit.Assert.*;
import org.junit.Test;

package com.stackoverflow.samples.tests {

    @Test
    public void doStuffRuns500TimesPerSecond() {
        long maximumRunningTime = 1000;
        long currentRunningTime = 0;
        int iterations = 0;

        do {
            long startTime = System.getTimeMillis();

            // do stuff

            currentRunningTime += System.getTimeMillis() - startTime;
            iterations++;
        }
        while (currentRunningTime <= maximumRunningTime);

        assertEquals(500, iterations);
    }
}

Lo faccio alcune misure di tempo sui test per il codice che è destinato a un sistema in tempo reale in cui una risposta corretta che ha impiegato troppo tempo per il calcolo è un fallimento.

Tutto ciò che faccio è la trama del tempo di CPU delta che il test ha assunto la recente build. Nota, non è tempo di CPU in tempo reale. Il valore reale non importa troppo - ciò che conta è quanto è cambiato.

Se commetto una modifica a un algoritmo che ha cambiato in modo significativo il tempo di funzionamento per il test posso facilmente zoom per il changeset specifico che ha causato. Quello che mi interessa davvero sono questi punti d'interesse - non necessariamente i valori assoluti. Ci sono spesso molti compromessi in un sistema in tempo reale e questi non possono sempre essere rappresentati al framework di test come un semplice confronto.

Guardando i tempi assoluti e normalizzare in un primo momento sembra ragionevole, ma in realtà la conversione tra il sistema e il sistema di destinazione sarà non lineare - per la pressione della cache esempio, l'utilizzo di swap, la velocità del disco sul sistema di destinazione, ecc può causare il il tempo per il test di esplodere in una diversa soglia di sistema.

Se è assolutamente necessario un test che è preciso a questo proposito, duplicare il sistema di destinazione e usarlo come uno schiavo di prova, ma in un ambiente simile come ci si aspetta di essere in.

Nel mio caso può essere in realtà il download di firmware in un DSP, a distanza powercycling che, leggendo la risposta da una porta seriale o di vedere alcuna risposta, perché si è schiantato!

- jeffk ++

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