Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu, yönetilen/yönetilmeyen birlikte çalışma geçişlerinin çalışma zamanı performansı üzerindeki etkisini azaltmaya yönelik yönergeler sağlar.
Visual C++, Visual Basic ve C# (P/Invoke) gibi diğer .NET dilleriyle aynı birlikte çalışabilirlik mekanizmalarını destekler, ancak Visual C++ 'a (C++ birlikte çalışma) özgü birlikte çalışma desteği de sağlar. Performans açısından kritik uygulamalar için her birlikte çalışma tekniğinin performans etkilerini anlamak önemlidir.
Kullanılan birlikte çalışma tekniğinden bağımsız olarak, yönetilen bir işlev yönetilmeyen bir işlevi her çağırışında (veya tam tersi) thunks olarak adlandırılan özel geçiş dizileri gereklidir. Bu thunk'lar Microsoft C++ derleyicisi tarafından otomatik olarak eklenir, ancak toplu olarak bu geçişlerin performans açısından pahalı olabileceğini unutmayın.
Geçişleri Azaltma
Birlikte çalışabilirlik thunks'larının maliyetini önlemenin veya azaltmanın bir yolu, yönetilen/yönetilmeyen geçişleri en aza indirmek için ilgili arabirimleri yeniden düzenlemektir. Yönetilen/yönetilmeyen sınır boyunca sıkça çağrıda bulunan sohbet eden arayüzler hedeflenerek önemli performans iyileştirmeleri yapılabilir. Yönetilmeyen bir işlevi sıkı bir döngüde çağıran yönetilen bir işlev, örneğin, yeniden düzenleme için iyi bir adaydır. Döngünün kendisi yönetilmeyen tarafa taşınırsa veya yönetilmeyen çağrıya yönetilen bir alternatif oluşturulursa (yönetilen tarafta verileri kuyruğa almak ve ardından döngüden sonra tümünü yönetilmeyen API'ye sıralamak olabilir), geçiş sayısı önemli ölçüde azaltılabilir.
P/Invoke ve C++ Interop
Visual Basic ve C# gibi .NET dilleri için yerel bileşenlerle birlikte çalışma için belirlenen yöntem P/Invoke'tır. P/Invoke .NET Framework tarafından desteklendiğinden, Visual C++ da bunu destekler, ancak Visual C++ da C++ Birlikte Çalışma olarak adlandırılan kendi birlikte çalışabilirlik desteğini sağlar. C++ Interop, P/Invoke yerine tercih edilir çünkü P/Invoke türü güvenli değildir. Sonuç olarak, hatalar öncelikli olarak çalışma zamanında bildirilir, ancak C++ Birlikte Çalışma'nın P/Invoke'a göre performans avantajları da vardır.
İki teknik de yönetilen bir işlev, yönetilmeyen bir işlevi her çağırdığında birkaç şeyin gerçekleşmesini gerektirir.
İşlev çağrısının bağımsız değişkenleri CLR'den yerel türlere düzenlenir.
Yönetilenden yönetilmeyene geçiş için bir thunk yürütülür.
Yönetilmeyen işlev, parametrelerin yerel sürümleri kullanılarak çağrılır.
Yönetilmeyen bir thunk'tan yönetilen bir thunk'a geçiş gerçekleştirilir.
Dönüş türü ve tüm "out" veya "in,out" bağımsız değişkenleri yerelden CLR türlerine sıralanır.
Birlikte çalışabilirliğin sağlanabilmesi için yönetilen/yönetilmeyen thunk'lar gereklidir, ancak gerekli olan veri düzenleme işlemi, söz konusu veri türlerine, fonksiyon imzasına ve verilerin 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çimdedir: parametreler sadece yönetilen/yönetilmeyen sınır boyunca bit düzeyinde doğrudan kopyalanır; herhangi bir dönüştürme işlemi yapılmaz. P/Invoke için bu yalnızca tüm parametreler basit, kesilebilir türlerse geçerlidir. Aksi takdirde, P/Invoke her yönetilen parametreyi uygun bir yerel türe dönüştürmek için çok sağlam adımlar gerçekleştirir ve bağımsız değişkenler "out" veya "in,out" olarak işaretlendiğinde bunların yerel türlerden yönetilen türlere dönüştürülmesi için de aynı şekilde işlem yapar.
Başka bir deyişle, C++ Interop mümkün olan en hızlı veri aktarım yöntemini, P/Invoke ise en sağlam yöntemi kullanır. Bu, C++ Birlikte Çalışması'nın (C++için tipik bir şekilde) varsayılan olarak en iyi performansı sağladığı ve bu davranışın güvenli veya uygun olmadığı durumları ele almaktan programcının sorumlu olduğu anlamına gelir.
Bu nedenle C++ Birlikte Çalışma, veri hazırlamanın açıkça sağlanmasını gerektirir, ancak bunun avantajı, programcının verilerin doğası ve nasıl kullanılacağı göz önünde bulundurularak neyin uygun olduğuna karar vermekte serbest olmasıdır. Ayrıca, P/Invoke veri düzenlemenin davranışı bir dereceye kadar özelleştirilebilir, ancak C++ ile Birlikte Çalışma, veri düzenlemenin çağrı bazında özelleştirilmesine olanak tanır. Bu, P/Invoke ile mümkün değildir.
C++ Birlikte Çalışma hakkında daha fazla bilgi için bkz. C++ Birlikte Çalışma'yı Kullanma (Örtük PInvoke).