Poteri di prelievo di due per dimensioni / limiti

4

Un'abitudine che ho osservato tra i programmatori, e un'abitudine che a volte inconsciamente mi esibisco, è quella di scegliere poteri di due (o poteri di due meno uno) quando definisco uno schema di database, un buffer di dati, ecc.

Hai fatto la stessa osservazione? Se non sono sfacciatamente soggettivo, le domande di follow-up sono:

Ci sono ancora validi motivi per usare poteri di due [meno uno] nelle moderne tecnologie?

Supponendo che queste abitudini siano per lo più vestigia di vecchi limiti tecnologici, mi chiedo solo quali sono i diversi tipi di limiti presenti in passato.

Alcuni potenziali motivi per cui posso pensare sono le ottimizzazioni della struttura dati e i bit di indirizzamento. Mi chiedo che altro era / è là fuori ...

    
posta Ates Goral 20.04.2011 - 10:24
fonte

3 risposte

6

Are there still valid reasons to use powers of two [minus one] in modern technologies?

La potenza di due meno uno è per l'indicizzazione basata su 0.

32768 elementi è compreso tra 0 e 32767. La dimensione è 32768. L'ultimo elemento è 32767. Questa dimensione rispetto all'ultimo elemento confonde continuamente le persone.

La memoria fisica è ancora gestita in "paragrafi" a 16 byte, che sono due potenze.

I dischi hanno ancora blocchi che sono poteri magici di due. Il numero effettivo varia a seconda del filesystem e del sistema operativo, ma è un potere magico di due.

Potresti ottenere una località di riferimento leggermente migliore e forse risparmiare un po 'di tempo di accesso alla memoria. I compilatori fanno già questo ottimizzazione dell'allineamento della memoria per te. Con la cache multilivello nella maggior parte dei processori moderni, tuttavia, sarà difficile misurare l'impatto.

A meno che non si stiano scrivendo i driver di I / O. In tal caso, il dispositivo ei buffer del sistema operativo coinvolgeranno tutti molti poteri magici di 2 che devono utilizzare. Quando scrivi i driver I / O, i poteri magici di 2 sono essenziali.

Per la maggior parte degli scopi, tuttavia, preferisco usare poteri magici di 12. Perché no? Riprova i limiti? 12 tentativi prima di sollevare un'eccezione. Dati di esempio? 12 righe di esempio da un file di grandi dimensioni a scopo di test.

    
risposta data 20.04.2011 - 12:02
fonte
0

Qualcuno potrebbe essere solo che i programmatori sono abituati a lavorare sulla base 2.

Ma c'erano / ci sono anche ragioni tecnologiche. Ad esempio, per rendere i dati adatti alle cache , o registri , o essere stati in grado di leggere i dati in un'operazione di lettura .

Oggi quando programmiamo con linguaggi di alto livello e quindi con un grande livello di astrazione dalla macchina, la maggior parte di queste ottimizzazioni sono lasciate al compilatore, perché non è facile avere una conoscenza approfondita del compilatore internals per sapere come ottimizzerà il tuo codice, ma avere ancora questo tipo di dimensioni può rendere le cose più semplici.

    
risposta data 20.04.2011 - 11:10
fonte
-1

In realtà una volta che un insegnante mi ha spiegato che la scelta dei poteri di 2 meno 1, sono davvero scelte di numeri primi. Mi ha detto che questo aveva qualcosa a che fare con la sicurezza dei dati, qualcosa sul fatto di non essere in grado di dividere i dati in parti di dimensioni uguali. Non ho mai capito il concetto.

    
risposta data 20.04.2011 - 11:40
fonte

Leggi altre domande sui tag