4.7 Viteză de execuție: Sfaturi de programare

În timp ce hardware calculatorului și limbajele de programare sunt importante pentru maximizarea vitezei de execuție, acestea nu sunt ceva pe care le schimbați zilnic. În comparație, cum programați poate fi modificat în orice moment și va afecta în mod drastic cât timp programul va cere executarea. Iată trei sugestii.

În primul rând, utilizați numere întregi în loc de variabile în virgulă mobilă ori de câte ori este posibil. Microprocesoarele convenționale, cum ar fi cele utilizate în calculatoarele personale, procesează numere întregi de 10 până la 20 de ori mai rapid decât numerele în virgulă mobilă. Pe sistemele fără coprocesor matematic, diferența poate fi de 200 la 1. O excepție de la aceasta este împărțirea întregilor, adesea realizată prin transformarea valorilor în virgulă mobilă. Aceasta face ca operațiunea să fie lentă în comparație cu alte calcule de întregi. Consultați Tabelul 4-6 pentru detalii.

În al doilea rând, evitați utilizarea funcțiilor cum ar fi sin x, cos x, etc. Aceste funcții transcendentale sunt calculate ca o serie de adunări, scăderi și multiplicări. De exemplu, seria de puteri Maclaurin oferă:

Ecuația 4.3 Dezvoltarea în serie de puteri Maclaurin pentru trei funcții transcedentale
Acesta este modul cum calculează un computer funcții de acest tip, și de ce ele se execută lent.

În timp ce aceste relații sunt infinite în lungime, termenii devin repede suficient de mici pentru a fi ignorați. De exemplu:

sin (1) = 1 - 0,166666 + 0,008333 - 0,000198 + 0,00002 - ...

Aceste funcții necesită aproximativ de zece ori mai mult pentru a calcula decât o singură adunare sau multiplicare (vezi Tabelul 4-6). Mai multe trucuri pot fi utilizate pentru a ocoli aceste calcule, cum ar fi: x3 = x · x · x ; sin (x) ≈ x, atunci când x este foarte mic; sin (-x) = -sin (x), unde cunoașteți deja una dintre valori și trebuie să-o găsiți pe cealaltă, etc. Cele mai multe limbaje oferă doar câteva funcții transcendentale și vă așteaptă să le obțineți pe celelalte prin intermediul relațiilor din Tabelul 4-7. Nu este surprinzător că aceste calcule derivate sunt chiar mai lente.

Tabelul 4-7 Calcularea funcțiilor utilizate rar din unele mai comune.

Toate unghiurile sunt în radiani, ATN (X) este arctangentă, LOG(X) este logaritm natural, SGN(X) este semnul lui X (-1 pentru X< 0, 1 pentru X > 0), EXP (X) este ex.

O altă opțiune este de a precalcula aceste funcții lente și de a stoca valorile într-un tabel de căutare (LUT). De exemplu, imaginați-vă un sistem de achiziție a datelor de 8 biți, utilizat pentru a monitoriza continuu tensiunea pe un rezistor. Dacă parametrul de interes este puterea care este disipată în rezistor, tensiunea măsurată poate fi folosită pentru a calcula: P = V2/R. Ca alternativă mai rapidă, puterea corespunzătoare fiecărei posibile măsurători de tensiune din cele 256 poate fi calculată în prealabil și stocată într-un LUT. Când sistemul funcționează, tensiunea măsurată, un număr digital între 0 și 255, devine un indice în LUT pentru a găsi puterea corespunzătoare. Tabelele de căutare pot fi de sute de ori mai rapide decât calculul direct.

În al treilea rând, aflați ce este rapid și ce este lent pentru sistemul dvs. particular. Acest lucru vine cu experiență și testare și vor exista întotdeauna surprize. Acordați o atenție deosebită comenzilor și I/O grafice. Există de obicei câteva modalități de a face față acestor cerințe, iar vitezele pot fi extrem de diferite. De exemplu, comanda BASIC: BLOAD, transferă un fișier de date direct într-o secțiune din memorie. Citirea aceluiași fișier în memorie byte-cu-byte (într-o buclă) poate fi de 100 de ori mai lentă. Ca un alt exemplu, comanda BASIC: LINE poate fi folosită pentru a desena o casetă colorată pe ecranul video. Desenând aceeași casetă pixel-cu-pixel poate dura 100 de ori mai mult. Chiar și punerea unei declarații de imprimare într-o buclă (pentru a ține evidența a ceea ce face) poate încetini operațiunea de mii de ori!