Latenzen entstehen immer dann, wenn nach einem Befehl nicht sofort der nächste Befehl desselben Thread bearbeitet werden kann. Da die Geschwindigkeitsunterschiede zwischen Prozessoren und Speicher wachsen, treten besonders lange Latenzen bei Zugriffen auf den Speicher auf. Der Prozessor muß warten, bis der Speicher die Daten geliefert hat, bevor er den nächsten Befehl ausführen kann, der diese Daten benötigt.
Weitere Befehle, die Latenzen erzeugen können, sind lang laufende Operationen - wie Divisionen - und Sprünge. Wenn ein Sprung ausgeführt wird, müssen Befehle von der Zieladresse aus dem Speicher geholt und in die Pipeline gefüttert werden. Alles, was zwischen dem Sprung und dem ersten Befehl von der neuen Adresse in der Pipeline steht, ist ungültig und muß verworfen werden. Auf einem normalen Pozessor sind diese Latenzzeiten verloren, der Prozessor hat keine Möglichkeit, sie zu nutzen und muß warten. Das gilt nur, wenn Sprünge nicht spekulativ ausgeführt werden.
Moderne superscalare Prozessoren verbringen so einen großen Teil ihrer Zeit mit Warten oder mit dem Ausführen von Befehlen, deren Ergebnisse später aufgrund von falschen Spekulationen verworfen werden müssen.