Benché la questione di cui C++, ho implementato matrice 3x3 moltiplicazione C = A * B in C# (.NET 4.5) e ha eseguito alcuni test di temporizzazione di base sulla mia macchina Windows 7 a 64 bit con ottimizzazioni. 10.000.000 moltiplicazioni sono voluti circa
- 0,556 secondi con un'implementazione ingenuo e
- 0.874 secondi con il codice Laderman dall'altro risposta.
È interessante notare che il codice laderman era più lento del modo ingenuo. Non ho investigato con un profiler, ma immagino che le allocazioni extra siano più costose di alcune moltiplicazioni extra.
Sembra che i compilatori attuali siano abbastanza intelligenti da fare quelle ottimizzazioni per noi, il che è positivo. Ecco il codice ingenua che ho usato, per il suo interesse:
public static Matrix3D operator *(Matrix3D a, Matrix3D b)
{
double c11 = a.M11 * b.M11 + a.M12 * b.M21 + a.M13 * b.M31;
double c12 = a.M11 * b.M12 + a.M12 * b.M22 + a.M13 * b.M32;
double c13 = a.M11 * b.M13 + a.M12 * b.M23 + a.M13 * b.M33;
double c21 = a.M21 * b.M11 + a.M22 * b.M21 + a.M23 * b.M31;
double c22 = a.M21 * b.M12 + a.M22 * b.M22 + a.M23 * b.M32;
double c23 = a.M21 * b.M13 + a.M22 * b.M23 + a.M23 * b.M33;
double c31 = a.M31 * b.M11 + a.M32 * b.M21 + a.M33 * b.M31;
double c32 = a.M31 * b.M12 + a.M32 * b.M22 + a.M33 * b.M32;
double c33 = a.M31 * b.M13 + a.M32 * b.M23 + a.M33 * b.M33;
return new Matrix3D(
c11, c12, c13,
c21, c22, c23,
c31, c32, c33);
}
dove Matrix3D è una struct immutabile (in sola lettura doppie campi).
La cosa più difficile è quello di trovare una valida riferimento , dove si misura il codice e non, quello che il compilatore ha fatto con il codice (debugger con tonnellate di materiale extra, o ottimizzato senza il tuo codice vero e proprio dal momento che il risultato non è mai stato usato). Di solito cerco di "toccare" il risultato, in modo che il compilatore non possa rimuovere il codice sotto test (ad esempio, controllare gli elementi della matrice per l'uguaglianza con 89038.8989384 e lanciare, se uguale). Tuttavia, alla fine non sono nemmeno sicuro se il compilatore ha fatto fuori questo paragone :)
fonte
2015-04-16 07:15:00
"... potremmo aspettarci le prestazioni di un compilatore moderno per far fronte alle differenze degli algoritmi?" Perché non provarlo? Codifica i due, eseguili ogni 1000 volte e confronta i tempi di esecuzione. – AndyPerfect
La risposta generale a questa domanda è "no". Algoritmi intelligenti sono ancora necessari nel mondo. – phs
@ph: risposta alla domanda nel titolo o alla domanda appena sopra la nota? Sono di fronte. – MSalters