Sorunuz beni meraklandırdı, bu yüzden çalıştığımız 3GHz sıralı PowerPC CPU'da bazı zamanlamalar yaptım. Yaptığım test, get / set işlevleriyle basit bir 4d vektör sınıfı yapmaktı
class TestVec
{
float x,y,z,w;
public:
float GetX() { return x; }
float SetX(float to) { return x=to; } // and so on for the other three
}
Sonra her biri bu vektörlerden 1024'ünü içeren (L1'e sığacak kadar küçük) üç dizi kurdum ve bunları birbirine ekleyen bir döngü (Ax = Bx + Cx) 1000 kez çalıştırdım. Ben olarak tanımlanan fonksiyonları ile bu koştum inline
, virtual
ve düzenli işlev çağrıları. Sonuçlar burada:
- satır içi: 8ms (çağrı başına 0.65ns)
- doğrudan: 68ms (arama başına 5.53ns)
- sanal: 160ms (çağrı başına 13ns)
Dolayısıyla, bu durumda (her şeyin önbelleğe sığdığı) sanal işlev çağrıları, satır içi çağrılardan yaklaşık 20 kat daha yavaştı. Ama bu gerçekten ne anlama geliyor? Döngü boyunca yapılan her yolculuk, tam olarak 3 * 4 * 1024 = 12,288
işlev çağrılarına (1024 vektör çarpı dört bileşen çarpı ekleme başına üç çağrı) neden olur, bu nedenle bu zamanlar 1000 * 12,288 = 12,288,000
işlev çağrılarını temsil eder . Sanal döngü, doğrudan döngüden 92 ms daha uzun sürdü, bu nedenle çağrı başına ek yük, işlev başına 7 nanosaniye idi.
Bundan şu sonuca varıyorum: evet , sanal işlevler doğrudan işlevlerden çok daha yavaştır ve hayır , onları saniyede on milyon kez çağırmayı planlamıyorsanız, önemli değil.
Ayrıca bkz: oluşturulan montajın karşılaştırması.