Birlikte Çalışabilirlik için Başarım Düşünceleri
Bu konu birlikte yönetilen/yönetilmeyen çalışma geçişlerinin çalışma zamanı başarımına etkisini azaltmak için yönergeler sağlar.
Visual C++ Visual Basic ve C# gibi .NET dilleriyle aynı birlikte çalışabilirlik düzeneklerini (P/Invoke) destekler, ama ayrıca Visual C++'a özgü birlikte çalışabilirlik desteği (C++ Interop) sağlar. Başarımın önemli olduğu uygulamalar için, her birlikte çalışma tekniğinin başarım etkilerini anlamak önemlidir.
Kullanılan birlikte çalışma tekniğinden bağımsız olarak, yönetilen bir işlev yönetilmeyen bir işlemi çağırdığında, ya da tam tersi olduğunda, dönüştürücü denen özel geçiş dizileri gerekir. Bu dönüştürücüler Visual C++ derleyicisi tarafından otomatik olarak eklenir, ama bu geçişlerin başarım açısından birikimli olarak pahalı olabileceğini unutmamak gerekir.
Geçişleri Azaltma
Birlikte çalışma dönüştürücülerinin maliyetini azaltmanın ya da maliyeti engellemenin bir yolu yönetilen/yönetilmeyen geçişleri en aza indirmede söz konusu arabirimleri yeniden düzenlemektir. Önemli başarım iyileştirmeleri, yönetilen/yönetilmeyen sınırlar arası sık çağrılarda söz konusu olan yüklü (chatty) arabirimler hedef alarak yapılabilir. Örneğin, sıkı bir döngüde yönetilmeyen işlev çağıran bir yönetilen işlev, yeniden düzenleme için iyi bir adaydır. Döngünün kendisi yönetilmeyen tarafa taşınırsa, ya da yönetilmeyen çağrıya yönetilen alternatif oluşturulursa (belki yönetilen tarafta veri sıralıyor ve ardından bu veriyi döngüden sonra yönetilmeyen API'ye bir kerede hazırlıyor olabilir), geçişlerin sayısı gözle görülür biçimde azalabilir.
P/Invoke ileC++ Birlikte Çalışabilirliği
Visual Basic ve C# gibi .NET dilleri için, yerel bileşenlerle birlikte çalışma için önceden tanımlanmış yöntem P/Invoke'tur. P/Invoke .NET tarafından desteklendiği için, Visual C++ da bunu destekler, ama Visual C++ C++ Birlikte Çalışabilirliği adı verilen kendi birlikte çalışabilirlik desteğini de sağlar. C++ Birlikte Çalışabilirliği P/Invoke'a tercih edilir çünkü P/Invoke tür kullanımı uyumlu değildir. Sonuç olarak, hatalar öncelikle çalışma zamanında raporlanır, ama C++ Birlikte Çalışabilirliğinin P/Invoke'a göre başarım üstünlükleri vardır.
İki teknik de yönetilen bir işlev yönetilmeyen bir işlev çağırdığında birkaç şeyin yapılmasını gerektirir.
İşlev çağrı bağımsız değişkenleri CLR'den yerel türlere hazırlanır.
Yönetilenden yönetilmeyene dönüştürücü yürütülür.
Yönetilmeyen işlev çağrılır (bağımsız değişkenlerin yerel sürümlerini kullanarak).
Yönetilmeyenden yönetilene dönüştürücü yürütülür.
Dönüş türü ve tüm "out" ve "in,out" bağımsız değişkenleri CLR'den yerel türlere hazırlanır.
Yönetilen/yönetilmeyen dönüştürücüler birlikte çalışabilirliğin çalışması için gereklidir, ama gereken veri hazırlama söz konusu veri türlerine, işlev imzasına ve verinin nasıl kullanılacağına bağlıdır.
C++ Interop tarafından gerçekleştirilen veri hazırlama mümkün olan en basit biçimidir: parametreler basitçe yönetilen/yönetilmeyen sınır üzerinden bit tabanlı bir şekilde kopyalanır; hiçbir dönüşüm gerçekleştirilmez. P/Invoke için bu yalnızca tüm parametreler basit, taşınabilir türlerse doğrudur. Yoksa, P/Invoke her yönetilen parametreyi uygun yerel türe dönüştürmek için güçlü adımlar gerçekleştirir, ve parametreler "out" ya da "in,out" olarak işaretlenmişse tersini yapar.
Başka bir deyişle, P/Invoke en güçlü yöntemi kullanırken, C++ Birlikte Çalışabilirliği veri hazırlama için olası en hızlı yöntemi kullanır. Bu demektir ki C++ Birlikte Çalışabilirliği (C++ için genel bir biçimde) varsayılan olarak en iyi başarımı sağlar, ve programcı bu davranışın güvenli ve uygun olmadığı durumları gidermekten sorumludur.
C++ Birlikte Çalışabilirliği bu nedenle veri hazırlamanın açıkça sağlanmasını gerektirir, ama bunun avantajı, verinin niteliği ve nasıl kullanılacağı verildiği takdirde, programcının neyin uygun olduğuna karar verebilmesidir. Ayrıca, P/Invoke veri hazırlamasının davranışı bir dereceye özelleştirilmiş biçimde değiştirilebilse de, C++ Birlikte Çalışabilirliği veri hazırlamanın çağrı tarafından çağrı temelli olarak özelleştirilmesine izin verir. Bu P/Invoke ile mümkün değildir.
C++ Birlikte Çalışabilirliği hakkında daha fazla bilgi için, bkz. C++ Birlikte Çalışabilirliği Kullanma (Dolaylı Olarak PInvoke).