En iyi duruma getirme için en iyi yöntemler
Bu belge, Visual C++ en iyi duruma getirme için en iyi uygulamaları açıklar. Aşağıdaki konular ele alınmıştır:
Derleyici ve bağlantı Oluşturucu Seçenekleri
Profil destekli en iyi duruma getirme
Hangi düzeyde en iyileştirme kullanmalıyım?
Kayan nokta anahtarları
En iyi duruma getirme Declspecs
En iyi duruma getirme formunda bilgi
__restrict ve __assume
İçsel destekleri
Özel durumlar
Derleyici ve bağlantı Oluşturucu Seçenekleri
Profil destekli en iyi duruma getirme
Visual C++ profil destekli en iyi duruma getirme (pgo) destekler. Bu iyileştirme profil verileri geçmiş uygulama belgelenmiş bir sürümünü çalıştırma uygulaması sonraki en iyi duruma getirme sürücü için kullanır. pgo kullanarak zaman kaybı, olabilir, böylece her geliştiricinin kullandığı bir şey olmayabilir, ancak pgo bir ürünün son sürüm oluşturma için kullanmanızı öneririz. Daha fazla bilgi için bkz. Profil destekli en iyi duruma getirme.
Buna ek olarak, tüm programı en iyi duruma getirme (bağlantı zaman kod oluşturma da bilir) ve /O1 ve /O2 en iyi duruma getirme geliştirilmiştir. Genel olarak, bu seçeneklerden birini derlenmiş bir uygulama ile bir önceki derleyici derlenmiş aynı uygulama daha hızlı olacaktır.
Daha fazla bilgi için, bkz. /gl (tüm Program iyileştirme) ve / O1, /O2 (boyutunu en aza indirmek, hızını en üst düzeye çıkarmak).
Hangi düzeyde en iyileştirme kullanmalıyım?
Mümkünse, son sürümü yapılarına profil iyileştirmeleri destekli derlenmesi gerekir. Onu Araçlı yapılar çalıştıran veya senaryoları erişmesini değil yetersiz altyapı mı yüzünden pgo ile oluşturmak mümkün değilse, daha sonra tüm programı en iyi duruma getirme ile bina öneririz.
/Gy Anahtarı da çok kullanışlı. Başvurulmayan COMDATs ve comdat kaldırmak için söz konusu olduğunda linker daha fazla esneklik sağlayan ayrı bir comdat her işlev için oluşturduğu Katlama. Kullanmanın tek dezavantajı /Gy olan zamanını üzerinde küçük bir etkiye sahip olabilir. Bu nedenle, genellikle kullanmak için önerilir. Daha fazla bilgi için bkz. /Gy (enable işlev düzeyinde bağlama).
64-Bit ortamlarda bağlama için bunun kullanılması önerilir /OPT:REF,ICF linker seçeneği ve 32 bitlik ortamlardır, /OPT:REF önerilir. Daha fazla bilgi için bkz. / opt (en iyi duruma getirme).
Hatta en iyi duruma getirilmiş sürümü yapılar ile hata ayıklama simgeleri oluşturmak için de kesinlikle önerilir. Yaratılan kodu tümden etmez ve onu bir lot, uygulamanız, hata ayıklamak daha kolay olması kolaylaştırır.
Kayan nokta anahtarları
/Op Derleyici seçeneği kaldırılmıştır ve kayan nokta en iyi duruma getirme ile ilgili aşağıdaki dört derleyici seçenekleri eklenmiştir:
/fp:precise |
Bu varsayılan öneri ve çoğu zaman kullanılmalıdır. |
/fp:fast |
Performans oyunlar, örneğin utmost önem olup önerilir. Bu en hızlı performansı neden olacak. |
/fp:strict |
Önerilen Eğer kesin kayan nokta özel durumlar ve IEEE istendiği davranış. Bu, en yavaş performansı neden olacak. |
/fp:except[-] |
İle birlikte kullanılan /fp:strict veya /fp:precise, ama /fp:fast. |
Daha fazla bilgi için bkz. /FP (kayan nokta davranışı belirtin).
En iyi duruma getirme Declspecs
Bu bölümde biz programlarda performans yardımcı olmak için kullanılan iki declspecs bakın: __declspec(restrict) ve __declspec(noalias).
restrict Declspec bir işaretçi gibi döndüren işlev bildirimleri yalnızca uygulanabilir__declspec(restrict) void *malloc(size_t size);
restrict Declspec unaliased işaretçiler veren işlevleri kullanılır. Bu anahtar sözcük c Çalışma Zamanı Kitaplığı uygulanması için kullanılan malloc beri hiç (geçersiz boşaltıldıktan sonra bellek kullanma gibi bir şey yaptığınızı sürece) zaten kullanılmakta olan geçerli programda bir işaretçi değeri döndürür.
restrict Declspec derleyici derleyici iyileştirmeler gerçekleştirmek için daha fazla bilgi verir. Bir derleyici belirlemek için en zor şeylerden biri hangi işaretçiler diğer diğer işaretçiler ve büyük ölçüde bu bilgileri kullanarak derleyici yardımcı olur.
Bu işaret kurlar bu promise derleyici değil, derleyici doğrular şeyler olmasıdır. Bu program kullanıyorsa, restrict declspec açamayacağı, programınız yanlış davranış olabilir.
Daha fazla bilgi için bkz. restrict.
noalias Declspec da yalnızca işlevler için uygulanır ve işlevi semi-pure bir işlev olduğunu gösterir. Semi-pure işlevi, başvurular ya da yalnızca Yereller, bağımsız değişkenler ve birinci düzey indirections bağımsız değişkenleri değiştirir biridir. Promise derleyici bu declspec olduğu ve globals işleve başvuran ya da ikinci düzey indirections, işaretçi bağımsız değişkenlerini sonra derleyici kodu verebilir, uygulama keser.
Daha fazla bilgi için bkz. noalias.
En iyi duruma getirme formunda bilgi
Kodu en iyi duruma yardımcı olacak birkaç yararlı formunda bilgi vardır. Tartışacağımız birinci olan #pragma optimize:
#pragma optimize("{opt-list}", on | off)
Bu pragma işlevi fonksiyon bazında verilen iyileştirme düzeyini ayarlamanıza olanak verir. Bu nadir işleminizi belirli bir işlev iyileştirme ile derlendiğinde uygulamanız yere çöküyor idealdir. En iyi duruma getirme için tek bir işlevi devre dışı bırakmak için kullanabilirsiniz:
#pragma optimize("", off)
int myFunc() {...}
#pragma optimize("", on)
Daha fazla bilgi için bkz. optimize.
Inlining derleyici gerçekleştiren ve burada Biz bu davranışı değiştirmek yardımcı formunda bilgi birkaç hakkında konuşmak en önemli iyileştirmeler biridir.
#pragma inline_recursionSatıriçi bir Özyinelemeli çağrı görebilmek için uygulamayı isteyip istemediğinizi belirtmek için yararlıdır. Varsayılan olarak kapalı olduğunu. Küçük işlevleri için yüzeysel özyineleme bu açmak için olabilir. Daha fazla bilgi için bkz. inline_recursion.
Başka yararlı pragma derinliğini sınırlamak için inlining olan #pragma inline_depth. Bu genellikle, bir program veya işleve boyutunu sınırlamak için burada çalıştığınız durumlarda yararlıdır. Daha fazla bilgi için bkz. inline_depth.
__restrict ve __assume
Visual C++ performans yardımcı olabilecek anahtar sözcükleri birkaç vardır: __restrict ve __assume.
İlk olarak, unutulmamalıdır, __restrict ve __declspec(restrict) iki farklı şeyler olur. Kendi semantiği biraz ilgili iken farklıdır. __restrictbir tür niteleyici gibi olan const veya volatile, ancak işletmeler için işaretçi türleri.
Bir işaretçi ile değiştirilen __restrict olarak adlandırılmıştır bir İşaretçi __restrict. __Restrict işaretçi yalnızca __restrict işaretçi erişilebilen bir işaretçidir. Başka bir deyişle, başka bir işaretçi için __restrict işaretçi işaret ettiği verilere erişmek için kullanılamaz.
__restrictVisual C++ en iyi duruma getiricisi için güçlü bir araç olabilir, ancak çok dikkatli kullanın. Yanlış kullanılan, iyileştirici uygulamanız sonu bir iyileştirme gerçekleştirebilir.
__restrict Anahtar sözcüğü değiştirir /Oa önceki sürümlerden geçiş yapın.
İle __assume, Geliştirici bazı değişkenin değeri hakkında varsayımlar yapmak için derleyici söyleyebilirsiniz.
Örneğin __assume(a < 5); bu kodu değişkeni satırında söyler iyileştirici a 5'ten az olur. Yeniden promise derleyici budur. a Gerçekten 6 Bu noktada programda sonra derleyici en iyi hale getirdi sonra programın davranışını ne beklediğiniz olmayabilir. __assumeswitch ifadeleri ve/veya koşullu deyimler öncesinde çok yararlı olacaktır.
Bazı sınırlamalar vardır __assume. İlk olarak, ister __restrict, yalnızca bir öneri ise, derleyici, bu nedenle gözardı etmesini serbest. Ayrıca, __assume şu anda yalnızca sabitler karşı değişken inequalities ile çalışır. Sembolik inequalities, örneğin, assume(a < yay. b).
İçsel destekleri
İç bilgileri olan işlevi burada derleyici çağrı hakkında temel bilgi vardır ve kitaplıkta bir işlev çağırmak yerine, o işlev kodunu gösterir çağırır. <Installation_Directory> \VC\include\intrin.h bulunan üstbilgi dosyası intrin.h (x 86, x 64 ve Itanium) üç desteklenen platformlar için tüm kullanılabilir iç bilgileri içerir.
İç bilgileri Programcı derinlikte kodu derleme kullanmak zorunda kalmadan gidin sağlıyor. İç bilgileri kullanarak birçok faydası vardır:
Kodunuzu daha kolay taşınabilir. Birkaç iç bilgileri birden çok cpu mimarileri üzerinde kullanılabilir.
Kodunuzu kod c/C++ ile yazılmış olan bu yana okumak kolaydır.
Kodunuzu derleyici en iyi duruma getirme avantajı alır. Derleyici daha iyi alır gibi iç bilgileri için kod oluşturma artırır.
Daha fazla bilgi için, bkz. Derleyici iç bilgileri ve İç bilgileri kullanmanın yararları.
Özel durumlar
Bir performansın özel durumlar kullanımıyla ilişkili isabet. Derleyicinin bazı en iyi duruma getirme işlemi engelle try bloğu kullanırken bazı kısıtlamalar getirilmiştir. X 86 platformlar gelen ek performans düşüşü yok kod çalıştırma sırasında oluşturulan ek durum bilgileri yüzünden bloklar deneyin. 64-Bit platformlarda deneyin bloklar daha fazla performans düşmesine değil, ancak bir özel durum oluşturulduktan sonra işlem işleyicisi bulma ve yığın unwinding pahalı olabilir.
Bu nedenle, gerçekten gerek olmayan kod içine try/catch bloğu önlemek için önerilir. Özel durumlar kullanmak zorundaysanız, zaman uyumlu özel durumlar mümkün olduğunda kullanın. Daha fazla bilgi için bkz. Yapılandırılmış özel durum işleme (C++).
Son olarak, yalnızca olağanüstü durumlarda istisna atar. Özel durumlar için genel denetim akışı kullanarak performans düşebilir olası hale getirir.