Ho bisogno di eseguire un controllo piuttosto complesso su un vettore e devo ripeterlo migliaia e milioni di volte. Per renderlo più efficiente, traduco la formula data in codice sorgente C++ e la compilo in binario fortemente ottimizzato, che chiamo nel mio codice. La formula è sempre puramente booleana: solo & &, || e ! Usato. codice sorgente tipico è simile al seguente:Come migliorare il tempo di compilazione per una gigantesca espressione booleana?
#include <assert.h>
#include <vector>
using DataType = std::vector<bool>;
static const char T = 1;
static const char F = 0;
const std::size_t maxidx = 300;
extern "C" bool check (const DataType& l);
bool check (const DataType& l) {
assert (l.size() == maxidx);
return (l[0] && l[1] && l[2]) || (l[3] && l[4] && l[5]); //etc, very large line with && and || everywhere
}
compilo come segue:
g++ -std=c++11 -Ofast -march=native -fpic -c check.cpp
prestazioni del binario risultante è di fondamentale importanza.
Ha funzionato perfettamente con il recente test case con il gran numero di variabili (300, come potete vedere sopra). Con questo test case, g ++ consuma più di 100 GB di memoria e si blocca per sempre.
La mia domanda è piuttosto semplice: come posso semplificare quel codice per il compilatore? Dovrei usare alcune variabili aggiuntive, eliminare il vettore o qualcos'altro?
MODIFICA 1: Ok, ecco lo screenshot dal programma di utilità superiore.
cc1plus è occupato con il mio codice. La funzione controllo dipende da 584 variabili (mi dispiace per un numero impreciso nell'esempio sopra) e contiene 450'000 espressioni.
Sono d'accordo con il commento di @ akakatak qui sotto. Sembra che g ++ esegua qualcosa O (N^2).
Uh ... cosa? 100GB? Non con questo codice. Sembra che tu abbia un bug altrove. – Lundin
Si potrebbe provare a suddividerlo in più istruzioni ('bool x1 = l [0] && l [1] & & l[2]; bool x2 = l [3] && l [4] & & l[5]; bool x3 = x1 || x2;') – Thilo
@Lundin È un esempio semplificato, ovviamente. Non posso mostrare quello vero, ma l'idea rimane la stessa. Immagina che la riga 'return' contenga parecchie migliaia di espressioni booleane. – CaptainTrunky