Come confrontare le prestazioni del software nelle stesse condizioni (RAM, caching della CPU, ecc.)?

1

Sto scrivendo un software che divide grandi file in file più piccoli e ho codificato diverse soluzioni.

Sto misurando il tempo di esecuzione di ciascuna delle mie soluzioni. (con discussioni, routine di go, MPI ecc.) e vuoi confrontarle oggettivamente.

Se eseguo più di una volta la stessa soluzione, il tempo di esecuzione sarà inferiore e capisco che ciò avvenga perché alcuni dati vengono memorizzati nella cache nella gerarchia di memoria (ram, o registri di cpu, ecc.).

Voglio rendere le prove più obiettive e riproducibili rimuovendo queste influenze. Voglio eseguire ogni test con una lavagna pulita.

Se riavvia il PC e misuro nuovamente le prestazioni, la RAM è vuota dai dati precedenti e i risultati sono abbastanza buoni. Mi chiedo se c'è un modo per farlo senza dover ripristinare il PC?

Qual è il modo migliore per fare questo tipo di test? Voglio fare qualcosa come: Esegui a.exe e misura il tempo, pulisci tutto ram, cpu registra tutto ciò che è memorizzato nella cache di questi dati Ripetere N numero di volte di test per a Fai la stessa cosa per b, exe

Quindi posso calcolare la velocità media di a, la velocità media di b e infine confrontare i dati.

Per favore forniscimi alcune informazioni poiché sto facendo ricerche molto e non ho trovato alcuna risorsa utile. Opzionalmente, ho bisogno di modi programmabili per raggiungere questo obiettivo. Alcuni modi per integrare nella pipeline di riferimento gli strumenti aggiuntivi.

Quello che ho provato finora:

  1. Riavvia il PC solo per sottolineare che il caching era il problema
  2. Esegui il software all'interno di un contenitore di finestra mobile, ogni volta. Era buono ma molto lento

Grazie in anticipo!

    
posta Kristi Jorgji 30.08.2018 - 16:19
fonte

2 risposte

3

If I run more then once the same solution, the execution time will be less and I understand that this happens because some of the data gets cached in the memory hierarchy (ram, or cpu registers etc).

Quindi dovresti eseguire più volte (ad es. eseguire cinque volte esattamente la stessa cosa) la stessa "soluzione" e confrontarle tutte. La prossima domanda è quale tempistica è la più rilevante. Potresti scegliere il peggiore (probabilmente la prima volta), o potresti considerarne una media, oppure ignorare le peggiori e migliori esecuzioni e preoccuparti solo del resto, ecc ...

In generale, non puoi confrontare alcun software esattamente nelle stesse condizioni perché il computer (ei suoi sistemi operativi) non sono completamente deterministici, quindi non sarai in grado di riprodurre esattamente alcune condizioni di funzionamento. Quindi, è necessario fare diversi benchmark. Anche l'operazione di "avvio" o "avvio a freddo" non è una tipica condizione di esecuzione (ma un caso particolare), quindi di solito si vuole ignorarla.

Ricorda che il tuo hardware è non -deterministico: cache della CPU comportamento, pipelining della CPU , superscalar processori con esecuzione out-of-order , esterno interruzioni - timer, reti, USB, disco, ...- e forse Frequenza della CPU -limitata quando il chip è troppo caldo- sta cambiando senza controllo software. Quindi il scheduler del kernel si comporta in modo diverso da una corsa all'altra (a causa della pianificazione preventiva, .. .). Leggi anche Sistemi operativi: tre parti facili per ulteriori informazioni sui sistemi operativi. Alcuni livelli software (ad es. ASLR ) potrebbero aggiungere più non determinismo.

Nel tuo caso, credo che tu voglia considerare il tempo medio. In pratica, è molto probabile che alcuni dati siano già "qui" (ad esempio nella cache di pagina ) quando userebbe davvero il tuo programma.

Non penso che misurare uno stato "a freddo" sia realistico nel tuo caso. Quando dividi un file enorme, è probabile che sia stato generato (o scaricato, o ottenuto) pochi secondi o pochi minuti fa (perché dovresti aspettare diverse ore prima di dividerlo), quindi ti preoccupi di più di uno stato "caldo" e in pratica è probabile che sia (parzialmente) nella cache della pagina.

I dettagli sono ovviamente computer, sistema operativo e file system specifici. Non aspettarti che il tuo sistema sia deterministico e dia gli stessi tempi per diverse esecuzioni. Quindi i tuoi benchmark non saranno esattamente riproducibili.

Finalmente, il tuo problema (dividere file enormi di centinaia di gigabyte ciascuno) è probabilmente legato all'IO-disco, non alla CPU, quindi il modo effettivo di codifica non dovrebbe avere importanza, almeno se i buffer hanno dimensioni adeguate (almeno 128 kilobyte e più probabilmente pochi megabyte; vedere setvbuf (3) ...). Se i file non sono enormi e potrebbero integrarsi completamente nella cache della pagina (ad esempio se la maggior parte dei file ha qualche gigabyte) le cose potrebbero essere diverse.

BTW, su Linux, potresti essere interessato a chiamate di sistema come posix_fadvise (2) e / o readahead (2) . Se utilizzati correttamente, potrebbero migliorare le prestazioni generali. E sembra che tu stia reinventando il csplit (1) o split (1) . Perché non sono abbastanza per le tue esigenze? Inoltre, perché devi ottimizzare così tanto (ricorda che il tempo del tuo sviluppatore costa più del computer su cui è in esecuzione il tuo programma).

Sei interessato a dividere un migliaio di file al giorno di qualche gigabyte ciascuno o a dividere una dozzina di file al giorno ciascuno di almeno centinaia di gigabyte? Questi sono due problemi diversi! (Suppongo tu abbia un desktop normale). E da dove provengono questi file? Come stanno atterrando sul tuo disco? Quali tecnologie disco e file system (SSD, dischi rigidi rotanti, filesystem remoti)?

PS. Sono sorpreso dalla tua domanda. Dividere un file testuale (ad esempio migliaia di righe) non dovrebbe essere un problema e può essere codificato in modo soddisfacente in modo soddisfacente (a condizione che i buffer siano abbastanza grandi). Non riesco a immaginare una situazione in cui una prestazione così articolata sia importante (al punto da giustificare diversi giorni di lavoro). Devi spiegare il tuo contesto e motivarlo molto di più. Ovviamente la dimensione dei byte è importante!

    
risposta data 31.08.2018 - 10:55
fonte
-1

La mia comprensione / ipotesi è che si desidera confrontare i 3 metodi di codifica.

Per poterli confrontare, devi essere in grado di controllare lo stato della macchina in modo che sia coerente tra le esecuzioni o le iterazioni.

Per applicare un metodo scientifico a questo, è necessario eseguire l'esperimento più volte e creare una griglia di dati per analizzare i dati statisticamente.

La parte cruciale di questo è eseguire ogni test e apportare solo una modifica ogni volta.

Ecco un esempio di script di test.

  1. Registra lo stato del PC (RAM, CPU temp, tipo di disco, cache ecc.)
  2. Riavvia PC
  3. Esegui il programma A
  4. Registra il tempo richiesto per l'esecuzione, la dimensione del file ecc.
  5. Modifica il parametro 1 e ripeti

Il cambio di 1 parametro potrebbe essere passare al programma B per confrontare i tipi. Quindi passare al programma C in modo da poter ora tracciare un grafico di A B C rispetto al tempo. L'unica cosa che è cambiata è il tipo di programma.

Quindi puoi andare a modificare un altro parametro ed eseguire nuovamente tutti i test.

È quindi possibile iniziare a progettare i test per supportare scenari specifici, ad es. Il programma A è più veloce per una dimensione del file superiore a 10 GB. Il programma B ha una strategia per la memorizzazione di gran parte del file originale nella RAM, quindi è il più veloce per le dimensioni del file inferiore alla quantità di RAM libera.

Se vuoi saperne di più cerca "Metodo scientifico" - c'è una pagina Wiki su di esso.

In termini di strumenti pratici, ci sono strumenti di automazione, ma penso che un semplice file batch (windows.bat) ti consentirà di eseguire la tua app, di inviare i risultati al file e di riavviarli.

    
risposta data 24.09.2018 - 13:04
fonte

Leggi altre domande sui tag