Alcune funzioni integrate si collegano dietro le quinte?

0

Io principalmente codice in C # & VB, ma penso che questa domanda sia piuttosto universale. Cerco di limitare i loop per aumentare le prestazioni. Ad esempio, le funzioni di stringa che dividono la stringa in una matrice o eseguono una ricerca o una sostituzione.

Penso che se dovessi scrivere alcune funzioni di stringa con questi tipi di funzionalità, avrei bisogno di includere un ciclo.

Qualche idea su come funziona il compilatore, ad esempio una funzione di sostituzione di stringhe? O qualche esempio di come sono scritti nel linguaggio di programmazione?

    
posta JMcD 07.03.2016 - 15:36
fonte

2 risposte

9

Molto probabilmente, le funzioni incorporate o primitive di C # la maggior parte includono un ciclo (al codice macchina livello) quando eseguito.

BTW, anche l'assegnazione degli oggetti coinvolge indirettamente un ciclo. A volte, un'assegnazione di oggetti può attivare il garbage collector , che è in loop.

Si noti che un programma senza loop qualsiasi è un automa a stati finiti, e sicuramente terminerà (in meno di un secondo, tipicamente - intuitivamente la CPU sta elaborando più di una istruzione per nano-secondo, e in pochi gigabyte puoi codificare circa un miliardo di istruzioni macchina, senza loop il processore potrebbe interpretare poi rapidamente!)

Naturalmente, le chiamate di funzione, in particolare le ricorsive chiamate di funzione, sono un modo di fare il ciclo. E le chiamate ricorsive di coda sono esattamente un costrutto ciclico (che non consuma alcun stack di chiamate spazio).

Leggi anche il SICP e circa lambda calcolo , completezza di Turing (in particolare la completezza accidentale di Turing è molto divertente), funzioni ricorsive primitive , macchina ad accesso casuale , ...

A proposito, imparerai molto studiando il codice sorgente del software gratuito , e Microsoft ha persino fatto il codice sorgente di C # open source . Con un sistema Linux sul tuo laptop avrai ancora più software gratuito ...

    
risposta data 07.03.2016 - 15:42
fonte
2

Credo che qualsiasi opzionatore decente per quasi tutti i linguaggi di programmazione mainstream (compilati) includa la tecnica ben nota di srotolare il ciclo . Pertanto, nella maggior parte dei casi non è necessario eseguire manualmente questo tipo di ottimizzazione a basso livello, il risultato di ciò che i compilatori producono sono spesso migliori di qualsiasi soluzione "codificata a mano".

Detto questo, se è possibile sostituire un algoritmo O (n) con un ciclo come

 for(int i=1; i<=n; ++i)
    sum+=i;

da una soluzione O (1) senza loop, come

 sum+= n*(n+1)/2

quindi non mi aspetto che un tipico ottimizzatore sia così intelligente da farlo automaticamente.

    
risposta data 07.03.2016 - 16:28
fonte

Leggi altre domande sui tag