En düşük seviyede (donanımda), evet, eğer s pahalıysa. Nedenini anlamak için, boru hatlarının nasıl çalıştığını anlamanız gerekir .
Yürütülecek geçerli talimat, tipik olarak komut işaretçisi (IP) veya program sayacı (PC) olarak adlandırılan bir şeyde saklanır ; bu terimler eş anlamlıdır, ancak farklı mimarilerde farklı terimler kullanılmaktadır. Çoğu talimat için, bir sonraki talimatın PC'si sadece mevcut PC artı mevcut talimatın uzunluğudur. Çoğu RISC mimarisi için talimatların tümü sabit uzunluktadır, bu nedenle PC sabit bir miktarda artırılabilir. X86 gibi CISC mimarileri için, komutlar değişken uzunluklu olabilir, bu nedenle talimatı çözen mantık, bir sonraki talimatın yerini bulmak için mevcut talimatın ne kadar uzun olduğunu bulmalıdır.
İçin şube talimatları Ancak yürütülecek sonraki talimat geçerli talimat sonraki konum değil. Dallar, işlemciye bir sonraki talimatın nerede olduğunu söyler. Dallar koşullu veya koşulsuz olabilir ve hedef konum sabit veya hesaplanabilir.
Koşullu ile koşulsuz arasındaki farkı anlamak kolaydır - koşullu dal yalnızca belirli bir koşul geçerliyse alınır (bir sayının diğerine eşit olup olmadığı gibi); Branşman alınmazsa kontrol normal gibi şubeden sonraki talimata geçer. Koşulsuz şubeler için daima şube alınır. Koşullu dallar if
ifadelerde for
ve while
döngülerin kontrol testlerinde görünür. Koşulsuz dallar sonsuz döngülerde, işlev çağrılarında, işlev dönüşlerinde break
ve continue
ifadelerde, kötü şöhretli goto
ifadede ve daha pek çok şeyde görünür (bu listeler kapsamlı olmaktan uzaktır).
Şube hedefi bir diğer önemli konudur. Çoğu dalın sabit bir dal hedefi vardır - kodda derleme zamanında sabit olan belirli bir konuma giderler. Bu, if
ifadeleri, her türden döngüyü, normal işlev çağrılarını ve daha fazlasını içerir. Hesaplanan dallar, çalışma zamanında dalın hedefini hesaplar. Bu, switch
ifadeleri (bazen), bir işlevden dönenleri, sanal işlev çağrılarını ve işlev işaretçisi çağrılarını içerir.
Peki tüm bunlar performans için ne anlama geliyor? İşlemci ardışık düzeninde bir dallanma talimatının göründüğünü gördüğünde, ardışık düzenini nasıl doldurmaya devam edeceğini bulması gerekir. Program akışında daldan sonra hangi talimatların geldiğini anlamak için iki şeyi bilmesi gerekir: (1) dalın alınıp alınmayacağı ve (2) dalın hedefi. Bunu anlamaya dal tahmini denir ve bu zorlu bir problemdir. İşlemci doğru tahmin ederse, program tam hızda devam eder. İşlemci bunun yerine yanlış tahmin ederse , yanlış şeyi hesaplamak için biraz zaman harcadı. Şimdi ardışık düzenini temizlemesi ve doğru yürütme yolundan gelen talimatlarla yeniden yüklemesi gerekir. Sonuç olarak: büyük bir performans vuruşu.
Bu nedenle, ifadelerin pahalı olmasının nedeni şube yanlış tahminlerinden kaynaklanmaktadır . Bu sadece en düşük seviyededir. Üst düzey kod yazıyorsanız, bu ayrıntılar için endişelenmenize gerek yok. Bunu yalnızca C veya derlemede son derece performans açısından kritik kod yazıyorsanız önemsemelisiniz. Durum böyleyse, daldan arındırılmış kod yazmak, birkaç talimata daha ihtiyaç duyulsa bile, dallara ayrılan koddan daha üstün olabilir. Aşağıdaki gibi şeyler hesaplamak için yapabileceğiniz bazı serin bit twiddling hile vardır abs()
, min()
ve max()
dallanma olmadan.