Qual è l'opposto di una "lettura di priming"?

7

Questa è una semplice domanda terminologica relativa a un modello di progettazione del ciclo primitivo.

Alcuni costrutti di loop richiedono un priming read prima di entrare nel loop ... Mentre altri costrutti di loop richiedono una scrittura finale (o simili) dopo aver chiuso il ciclo ... Mi sembra che una "scrittura in coda" sia analoga al contrario di un innesco lettura.

Quindi qual è il termine corretto per tale pezzo di codice?

EDIT:

Ok guys, this is getting annoying. If you've never even heard the term "priming read" (or the like) in the first place, then don't suggest other random terminology that already has a well-established definition (e.g. "loop unrolling").

My question is whether there is a canonical (even if esoteric) term for this loop design pattern. Or if not, if there is a semi-widely-used but specific term for it. Things like "loop transformation" or "pre-loop" and "post-loop" are not specific enough to accurately differentiate this particular loop design pattern from more general loop patterns, resource acquisition / clean-up code, etc.

Esempio

Ecco lo snippet di codice C ++ (semplificato) che ha motivato la mia domanda:

auto structure = structures.begin();  // structures is of type vector<structure>

// "Priming read" for the loop
size_t prevID = structure->ID;
int aggregateDelta = structure->delta;

// The loop
while (++structure != structures.end()) {
    if (structure->ID == prevID) {
        aggregateDelta += structure->delta;
    }
    else {
        reducedStructures.push_back({prevID, aggregateDelta});
        prevID = structure->ID;
        aggregateDelta = structure->delta;
    }
}

// Opposite of a "priming read" for the loop
reducedStructures.push_back({prevID, aggregateDelta});

Chiarimento

Sulla base dei commenti, sembra esserci una certa confusione su cosa sia esattamente una "lettura di priming" e in che modo è diversa da altri concetti.

"Priming Read"

Dato un ciclo non strutturato, possiamo convertirlo in un ciclo strutturato spostando le prime dichiarazioni n del corpo del ciclo alla fine del corpo del ciclo e duplicando tali istruzioni all'esterno del loop prima dell'espressione di loop test. Le istruzioni duplicate che ora si trovano prima dell'ingresso del ciclo sono quelle che vengono chiamate "priming read".

Unstructured Loop:

enter image description here

Structured Loop with "Priming Read":

enter image description here

Si noti che dato un ciclo non strutturato che ha istruzioni tra l'ingresso del ciclo e l'espressione del test del ciclo, se vogliamo farlo in un ciclo strutturato allora il "priming read" è necessario per la correttezza . Questo è ciò che lo rende diverso da una trasformazione di loop generalizzata (che sembra essere ciò che alcuni commentatori chiamano "loop unwroll").

Structured but Incorrect Loop without "Priming Read":

enter image description here

"Loop Unrolling"

Il movimento e la duplicazione del codice coinvolti nella conversione di un loop non strutturato in un loop strutturato con un "priming read" non costituiscono loop unwrolling , che si riferisce specificamente a una tecnica di ottimizzazione del compilatore che duplica tutto il codice nel corpo del loop al fine di migliorare il runtime riducendo l'overhead del controllo del loop. "Loop Unrolling" non ha nulla a che fare con la programmazione strutturata / non strutturata, e non è richiesta per la correttezza del loop.

Fully "Rolled" Loop Body:

enter image description here

"Unrolled" Loop Body by a factor of 4:

enter image description here

    
posta Travis 21.01.2017 - 23:03
fonte

1 risposta

1

So what is the proper term for such a piece of code?

Non conosco alcun termine specifico per ciò di cui stai parlando.

Tuttavia, credo che ciò che stai descrivendo sia ampiamente sotto il concetto di svolgimento del ciclo , anche se forse devi socchiudiscilo un po 'per vederlo.

Mentre il termine loop srotolamento evoca di solito una nozione di ottimizzazione introdotta dal compilatore (nell'eseguibile binario) ripetendo sequenze di codice, a volte i programmatori manualmente srotolano i loop nel loro codice sorgente in un modo o nell'altro. Questo srotolamento è quindi caratterizzato dalla ripetizione del codice sorgente (cioè l'opposto di DRY).

Come parte di questa tecnica, alcune delle sequenze di codice ripetute possono apparire prima o dopo il ciclo effettivo srotolato.

Nelle lingue moderne senza goto s, a volte, è più facile scrivere un ciclo parzialmente srotolato che scrivere il ciclo più compatto (con goto s). Sebbene non mostri in modo specifico il tuo esempio (codice finale eventualmente ripetuto di ciò che è nel ciclo), l'articolo di wikipedia illustra come i loop srotolati tendono ad usare più goto s.

Vedi anche dispositivo di Duff ( non usarlo, basta guardarlo! ). Impiega un numero di istruzioni ripetute che vengono essenzialmente eseguite al di fuori del controllo del ciclo e prima di entrare nel controllo del ciclo per ottenere il conteggio delle iterazioni srotolate sul modulo corretto. Una tecnica simile, ancora più semplice, può essere impiegata posizionando il codice ripetuto in loop dopo il ciclo (anziché prima del ciclo e all'esterno del ciclo anziché all'interno dell'area del ciclo) per finire l'ultima porzione di sinistra.

A volte un loop è duplicato per eliminare condizionali all'interno del ciclo.

Tuttavia, se un loop guarda nella sorgente qualcosa come

for ( ... ) {
    if ( condition ) {
        do-some-work;
        break;
    }
}

Potremmo vedere il compilatore spostare il do-some-work; all'esterno del ciclo per mantenere il ciclo stesso più stretto; questo sarebbe il riordino dei blocchi di base piuttosto che lo srotolamento del ciclo.

In una certa misura, queste discussioni sollevano la questione di cosa c'è veramente nel ciclo rispetto a ciò che non lo è. C'è la prospettiva dinamica di ciò che è nel ciclo: ciò che viene effettivamente eseguito o almeno potenzialmente eseguito su ciascuna iterazione del ciclo rispetto a ciò che è fisicamente all'interno del {} del corpo del ciclo da una prospettiva del codice sorgente (o persino codice macchina, che può differire dal codice sorgente a causa delle scelte del compilatore). Quindi c'è persino una visione morale o di alto livello di ciò che è nel ciclo che potrebbe includere codice srotolato che è prima o dopo che il loop effettivo fa parte di quel ciclo (questo potrebbe essere particolarmente vero per quanto riguarda l'output del compilatore dove queste cose sono stati eseguiti).

In generale, possiamo rimodellare il codice sorgente o il codice macchina per includere o escludere il codice dal loop vero o per ripetere o condividere righe di codice (tuttavia, non sempre vogliamo ottenere il risultato nel codice sorgente , come a volte significa usare goto s o condizionali booleani, entrambi che danneggiano la manutenibilità).

    
risposta data 22.01.2017 - 19:13
fonte

Leggi altre domande sui tag