Prestazioni di operazioni a 8 bit su architettura a 64 bit

0

Di solito sono un programmatore Python / Database e sto pensando di usare C per un problema.

Ho una serie di sequenze di 8 caratteri con 4 possibili caratteri. Il mio problema riguarda la combinazione di insiemi di queste sequenze e filtri che soddisfano un criterio. Le combinazioni di 5 corrono in miliardi di righe e impiegano circa un'ora per essere eseguite.

Quindi posso rappresentare ciascuna sequenza come 2 byte.

Se sto lavorando su un architechture a 64 bit otterrò qualche vantaggio mantenendo queste strutture dati a 2 byte quando creo le combinazioni, o lo conserverò anch'io come 8 byte / doppio? (64 bit = 8 x 8)

Se sono su un'architettura a 64 bit, tutti i registri saranno 64 bit, quindi in termini di operazioni che non dovrebbero essere più veloci (correggimi se ho torto).

Otterrò qualcosa dai requisiti di archiviazione più piccoli - posso inserire più combinazioni in memoria, o prenderanno tutti comunque 64 bit?

E infine, sono lieto di ottenere qualcosa che codifica in C. Ho una prima versione, che memorizza la sequenza come una piccola int in un database MySQL. Quindi si unisce automaticamente al tabù un numero di volte per generare tutte le combinazioni possibili. Le prestazioni sono accettabili, a seconda del numero di combinazioni generate. Presumo che il database debba comportare un sovraccarico.

    
posta wobbily_col 18.10.2013 - 18:54
fonte

2 risposte

2

If I am working on a 64 bit architechture will I gain any advantage by keeping these data structures as 2 bytes when I generate the combinations, or will I be as well storing them as 8 bytes / double ? (64 bit = 8 x 8)

Spremere i tuoi dati in 2 byte invece di 8 ridurrà ovviamente la quantità di memoria necessaria per gli array di grandi dimensioni di queste sequenze a ~ 1/4. Questo fatto è in gran parte indipendente dalla tua architettura del processore, indipendentemente dal fatto che sia 64, 32, 16 o solo 8 bit.

Se ciò comporterà un miglioramento misurabile delle prestazioni, dipende dal fatto che la rappresentazione comprovata della quantità di dati che verranno elaborati "in un intero" si adatterà completamente alla memoria più veloce (ad esempio, la memoria principale), mentre la scompattata la rappresentazione non lo fa (ad esempio, è necessario uno spazio su disco rigido esterno per questo).

Onestamente, dal momento che non hai fornito dettagli sul modo in cui il tuo "filtro" è simile, non è chiaro se hai bisogno di decomprimere i dati prima di poterli elaborare ulteriormente, il che potrebbe richiedere ulteriore tempo di elaborazione. Oppure la differenza nel tuo caso potrebbe apparire così piccola che l'imballaggio è completamente inutile. Quindi, quello che devi fare qui è: prova e misura, misura, misura !

    
risposta data 19.10.2013 - 15:22
fonte
1

È probabile che tu ottimizzi per il caso sbagliato. Ricorda le due regole d'oro dell'ottimizzazione:

  1. Premature optimization is the root of all evil.
  2. No optimizing without profiling.

Poiché 4 8 = 65536 è significativamente inferiore ai " miliardi di combinazioni ", dubito che ti imbatterai in problemi di prestazioni indipendentemente dal linguaggio di programmazione che sei utilizzando. Lo hai prototipato in Python? Non è abbastanza veloce? Se vuoi ottimizzarlo, prova a trovare un algoritmo che non crei nemmeno combinazioni indesiderate.

Il vantaggio di rappresentare una singola combinazione come un numero intero (per ora, la dimensione è irrilevante), è che puoi scorrere tutte le combinazioni semplicemente incrementando quel numero intero. Questo sarà veloce indipendentemente dalla lingua. Nota che i numeri in virgola mobile non sono utili qui! In C, potresti usare un uint16_t o più grande in questo scenario. Hai bisogno di una condizione di terminazione separata indipendentemente dal tipo che stai utilizzando.

Quanti bit qualsiasi tipo effettivamente occupa in memoria è soggetto a alignment . Dovresti preoccuparti solo di questo dopo aver riletto le due regole di ottimizzazione sopra, perché il tuo compilatore ne saprà di più sull'allineamento di te.

    
risposta data 18.10.2013 - 19:31
fonte

Leggi altre domande sui tag