Man kann unnötige Taktzyklen schon auf der Hochsprachenebene einsparen. Dabei sollte man sich stets die Prozessorarchitektur vor Augen führen und versuchen, die Schwächen der jeweiligen Architektur zu vermeiden. So kann die Reduzierung der bedingten Befehle einige Zyklen einsparen. Da jedes Mal bei einer bedingten Anweisung ein Pipeline-Stall auftreten kann, sollte gerade in Schleifen auf solche Operationen nach Möglichkeit verzichtet werden.
Das Codebeispiel in Listing 4 stellt eine solche bedingte Zuweisung vor. Unoptimiert sind hier bedingte Sprungbefehle notwendig. Durch eine logische Verknüpfung kann jedoch ein bedingter Sprung verhindert werden:
a = ((-variable)&b) |
(~variable)&c;
Auch die Abhängigkeit der Variablen in einer Schleife kann kritisch sein. Im folgenden Beispiel wird die Variable x von der letzten Iteration wieder verwendet:
for (i = 0; i < n; i++)
x = a[i] — x
Des Weiteren bestimmt die Lage der Daten im Speicher die Zugriffzeiten und somit auch die Geschwindigkeit des Algorithmus. Eine Schwäche sind verschachtelte Strukturen (structs) und Tabellen, da sie den direkten Zugriff auf die Operanden verhindern. Bei vielen Prozessor-Familien sollte man die Zugriffstruktur so wählen, dass sequenziell zugegriffen werden kann. Dazu sollte man die Struktur eines C-Arrays betrachten (hier ein 3×3-Array):
A000, A001, A002, A010, A011, A012, A020, A021, A022, A100, A101, A102, A110, A111, A112, A120, A121, A122, A200, A201, A202, A210, A211, A212, A220, A221, A222
Somit würde der optimale Zugriff wie in Listing 5 dargestellt aussehen.
Nicht nur die Struktur der Daten ist entscheidend für die Rechenleistung, auch der Datentyp ist ein wichtiger Faktor. Aus diesem Grund sollte dessen Wahl gewissenhaft erfolgen. So kostet eine Berechnung mit 64-bit-Operanden auf einer 16-bit-Architektur zusätzliche Zyklen und sollte nur dann vorgenommen werden, wenn es unbedingt erforderlich ist. Auf Festkomma-Architekturen sollte man im Allgemeinen von Gleitkommaoperationen im leistungskritischen Bereich Abstand nehmen. Sollten sie dennoch erforderlich sein, gibt es zumeist eine Compiler-Option, die IEEE-Konformität der Gleitkomma-Zahlen auszuschalten, welche die Berechnung erheblich beschleunigt (bei der Blackfin-Prozessor-Architektur bis zu 75 %). Auch die Gültigkeit der Variablen hat einen Einfluss auf die Optimierung durch den Compiler. Globale Variablen können zumeist nicht optimiert werden – somit sollte man auf sie verzichten.
Divisionen sollen möglichst vermieden werden. Bei Divisionen durch Konstanten sollte die Division durch eine Multiplikation mit dem Kehrwert der Konstante ersetzt werden. Eine Anweisung wie in Listing 6 kann durch die Anweisung in Listing 7 ersetzt werden (vorausgesetzt, der Wertebereich wird nicht überschritten).
Eine weitere Optimierung ist das „inline“-Pragma von C. Dadurch wird die Funktion direkt in den Code eingefügt, ohne dass Werte in den Speicher gerettet werden müssen.