Scrivere in assembly non ti darebbe un magico aumento di velocità poiché a causa della quantità di dettagli (allocazione dei registri ecc.) Probabilmente scriverai l'algoritmo più banale di sempre.
Inoltre, con i moderni processori (letti dopo gli anni 70-80), l'assemblaggio dei processori non fornirà un numero sufficiente di dettagli per sapere cosa sta succedendo (vale a dire - sulla maggior parte dei processori). Le moderne PU (CPU e GPU) sono piuttosto complesse per quanto riguarda le istruzioni di pianificazione. Conoscere le basi dell'assemblaggio (o pseudoassemblaggio) consentirà di comprendere libri / corsi di architettura informatica che fornirebbero ulteriori conoscenze (cache, esecuzione fuori ordine, MMU ecc.). Di solito non è necessario conoscere ISA complessi per capirli (MIPS 5 è piuttosto popolare IIRC).
Perché capire il processore? Potrebbe darti molta più comprensione di ciò che sta succedendo. Diciamo che scrivi la moltiplicazione della matrice in modo ingenuo:
for i from 0 to N
for j from 0 to N
for k from 0 to N
A[i][j] += B[i][k] + C[k][j]
Potrebbe essere 'abbastanza buono' per il tuo scopo (se è una matrice 4x4, potrebbe comunque essere compilato in istruzioni vettoriali). Tuttavia, ci sono programmi abbastanza importanti quando si compongono array di grandi dimensioni: come ottimizzarli? Se scrivi il codice nell'assemblaggio potresti avere un po 'di miglioramento (a meno che tu non faccia come la maggior parte delle persone - anche in modo ingenuo, sottoutilizzando i registri, caricando / archiviando costantemente la memoria e in effetti avendo un programma più lento rispetto al linguaggio HL) .
Tuttavia è possibile invertire le linee e ottenere magicamente prestazioni (perché? Lascio come "compiti a casa") - IIRC a seconda di vari fattori per matrici di grandi dimensioni può essere anche 10x.
for i from 0 to N
for k from 0 to N
for j from 0 to N
A[i][j] += B[i][k] + C[k][j]
Detto questo, ci sono lavorando sui compilatori che sono in grado di farlo ( grafite per gcc e Polly per qualsiasi cosa usi LLVM). Sono anche in grado di trasformarlo in (scusa, sto scrivendo il blocco dalla memoria):
for i from 0 to N
for K from 0 to N/n
for J from 0 to N/n
for kk from 0 to n
for jj from 0 to n
k = K*n + kk
j = J*n + jj
A[i][j] += B[i][k] + C[k][j]
Riassumendo: conoscere le nozioni di base di un assieme consente di scavare in vari "dettagli" dalla progettazione del processore che consentirebbe di scrivere programmi più veloci. Potrebbe essere utile conoscere le differenze tra architetture RISC / CISC o VLIW / processore vettoriale / SIMD / .... Tuttavia non inizierei con x86 poiché tendono ad essere piuttosto complicati (forse anche ARM) - sapere cos'è un registro ecc. È IMHO sufficiente per iniziare.