2015-05-13 11 views
6

Questa è solo una serie di domande riguardanti l'esecuzione di molti calcoli. O non sono riuscito a trovare le risposte online o ho ancora bisogno di chiarimenti.Tre domande sull'esecuzione di molti calcoli

  1. E 'più veloce per passare (float, float, float) come parametri del metodo vs (float[]) in cui la matrice ha tre termini?

  2. È più veloce per un metodo restituire un valore float[] rispetto a uno float[] passato al metodo come argomento?

  3. È più veloce sostituire le chiamate di metodo con i calcoli effettivi, vale a dire anziché A=sum(B,C) più lento di A=B+C? assumendo sum(x,y){return x+y}

EDIT:

Grazie per tutte le risposte, ragazzi! Prima di chiudere questo thread ho un'altra domanda veloce se qualcuno lo sa:

  1. Se sto usando una classe per calcolare ripetutamente le stesse statistiche più e più volte (e poi lanciarle di distanza), sarebbe meglio creare variabili di istanza che fungano da contenitori per evitare la ripetizione e la de-allocazione continue?
+0

Queste micro ottimizzazioni non faranno alcuna differenza su QUALSIASI scala. – Kon

+0

@Kon ma sta parlando di un telefono cellulare e di molti calcoli. Non mi preoccuperei di questo su un PC JVM, ma non sono sicuro di adroid. – ZhongYu

+0

@KevinXu buona domanda. Sono anche interessato a sapere queste cose. Vediamo cosa dicono gli esperti qui sopra. –

risposta

6

E 'più veloce per passare (float, float, float) come parametri del metodo vs (float[]) in cui la matrice ha tre termini?

Dipende.Se hai già a disposizione la gamma di float, non dovrebbe fare alcuna differenza. Se si sta costruendo la matrice ogni volta, ciò richiederebbe un po 'di tempo per le assegnazioni alla matrice e forse un po' di tempo per la costruzione della matrice.

Ha importanza? Se lo fai in un circuito chiuso che viene eseguito qualche milione di volte in successione, e che molte volte durante la vita della tua applicazione, può certamente farlo.

E 'più veloce di un metodo per restituire un float [] vs impostando il contenuto di un galleggiante [] che viene passato al metodo come argomento?

Se è necessario costruire la matrice del galleggiante ogni volta per il valore di ritorno, quello non è certo intenzione di essere più veloce di impostazione dei valori in un array preesistente. Semplicemente perché entrambe le opzioni implicano l'impostazione di valori, e uno di questi ha il compito extra di creare un nuovo array. Ma la creazione di un nuovo array può essere davvero, molto veloce.

Tuttavia, se lo fai molti milioni di volte nella tua app in rapida successione, confrontalo, potrebbe farti risparmiare tempo.

E 'più veloce di sostituire le chiamate di metodo con i calcoli effettivi ovvero invece è A=sum(B,C) qualsiasi più lento di A=B+C? supponendo sum(x,y){return x+y}

Quasi impossibile dire. L'ottimizzatore di codice HotSpot integrato è abbastanza bravo a scoprire queste cose e ad ottimizzarle per il tuo.

Se benchmark questo, provare a fare il metodo di sumprivate, che renderà più facile per HotSpot decidere che può essere inline (anche se sarà anche scoprire questo da solo, se non si dispone di alcun implementazioni overridden di il metodo sum)


l'unica cosa certa di analisi comparativa è:

può aiutare la vostra applicazione in questo momento, con la versione corrente della macchina virtuale che si sta utilizzando (e la vostra codebase corrente). Se si decide di eseguire l'aggiornamento a una nuova versione della VM, è possibile che le caratteristiche delle prestazioni cambino e potrebbe essere necessario ottimizzare nuovamente.

Quindi, fallo solo se è davvero importante per la tua applicazione, altrimenti potrebbe essere uno sforzo inutile.

Meglio concentrarsi prima sull'algoritmo e sulle sue complessità di spazio e tempo; qualsiasi guadagno ci sono guadagni per sempre.

+0

una domanda veloce (piuttosto un dubbio) se non consideriamo l'ottimizzatore, allora è che l'inline sarà più veloce perché le operazioni di stack (per la funzione call e return) richiederanno del tempo (di nuovo considerando un ciclo stretto di milioni). Perché l'autore non ha menzionato nulla sull'ottimizzatore! – therealprashant

2

1) E 'veloce passare (float, float, float) come parametri di metodo vs (float []) se la matrice ha tre termini?

1.) Depends. Se i float separati non sono contigui nella memoria, allora un float [] potrebbe aiutare.

2) E 'più veloce di un metodo per restituire un float [] vs impostare i contenuto di un float [] che viene passato al metodo come argomento?

2.) Dipende se il float [] esiste già in entrambi i casi. Se stai creando un nuovo float [] e passandolo, o creando un nuovo float [] e restituendolo, il costo è lo stesso. Ma se in entrambi i casi è possibile utilizzare un float esistente [] in qualche modo, ciò sarà più veloce e creerà meno allocazioni.

3) E 'veloce per sostituire il metodo chiamate con i calcoli reali cioè invece è A = somma (B, C) più lentamente rispetto A = B + C? assumendo sum (x, y) {return x + y}

3.) Non sono sicuro, io sono più di un programmatore C#. So che su CLR di base (Common Language Runtime) come utilizzato da Xbox 360 quando si esegue C#, i calcoli manuali erano molto più economici rispetto all'utilizzo di metodi sovraccaricati. Non sono sicuro che Java abbia problemi simili su qualsiasi piattaforma.