2013-01-31 11 views
6

Sto progettando un software matematico con algoritmi che funzionano per tipi di interi generici come input macchina o interi GMP. Per quanto riguarda le prestazioni, in genere si vuole lavorare con le macchine, ma se c'è un overflow, allora si potrebbe voler provare a passare a GMP; idealmente in fase di esecuzione. Finora l'intero programma è stato scritto come modello sul tipo intero. Man mano che la libreria cresce, il dolore aumenta:Come astrarre il tipo intero in un software matematico

  • Il tempo di compilazione e il consumo di memoria stanno sfuggendo di mano.
  • I messaggi di errore in fase di compilazione sono meno utili.
  • Il debug è più doloroso.
  • L'intero codice si trova nei file di intestazione.

Posso pensare alla seguente soluzione. Rifatta il codice in modo che dipenda da un tipo fisso che viene tipizzato tramite una macro di tempo di compilazione. Quindi crea diverse copie della libreria, una per ogni tipo di intero e collegale insieme nell'eseguibile. Lo svantaggio sembra essere che ho bisogno di un'interfaccia della libreria a se stessa.

La domanda breve sarebbe: quali sono i modelli di progettazione per le situazioni in cui quasi l'intero programma dipende da un tipo?

+3

Non ottimizzarlo prematuramente (Knuth) - la GMP (GNU Multiple Precision Arithmetic Library) è abbastanza brava a gestire il piccolo 'int's per le prestazioni e ad aumentarne le dimensioni quando necessario. Non cercare di reinventarlo! – danodonovan

risposta

4

Il GNU Multiple Precision Arithmetic Library è stato

accuratamente progettato per essere il più veloce possibile, sia per le piccole che per gli operandi enormi operandi.

In altre parole, se si utilizza la libreria GMP, questo risolverà queste difficoltà per te e ti farà risparmiare un sacco di sforzi!

+1

Bene, non si tratta di una classe di complessità diversa, ma sto misurando 3-4 volte più lunghe di corse sullo stesso problema quando si usano gli interi gmp invece degli interi. – Thomas

+0

@Thomas Questo codice fa la cosa giusta quando usi gli interi standard? Se il codice "standard" semplicemente trabocca tutto il tempo mentre il codice GMP deve espandere le rappresentazioni interne dei numeri per mantenere i risultati corretti, ciò spiegherebbe la differenza. – us2012

+0

Nessun overflow. In una situazione in cui gli interi macchina sono sufficienti, il gmp rallenta di un fattore 3-4. – Thomas

2

Nel mio software matematico, utilizzo GMP di default ma voglio fornire un fallback se non è disponibile. Inoltre non mi è piaciuto l'enorme file di intestazione gmpxx che rallenta la compilazione sulla mia macchina lenta.

Quindi ho essenzialmente scritto una classe wrapper su un numero indefinito (con pimpl utilizzando std::aligned_storage). Il back-end può essere scelto durante il tempo di compilazione.

Questo elimina i modelli e offre una flessibilità sufficiente per me.

+0

Se ho capito bene questa è fondamentalmente la soluzione che ho già menzionato nella domanda? Potresti approfondire un po 'la tua implementazione? Vorrei fare un po 'di typedef qualcosa di IntegerType' uno dei quali viene attivato in fase di compilazione e quindi utilizzare IntegerType in tutto. Perché ho bisogno di pimpl o align_storage? – Thomas

Problemi correlati