Aracılığıyla paylaş


Birlikte Çalışabilirlik için Başarım Düşünceleri (C++)

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ışma thunk'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üzenlemedir. Yönetilen/yönetilmeyen sınır boyunca sık sık çağrılar yapan gevendekli arabirimler 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 ile C++ Birlikte Çalışma karşılaştırması

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. P/Invoke türü güvenli olmadığından C++ Birlikte Çalışma P/Invoke yerine tercih edilir. 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.

Her iki teknik de yönetilen bir işlev yönetilmeyen bir işlevi her çağırışında birkaç şeyin gerçekleşmesini gerektirir:

  • İşlev çağrısı bağımsız değişkenleri CLR'den yerel türlere sıralanır.

  • Yönetilen ve yönetilmeyen bir thunk yürütülür.

  • Yönetilmeyen işlev çağrılır (bağımsız değişkenlerin yerel sürümleri kullanılarak).

  • Yönetilmeyen ve yönetilen bir thunk yürütülür.

  • 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ışmanın çalışması için yönetilen/yönetilmeyen thunk'lar gereklidir, ancak gerekli olan veri hazırlama işlemi söz konusu veri türlerine, işlev imzasına ve verilerin nasıl kullanılacağına bağlıdır.

C++ Birlikte Çalışma tarafından gerçekleştirilen veri hazırlama, mümkün olan en basit biçimdir: parametreler yalnızca yönetilen/yönetilmeyen sınır boyunca bit düzeyinde kopyalanır; hiç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şaretlenmişse tam tersi olur.

Başka bir deyişle, C++ Birlikte Çalışma mümkün olan en hızlı veri hazırlama yöntemini, P/Invoke ise en güçlü 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 hazırlamanın davranışı bir dereceye kadar özelleştirilebilir, ancak C++ Birlikte Çalışma veri hazırlamanın çağrı temelinde ö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 Kullanma (Örtük PInvoke).

Ayrıca bkz.

Karışık (Yerel ve Yönetilen) Derlemeler