Quando è un ciclo "non banale"?

4

È corretto chiamare un ciclo che non conosci il limite al momento della compilazione "non-trivial" ?

Se sai che utilizzerai un valore da una classe che si troverà in un intervallo, ad es. tra 0-1000, è ancora non banale?

es. Dove ISomeInterface.MAX_LIMIT è sempre compreso tra 1-1000:

public bool someMethod(Type someType, int someId, int someVariable)
{
    bool returnFlag = false;
    int maxLimit = (Activator.CreateInstance(someType) as ISomeInterface).MAX_LIMIT;

    for (int i = 0; i < maxLimit; i++) //is this a non-trivial loop?
    {
        if (_someSerivce.SomeOtherMethod(someType, someId, someVariable, i))
        {
            returnFlag= true;
        }
    }
    return returnFlag;
}

Modifica Ero incerto se questo fosse un pezzo di terminologia significativa.

In origine l'ho letto in uno dei pezzi di Jon Skeet da yoda.arachsys: link (vedi sezione intitolata Rules of Thumb ).

Lo usi come terminologia tecnica?

    
posta StuperUser 12.08.2011 - 12:47
fonte

7 risposte

4

Quando ho usato il termine di solito è stato in relazione alle ottimizzazioni del compilatore ... in quel contesto un ciclo banale era uno che il compilatore poteva srotolare completamente senza creare condizioni avverse (cioè aumentare il numero di blocchi, rimuovendo la capacità di inline altro codice ecc.)

Quindi generalmente intendevamo loop con un piccolo numero di istruzioni o un numero limitato di iterazioni (il più tardi è il significato più comune).

Detto questo, è sicuramente un termine non standard senza una solida definizione tecnica.

    
risposta data 12.08.2011 - 14:33
fonte
2

Non è un termine standard. Personalmente, considererei un ciclo insignificante se la condizione di test (2a parte) è un semplice confronto di un valore che cambia solo a causa dell'espressione di conteggio (terza parte del ciclo for).

Qui, la condizione di test è i < maxLimit (confronto semplice su i) e l'espressione di conteggio è i++ (stessa variabile i). Quindi, sì, banale.

    
risposta data 12.08.2011 - 13:02
fonte
1

Non posso esserne sicuro, ma i loop banali o non banali non hanno nulla a che fare con l'intervallo, ma piuttosto l'incremento. Un ciclo for è "banale" se viene eseguito con incrementi di 1, cioè i ++ nel tuo caso. Lo stesso ciclo è "non banale" se non viene eseguito a incrementi di 1, come l'esecuzione ad ogni iterazione uniforme, ecc.

    
risposta data 12.08.2011 - 13:01
fonte
1

Un ciclo è banale se eseguirlo richiede una parte insignificante del tempo di esecuzione del programma.

    
risposta data 12.08.2011 - 13:08
fonte
1
for( int i = 0, k = 1, l=things.size(); i < k && l >= 0 ; --l )
{
   if( things[i] == things[k] )
   {
      things.doit();
      ++i;
   }
}

Questo è un ciclo non banale. È più difficile da capire rispetto ai modi più comuni per scriverlo.

Detto questo, qui è ovviamente offuscato. Non ho un esempio del mondo reale a portata di mano.

    
risposta data 12.08.2011 - 13:39
fonte
1

Prima di tutto, in senso più ampio, definirei in modo colloquiale non-trivial code di code whose implementation and execution has a significant impact on the nature of the project as a whole . Questo è ovviamente un po 'situazionale, rendendo il termine impreciso. Il contesto è un grande fattore in relazione al significato di non-trivial quando si parla di un pezzo specifico di codice, che si tratti di un ciclo o di qualsiasi altra struttura. Ci sono alcuni possibili scenari:

  • Prestazioni
  • design
  • Maintainability
  • Portabilità

In ognuno di questi casi, un blocco di codice può essere non banale e significa in ogni caso qualcosa di diverso.

Per il tuo esempio, sembra che tu stia parlando di prestazioni. Nel contesto delle prestazioni, credo che una buona metrica per non-trivial sarebbe la sua prestazione Big-O . Nel tuo esempio, il ciclo è O (n) , che in molti scenari è una performance perfettamente accettabile ed è il Big-O di una grande percentuale di for loops.

Nel contesto delle prestazioni, si potrebbe anche dire che il codice non è banale se il suo tempo di esecuzione è molto ampio rispetto al tempo di esecuzione totale dell'intero programma.

    
risposta data 12.08.2011 - 15:53
fonte
1

Non è un pezzo di gergo tecnico ben definito o un termine d'arte comune. Skeet lo sta semplicemente usando nel senso comune della lingua inglese: "non banale" significa "non ha senso".

In quell'articolo, "in un ciclo non banale" significa "in un ciclo che richiede un periodo di tempo significativo".

    
risposta data 12.08.2011 - 13:42
fonte

Leggi altre domande sui tag