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.
Profil Güdümlü Optimizasyon (PGO), derleyicinin daha iyi optimizasyon kararları vermesine yardımcı olmak için çalışma zamanı verilerini kullanır. PGO, temsili iş yüklerinden toplanan yürütme profili verilerini kullanarak derleyicinin satır içi, kod düzeni ve sık/soğuk kod ayrımı hakkında daha akıllı kararlar vermesine olanak tanır. Bu kararları yalnızca statik analizden almak mümkün değildir.
SPGO farklı bir yaklaşım benimser. SPGO, ikili dosyanızı araçlayıp sentetik eğitim senaryolarında çalıştırmak yerine, gerçek sürüm ikili dosyalarınızdan toplanan donanım performans sayacı örneklemelerini kullanır. Modern işlemciler donanım örnekleme özellikleri sağlar. Bu örnekleri ihmal edilebilir düzeyde çalışma zamanı yüküyle toplayabilirsiniz; böylece çalışma zamanı profillerini doğrudan üretim kodundan toplamak pratik hale gelir.
SPGO profilleri, izlemeli derlemeler yerine bitler yayımladığından, verileri nerede ve nasıl topladığınız konusunda çok daha fazla esneklik sağlar. Üretim sunucularından, geliştirici makinelerinden, performans laboratuvarlarından veya herhangi bir bileşimden çalışma zamanı profilleri toplayabilirsiniz. Sonuç, profil verilerinin kalitesine bağlı olarak genellikle %5-15 performans artışı sağlayan ve kritik kod yollarını daha verimli çalıştıran bir ikili dosyadır.
MSVC'de Örnek Profil Destekli İyileştirme (PGO) ve örnekleme tabanlı profil oluşturma kullanarak performansı nasıl geliştirdiği hakkında daha fazla bilgi için bkz. MSVC'de Örnek Profil Destekli İyileştirmeye Giriş
Bu öğreticide, eksiksiz SPGO iş akışını adım adım gözden geçirirsiniz: örnek bir uygulama oluşturur, profilini xperf kullanarak çıkarır, profil verilerini hazırlar ve profil verileriyle yeniden derlersiniz. bitirdiğinizde, aynı işlemi kendi projelerinize uygulayabilirsiniz.
Prerequisites
Başlamadan önce aşağıdaki yazılım ve donanıma sahip olduğunuzdan emin olun.
Software
- x64/x86/ARM64 v14.51 veya üzeri için MSVC derleme araçları— Bunları Visual Studio Yükleyicisi aracılığıyla yükleyin. Tek Tek Bileşenler'in altında "MSVC derleme araçları" ifadesini arayın.
-
Windows Performance Toolkit (xperf.exe)—
xperfprofil oluşturucu, programınızın yürütülmesi sırasında örnek verileri toplar. ADK yükleme adresinden Windows Değerlendirme ve Dağıtım Seti'ni (ADK) indirin. ADK yükleyicisini çalıştırdığınızda, almak içinxperfbileşenini seçin. AdK'nın tamamını yüklemeniz gerekmez. - War and Peace metin dosyası—Profil oluşturma verileri oluşturmak için örnek iş yükü olarak kullanılır. Project Gutenberg: https://www.gutenberg.org/ebooks/2600 adresinden indirin. Çalışma dizininizde düz metin dosyası olarak kaydedin.
Donanım gereksinimleri
Eğitimde üç profil çıkarma yolu vardır. Hangi yolu kullandığınız donanımınıza bağlıdır. Makinenizin hangi yolu desteklediğini öğrenmek için profil oluşturma yönteminizi seçin bölümünde algılama komutlarını çalıştırırsınız. Şimdilik, gereksinimlerin en az birini karşıladığınızdan emin olmak için bu tabloyu kullanın.
| Path | CPU gereksinimi | Notlar |
|---|---|---|
| LBR (en iyi sonuçlar) | Son Dal Kayıtları (LBR), Intel Haswell CPU'larında (4. nesil Core, 2013) veya sonraki sürümlerde sağlanan performans sayaçlarıdır; AMD Zen 4 (2022) veya üzeri, ARM64 ARMv9.2-A (2020) veya üzeri | En iyi dal verilerini sağlar. LBR hakkında daha fazla bilgi için bkz. Son dal kayıtlarına giriş |
| PMC/IP modu (iyi sonuçlar) | Performans İzleme Sayaçları (PMC), performans izleme birimi (PMU) ile tüm x64 CPU'larda desteklenir | LBR'nin kullanılamadığı çoğu modern CPU'da çalışır. PMC hakkında daha fazla bilgi için bkz . Tam Örneklerle Donanım Performansı (PMU) Olaylarını Kaydetme ve Donanım Performansını Kaydetme (PMU) Olayları |
| İşletim sistemi zamanlayıcı (her yerde çalışır) | Azure VM'ler ve sanal makineler dahil olmak üzere tüm x64 veya ARM64 CPU'ları | Daha düşük kaliteli örnekler, ancak her zaman mevcut |
Modern x64 masaüstü donanımındaki geliştiricilerin çoğu LBR desteğine sahiptir. VM'ler ve bazı eski donanımlar PMC veya işletim sistemi zamanlayıcıya sahiptir.
SPGO nasıl çalışır?
SPGO, çalışan ikili dosyanızdan profil verilerini toplar ve bir sonraki derlemenizde bu verileri derleyiciye geri aktarır. Derleyici, bu verileri kullanarak iç hat oluşturma, kod düzeni ve dal tahmini hakkında daha iyi kararlar alır. Avantajlarından biri, herhangi bir enstrümantasyon gerekmemesidir.
İş akışı şu şekildedir:
-
/spgo bağlayıcı bayrağıyla ikili dosyanızı oluşturun. Bu adım boş bir örnek profil veritabanı (
.spddosya) oluşturur. - Bir ETL iz dosyası oluşturmak için ikili dosyanın profilini
xperfkullanarak çıkarın. -
kullanarak ETL'yi
SPTAggregate.exedosyasına dönüştürün, ardından kullanarak SPT'yiSPDConvert.exedosyasına dönüştürün. - Doldurulan örnek profil veritabanına (SPD) işaret eden /spdin bağlayıcı bayrağıyla yeniden derleyin. Bağlayıcı SPGO iyileştirmelerini uygular.
İyileştirici, SPD'yi kullanarak aşağıdaki gibi soruları yanıtlar: En sık hangi dallar alınır? Yoğun kullanılan döngülerde hangi işlevler çağrılır? Bu işlem yalnızca statik analizden daha iyi kod düzeni ve inlining kararları üretir.
SPGO hem C hem de C++ ile çalışır. İş akışı ve bayraklar her iki dil için de aynıdır.
SPGO için en iyi adaylar: Sıkı iç döngülere sahip büyük, dal dolgulu C/C++ uygulamaları. Kod tabanı boyutu ve dal karmaşıklığı ile ölçek kazanır. Bu öğreticideki küçük örnekte yaklaşık 7% iyileştirme gösterilmektedir. Daha büyük üretim kod temelleri genellikle daha fazla geliştirme görür.
Derleme Süreci Karşılaştırması
Bu bölüm, işleyişi anlamak istiyorsanız SPGO'nun derleme işlem hattına nasıl entegre olduğunu açıklar.
Normal derleme işlemi
Standart bir C/C++ sürüm derlemesinde:
-
Giriş: Kaynak kod dosyaları (
.cpp,.h) ve yayın modu derleyici bayrakları (/O2,/GLvb.). - Süreç: Derleyici, yalnızca statik analize dayanarak satır içi yerleştirme buluşsal yöntemleri, dal tahmini varsayımları ve kod yerleşimi kararları gibi standart eniyileştirmeler uygular. Programın çalıştırıldığında gerçekte nasıl davrandığı hakkında hiçbir verisi yoktur.
-
Çıkış: Yürütülebilir (
.exe), DLL dosyaları (.dll), hata ayıklama bilgileri (.pdb).
Çalışma zamanı verileri olmadan, sık erişimli yollar ve soğuk yollar benzer bir işlem alır.
SPGO özellikli derleme işlemi
SPGO, profil oluşturma verilerini derleme işlem hattına yeni bir giriş olarak ekler:
-
Girdiler: Kaynak kod,
.spdprofil dosyası (bir profil oluşturma çalıştırmasındaki örnek sayıları), sürüm modu derleyici bayrakları,/link /spgove/spdin:<path>, bir giriş SPD dosyası belirtmek için (belirtilmezse, varsayılan olarak ikili dosya adı kullanılarak obj klasöründe bulunan bir .spd dosyası kullanılır). - Işlem: Bağlayıcı, ara kodla birlikte SPD'yi okur. Daha iyi satır içi yerleştirme, kod düzeni ve dal sıralaması kararları vermek için dal sıklığı verilerini kullanır. Sık kullanılan işlevler, hızlı erişim sağlamak için yerleştirilir; seyrek kullanılan kod kritik yürütme yolundan uzaklaştırılır.
-
Çıkış: İyileştirilmiş yürütülebilir dosya (
.exe), iyileştirilmiş DLL dosyaları (.dll), hata ayıklama bilgileri ().pdbve gelecekteki profil oluşturma yinelemeleri için yeni.spdbir dosya .
Önemli içgörü: SPGO, iyileştirme kararlarını derleyici ve bağlayıcı buluşsallarından gerçek yürütmeye dayalı veri temelli seçimlere taşır.
Anahtar bayrakları
| Flag | Türü | Amaç |
|---|---|---|
/spgo |
Linker | SPGO'yu etkinleştirir. SPGO meta verilerini ikiliye gömer ve .spd belirtilmediği sürece boş bir /spdin çıkış dosyası oluşturur; bu durumda belirtilen .spd dosyası girdi olarak kullanılır. |
/spdin:<path> |
Linker | Giriş SPD - iyileştirme için bağlayıcıya profil verileri sağlar |
/spd:<path> |
Linker | Çıkış SPD yolu - yeni SPD'nin nereye yazıldığını belirtir (isteğe bağlı; varsayılan olarak ikili ile aynı dizine ayarlanır). Belirtilmezse /spdin giriş SPD yolu olarak görev alır. |
/GL |
Derleyici | SPGO'nın çeviri birimlerinde çalışması için tam program iyileştirmesi gereklidir |
/O1, /O2 (Boyutu En Aza İndir, Hızı En Üst Düzeye Çıkar) |
Derleyici | Hız için optimize edin; SPGO'nun geliştirebileceği agresif optimizasyonları etkinleştirir |
SPGO'nun PGO'dan farkı
PGO (Profil Yönlendirmeli Optimizasyon), ikili dosyanızı enstrümantasyon bayraklarıyla (/GENPROFILE) derlemenizi, .pgc yürütme sayısı dosyalarını toplamak için daha yavaş enstrümante edilmiş ikili dosyayı çalıştırmanızı ve ardından /USEPROFILE ile yeniden bağlamanızı gerektirir. Derleyici tam yürütme sayılarını alır, ancak önce kodu izlemeniz gerekir. Bu işlem hakkında daha fazla bilgi için bkz. Profil temelli iyileştirmeler.
SPGO, yetkisiz yayın ikili dosyanızdan istatistiksel örnekler toplamak için donanım CPU performans sayaçlarını kullanır. Mevcut ikili dosyanızı çalıştırın, profilini xperf kullanarak çıkarın, izlemeyi bir SPD dosyasına dönüştürün ve yeniden derleyin. Profil oluşturma sırasında ne araçlanmış derleme ne de yavaşlama olur. Derleyici, tam sayılar yerine istatistiksel örnekleme verileri alır. Bu veriler daha az kesindir ancak daha kolay elde edilir ve kod değişikliği gerektirmez. Ayrıca, izlemeli bir yaklaşımla veri toplaması zor olan sistem bileşenlerinin veya gerçek zamanlı bileşenlerin profil oluşturmasına olanak tanır. Final/shipping ikili dosyalarını da profilleyebilirsiniz.
Bu öğretici üç profil oluşturma yöntemini kapsar: LBR, PMC ve işletim sistemi zamanlayıcı. Profil oluşturma yönteminizi seçin bölümünde yönteminizi seçersiniz. Bayrak başvuru tablosu da dahil olmak üzere normal derleme işleminin SPGO derleme işlemiyle ayrıntılı karşılaştırması için bkz. Derleme İşlemi Karşılaştırması.
perfcore.ini'ı yapılandırma
⚠✔ Gerekli: Bu adım olmadan gerekli
xperfprofil oluşturma verilerini sağlamaz. komutunu çalıştırmadanxperfönce bu adımı tamamlayın.
Windows Performance Toolkit (WPT), SPGO için ihtiyaç duyduğu DLL sağlayıcılarını kaydetmek üzere WPT'yi perfcore.ini konumunda varsayılan konuma yüklediyseniz bulunan C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\perfcore.ini kullanır.
Windows Not Defteri'ni Yönetici olarak açın. Ardından perfcore.ini öğesini açın. DLL listesi bölümünü bulun ve her satıra bir tane olacak şekilde aşağıdaki girdileri ekleyin:
perf_lbr.dll
perf_spt.dll
perf_hv.dll
Yüklü değilse xperf.exe , yüklemeyle ilgili genel sorunlar konusuna bakın.
kaydedin ve kapatın perfcore.ini. DLL dosyaları zaten xperf.exe ile aynı dizinde bulunur, bu nedenle bunları başka bir yere kopyalamanız gerekmez. Onları yalnızca perfcore.ini içinde kaydediyorsunuz.
xperf öğesinin PATH içinde olduğundan emin olun.
Örnek uygulamayı oluşturma
Bu öğreticinin örnek uygulaması, standart girişten metin okuyan ve bir satır sayısı, sözcük sayısı, toplam karakter sayısı, karakter sıklığı tablosu ve dosyayı milisaniye cinsinden işlemek için geçen süreyi üreten bir C++ programıdır. C++ dilinde yazılmıştır, ancak SPGO C ile de çalışır. İş akışı C projeleri için aynıdır.
Çalışma dizininizde adlı textCount.cpp bir dosya oluşturun ve aşağıdaki kaynak kodunu ekleyin:
// textCount.cpp : Text Statistics Counter
// Counts words, lines, and character frequencies from standard input
// Usage: textCount < file.txt
#include <iostream>
#include <string>
#include <map>
#include <cctype>
#include <chrono>
int main()
{
auto start = std::chrono::steady_clock::now();
std::map<unsigned char, int> charFrequency;
int wordCount = 0;
int lineCount = 0;
int totalChars = 0;
std::string line;
bool inWord = false;
while (std::getline(std::cin, line))
{
lineCount++;
for (char c : line)
{
totalChars++;
unsigned char uc = static_cast<unsigned char>(c);
charFrequency[uc]++;
if (std::isspace(static_cast<unsigned char>(c)))
{
inWord = false;
}
else
{
if (!inWord)
{
wordCount++;
inWord = true;
}
}
}
inWord = false;
}
std::cout << "\n=== TEXT STATISTICS ===" << std::endl;
std::cout << "Lines: " << lineCount << std::endl;
std::cout << "Words: " << wordCount << std::endl;
std::cout << "Total Characters: " << totalChars << std::endl;
std::cout << "\n=== CHARACTER FREQUENCIES ===" << std::endl;
std::cout << "\nLetters:" << std::endl;
for (unsigned char ch = 'a'; ch <= 'z'; ch++)
{
unsigned char upperCh = static_cast<unsigned char>(std::toupper(ch));
int count = charFrequency[ch] + charFrequency[upperCh];
if (count > 0)
{
std::cout << static_cast<char>(ch) << ": " << count << std::endl;
}
}
std::cout << "\nDigits:" << std::endl;
for (unsigned char ch = '0'; ch <= '9'; ch++)
{
if (charFrequency[ch] > 0)
{
std::cout << static_cast<char>(ch) << ": " << charFrequency[ch] << std::endl;
}
}
std::cout << "\nSpecial Characters:" << std::endl;
for (const auto& pair : charFrequency)
{
unsigned char ch = pair.first;
if (!std::isalnum(ch))
{
std::string displayChar;
switch (ch)
{
case ' ': displayChar = "[space]"; break;
case '\t': displayChar = "[tab]"; break;
case '\n': displayChar = "[newline]"; break;
case '\r': displayChar = "[return]"; break;
default:
if (ch >= 32 && ch < 127)
{
displayChar = std::string(1, static_cast<char>(ch));
}
else
{
displayChar = "[byte:" + std::to_string(static_cast<int>(ch)) + "]";
}
break;
}
std::cout << displayChar << ": " << pair.second << std::endl;
}
}
auto end = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration<double, std::milli>(end - start);
std::cout << "Elapsed time: " << std::fixed;
std::cout.precision(3);
std::cout << elapsed.count() << " ms\n";
return 0;
}
Bir temel oluşturmak için örneği derleyip çalıştırın
SPGO'yu uygulamadan önce textCount derleyin ve ne kadar hızlı çalıştığını görmek için War and Peace gibi büyük bir metin dosyasına karşı çalıştırın (Project Gutenberg'den indirebilirsiniz). Bu adım, SPGO kullanarak iyileştirmeden önce performansı gösterir:
Oluşturmak:
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug
Çalıştır:
textCount.exe < warAndPeace.txt
Şu benzeri bir çıktı görürsünüz:
=== TEXT STATISTICS ===
Lines: 66041
Words: 566333
Total Characters: 3227531
=== CHARACTER FREQUENCIES ===
Letters:
a: 202719
...
Elapsed time: 512.000 ms
Elapsed time Değeri kaydedin. Sonuçları ölçme bölümünde SPGO için iyileştirilmiş süreyle karşılaştıracaksınız.
/spgo ile textCount oluşturma
Şimdi SPGO etkin olarak textCount oluşturun. Bu adım profil oluşturma verilerini toplamaya yönelik temel bilgileri oluşturur.
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug /spgo
Derleme tamamlandığında aşağıdaki gibi bir ileti görürsünüz:
SPD textCount.spd not found, compiling without profile guided optimizations
Bu ileti ilk /spgo derlemede görünür. Bağlayıcı SPD dosyasını oluşturur ancak hala boş olduğundan henüz herhangi bir SPGO iyileştirmesi uygulamaz. İkili dosyayı çalıştırıp profil verilerini topladıktan ve bunları SPD'ye dönüştürdükten sonra bu iletiyi görmezsiniz.
Bayrak açıklamaları:
| Flag | Amaç |
|---|---|
/Zi |
Tam hata ayıklama bilgileri oluşturun. Bu, SPGO'nun profil oluşturma örneklerini kaynak kodla eşlemesi için gereklidir. |
/EHsc |
C++ özel durum işlemesini etkinleştirme |
/GL |
Tüm program iyileştirmesi — SPGO için gereklidir. Nihai optimizasyonu bağlama zamanına bırakarak modüller arası satır içi genişletme, kod düzeni ve ölü kod eleme kararlarını etkinleştirir. |
/O2 |
Hız için optimize etme — agresif satır içi yerleştirme, döngü optimizasyonu, ölü kod kaldırma ve ilgili dönüşümleri etkinleştirir. |
/link /debug |
Xperf’in profilleme örneklerini kaynak koda eşlemek için kullandığı hata ayıklama bilgilerini (/debug) oluşturmak üzere bağlayıcıya .pdb geçirin. |
/spgo |
SPGO bağlayıcı bayrağı: SPGO meta verilerini ikili dosyaya ekler ve yürütülebilir dosyayla birlikte boş textCount.spd bir dosya oluşturur. |
Uyarı
/spgo bağlayıcı bayrağıdır. Bunu, /link /spgo komutunda cl aracılığıyla bağlayıcıya iletin.
/spgo bayrağı ikili dosyayı henüz optimize etmiyor. Onu profilleme için hazırlar. Optimizasyon, SPD gerçek çalışma zamanı verileriyle doldurulduktan sonra /spdin ile textCount’u yeniden oluşturma sırasında gerçekleşir.
Uyarı
SPD'yi belirli bir konuma yazmak için isteğe bağlı /spd:<path> bağlayıcı bayrağını ekleyin. Örneğin: /link /debug /spgo /spd:.\profiles\textCount.spd. Bu bayrağı belirtmezseniz, SPD, .exe ile birlikte oluşturulur.
Profil oluşturma yönteminizi seçin
SPGO üç profil oluşturma yöntemini destekler. Hangi yöntemi kullandığınız donanımınıza bağlıdır.
Üç profil oluşturma yöntemi
| Yöntem | Örnek kalitesi | Donanım gereksinimi | En iyi kullanım alanı |
|---|---|---|---|
| LBR (Son Dallanma Kaydı) | En yüksek— en son alınan dalların dizilerini kaydeder ve iyileştiriciye örnek başına zengin denetim akışı verileri verir | Intel Haswell (2013) veya üzeri; AMD Zen 4 (2022) veya üzeri; ARM64 ARMv9.2-A (2020) veya üzeri | En modern masaüstü donanımı |
| PMC / IP modu (Performans İzleme Sayacı/Yönerge işaretçi modu) | Iyi. CPU'nun Performans İzleme Birimi'ni (PMU) kullanarak, Windows için Olay İzleme (ETW) aracılığıyla toplanan çağrı yığınlarıyla birlikte komut işaretçisi örneklerini yakalar | PMU ile herhangi bir x64 veya ARM64 CPU | LBR desteği olmayan donanım |
| İşletim sistemi süreölçeri | Temel—zamanlayıcı tabanlı örnekler | Herhangi bir x64 veya ARM64 CPU, PMU geçişi olmayan VM'ler | VM'ler ve eski donanımlar |
PMC / IP modunda, her donanım kesintisi size yalnızca tek bir veri noktası sağlar: "kesme tetiklendiğinde CPU, 0x1A2B3C4D adresindeydi". LBR ile her kesmede, kesme tetiklenmeden önce CPU'nun izlediği son 16–32 dallanmanın bir yığınını elde edersiniz. Optimizasyon aracı daha iyi kontrol akışı verilerine sahip olur ve satır içi yerleştirme ile düzen konusunda daha iyi kararlar verebilir.
Yolunuzu algılama
Makinenizin hangi profil oluşturma yolunu desteklediğini belirlemek için aşağıdaki iki komutu çalıştırın. Bu komutlar yükseltilmiş istem gerektirmez.
1. Adım: LBR desteğini denetleyin. Bu test Intel/AMD/ARM64 üzerinde çalışır.
administrator Visual Studio geliştirici komut isteminden aşağıdakileri çalıştırın:
xperf.exe -on PMC_PROFILE -pmcprofile TotalIssues -LastBranch PmcInterrupt -setProfInt TotalIssues 2560000
xperf -stop -d lbrtest.etl
xperf -tle -i lbrtest.etl -a dumper | findstr "LBR, TimeStamp"
- Bu komut içeren
LBR, TimeStampbir satır bulursa makineniz LBR'yi destekler. LBR yolunu kullanın. - Aksi takdirde 2. Adıma geçin.
2. Adım: PMC desteği olup olmadığını denetleyin (LBR yok)
xperf.exe -pmcsources | findstr TotalIssues
- Bu komut çıktı üretirse makineniz PMC sayaçlarını destekler ancak LBR'yi desteklemez. PMC yolunu kullanın.
- Bu komut çıkış üretmiyorsa işletim sistemi zamanlayıcı yolunu kullanın.
xperf ile PMU olay koleksiyonu hakkında daha fazla bilgi için bkz. Xperf ile donanım PMU olaylarını kaydetme.
Karar tablosu
LBR, TimeStamp çıktısı |
TotalIssues çıktısı |
Yolunuz |
|---|---|---|
| Boş değil | (işaretlenmedi) | LBR |
| Boş | Boş değil | PMC |
| Boş | Boş | İşletim sistemi süreölçeri |
| ARM64 işlemci | Mevcut Değil | PMC (PMU varsa) veya işletim sistemi zamanlayıcı |
Yaklaşımınızı seçin
Algılama sonuçlarına göre LBR, PMC veya işletim sistemi zamanlayıcı yolunun kullanılıp kullanılmayeceğine karar verin. Her yol, uygun profil oluşturma verilerini toplamak için farklı xperf başlangıç parametrelerine sahiptir. Donanım özelliklerinizle eşleşen yolu izleyin.
Yolunuz:
- LBR kullanıcıları (1. Adımda LBR algılandı): LBR yoluna gidin.
- PMC kullanıcıları (2. Adımda InstructionRetired algılandı): PMC yoluna gidin (LBR yok).
- İşletim sistemi zamanlayıcı kullanıcıları (VM veya PMU içermeyen donanım): İşletim sistemi zamanlayıcı yoluna gidin.
Tüm yollar İş yükünü çalıştırın ve xperf’yi durdurun adımında yeniden birleşir.
Bu bölümdeki komutlar, Profil oluşturma yönteminizi seçin bölümünde tanımladığınız profil oluşturma yoluna bağlıdır. İzlediğiniz yola karşılık gelen alt bölümü bulun, xperf start komutunu çalıştırın ve ardından iş yükünü çalıştırmak ve xperf’i durdurmak için İş yükünü çalıştırın ve xperf’i durdurun bölümüne geçin.
⚠️ Yönetici Olarak Çalıştır:
xperfyükseltilmiş (Yönetici) bir geliştirici komut istemi gerektirir. Yükseltme olmadan döndürürxperf"failed to configure counters".
LBR yolu
LBR koleksiyonuyla başlayın xperf :
xperf -on LOADER+PROC_THREAD+PMC_PROFILE -MinBuffers 4096 -MaxBuffers 4096 -BufferSize 4096 -pmcprofile BranchInstructionRetired -LastBranch PmcInterrupt -setProfInt BranchInstructionRetired 16384
Parametre açıklaması:
| Parametre | Amaç |
|---|---|
LOADER+PROC_THREAD+PMC_PROFILE |
Çekirdek sağlayıcıları: yükleyici olayları (modül eşleme), işlem/iş parçacığı olayları (yürütme bağlamı) ve PMC profil oluşturma olayları |
-MinBuffers 4096 -MaxBuffers 4096 -BufferSize 4096 |
War and Peace'in tamamının işlendiği bir çalışma sırasında örnek kaybını önlemek için büyük halka arabellekleri |
-pmcprofile BranchInstructionRetired |
PMC olay tetikleyicisi: emekliye ayrılan her N'inci dallanma komutunda bir örnek oluştur |
-LastBranch PmcInterrupt |
LBR donanım kaydını etkinleştirir: her PMC kesintisinde donanım son dallanma kaydı yığınını yakalar |
-setProfInt BranchInstructionRetired 16384 |
Örnek aralık: 16.384 kullanımdan kaldırılacak dal yönergelerinde bir kesme tetikle |
xperf'yi başlattıktan sonra iş yükünü çalıştırmaya ve xperf'yi durdurmaya devam edin.
PMC yolu (LBR'siz)
PMC / IP modu koleksiyonuyla başlayın xperf :
xperf -on LOADER+PROC_THREAD+PMC_PROFILE+PROFILE -MinBuffers 4096 -BufferSize 4096 -pmcprofile InstructionRetired -setProfInt InstructionRetired 16384 -stackwalk profile
Parametre açıklaması:
| Parametre | Amaç |
|---|---|
LOADER+PROC_THREAD+PMC_PROFILE+PROFILE |
PROFILE (CPU örnekleme) ve PMC olayları için PMC_PROFILE ekler; ancak -LastBranch yok |
-pmcprofile InstructionRetired |
PMC olay tetikleyicisi: kullanımdan kaldırılacak yönergelerde örnek (yönerge işaretçisi modu) |
-setProfInt InstructionRetired 16384 |
Kullanımdan kaldırılacak her 16.384 yönergede bir kesme tetikle |
-stackwalk profile |
Her profil kesintisinde bir çağrı yığını yakalayarak, dallanma dizileri yerine çağrı zinciri verileri sağlayın |
LBR ile karşılaştırıldığında: -LastBranch bayrağı yoktur; InstructionRetired yerine BranchInstructionRetired kullanır. Sonuç, dallanma dizileri değil, çağrı yığınları içeren komut işaretçisi örnekleridir. Bu yol yine de iyileştirici için etkili veriler sağlar, ancak biraz daha az zengindir.
uygulamasını başlattıktan xperfsonra iş yükünü çalıştırmaya devam edin ve xperf'yi durdurun.
İşletim sistemi zamanlayıcı yolu
xperf'i işletim sistemi zamanlayıcı tabanlı örnekleme ile başlatın:
xperf -on LOADER+PROC_THREAD+PROFILE -MinBuffers 4096 -BufferSize 4096 -setProfInt Timer 1221 -stackwalk profile
Parametre açıklaması:
| Parametre | Amaç |
|---|---|
LOADER+PROC_THREAD+PROFILE |
PMC olayı yok; Yalnızca işletim sistemi zamanlayıcı kesintisi aracılığıyla CPU örnekleme |
-setProfInt Timer 1221 |
Her 1.221 zamanlayıcı darbesinde (yaklaşık 1 kHz), işletim sistemi zamanlayıcı kesmesinde tetiklenir |
-stackwalk profile |
Her zamanlayıcı kesintisinde bir çağrı yığını yakalama |
LBR ve PMC ile karşılaştırıldığında, bu yöntem donanım performans sayaçlarını kullanmaz. İşletim sistemi zamanlayıcısı, CPU etkinliğinden bağımsız olarak kabaca sabit zaman aralıklarında tetikler. Örnekler, sık çalıştırılan kodla daha zayıf ilişkilendirilse de eniyileyici için yine de yararlı denetim akışı verileri sağlar.
İş yükünü çalıştırın ve xperf'yi durdurun (tüm yollar)
xperf çalışırken, textCount öğesini Savaş ve Barış'a karşı çalıştırın:
textCount.exe < warAndPeace.txt
textCount tamamlandıktan sonra, xperf öğesini durdurun ve izleme dosyasını yazın. Profil oluşturma sırasında diğer işlemlerin çalıştırılmasına izin vermek örnek kalitesini seyreltir. En iyi sonuçlar için, iş yükünü çalıştırmadan önce gereksiz uygulamaları kapatın.
xperf -stop -d textCount.etl
xperf durdurulduktan sonra (etl dosyasının yazılması biraz zaman alabilir), textCount.etl öğesinin geçerli dizinde oluşturulduğunu doğrulayın.
ETL dosyasını SPT'ye dönüştürme
Bu adım, üç profil oluşturma yolu için de aynıdır.
Ham ETL izlemesini işlemek ve bir SPT profil dosyası oluşturmak için komutunu çalıştırın SPTAggregate.exe :
SPTAggregate.exe /binary textCount.exe /etl textCount.etl textCount.spt
Parametre açıklaması:
| Parametre | Amaç |
|---|---|
/binary textCount.exe |
Örneklerin çıkarılacağı ikili. ETL, profil oluşturma sırasında çalışan tüm işlemlerden örnekler içerebilir |
/etl textCount.etl |
ETL izleme dosyasını girin |
textCount.spt |
Çıktı SPT profil dosyası |
SPTAggregate topladığı örnek sayısını gösteren bir özet çıktısı alır. Bu özet, profil oluşturmanın işe yaradığını belirten ilk onayınızdır.
SPTAggregate çıktısını izlediğiniz yolla karşılaştırın:
- LBR yolu: Sıfırdan Farklı Kullanılan LBR Örnekleri sayısını arayın.
- PMC yolu: Sıfırdan farklı bir PMC veya yığın örnekleme sayısı arayın.
- İşletim sistemi zamanlayıcı yolu: Sıfırdan farklı kullanılan yığın örnekleri sayısını arayın.
Tüm sayımlar sıfırsa devam etmeden önce sorun giderme bölümüne bakın.
SPT dosyasını SPD'ye dönüştürme
Yolunuz:
- LBR kullanıcıları (
/mode:LBRkullanın): LBR modu- PMC kullanıcıları (
/mode:IPkullanın): IP modu (PMC ve işletim sistemi zamanlayıcısı)- OS zamanlayıcısı kullanıcıları (
/mode:IPkullanın): IP modu (PMC ve OS zamanlayıcısı)Hem PMC hem de işletim sistemi zamanlayıcısı yolları, yönerge işaretçisi örnekleri ürettikleri için
/mode:IPkullanır.
Sonraki adım, profilleme yoluna göre, özellikle de /mode öğesine geçirilen SPDConvert.exe bayrağına bağlı olarak dallanır.
LBR modu
SPDConvert.exe /mode:LBR textCount.spd textCount.spt
/mode:LBR SPT'yi LBR dal dizisi verilerini içerecek şekilde yorumlamasını söyler SPDConvert .
IP modu (PMC ve işletim sistemi zamanlayıcı)
Hem PMC hem de işletim sistemi zamanlayıcı yönerge işaretçisi örnekleri üretir, bu nedenle her ikisi de aynı dönüştürme komutunu kullanır:
SPDConvert.exe /mode:IP textCount.spd textCount.spt
/mode:IP, SPDConvert'e SPT'yi komut işaretçisi örnekleri içeriyormuş gibi yorumlamasını söyler.
Warning
Veri türünüz için yanlış modu kullanmak boş veya hatalı biçimlendirilmiş bir SPD üretebilir. LBR ile profil oluşturduysanız /mode:LBR kullanın.
PMC veya işletim sistemi zamanlayıcısıyla profilleme yaptıysanız /mode:IP kullanın.
SPTAggregate
ETL dosyasını SPT'ye dönüştür'ün özet çıktısı hangi örnek türlerinin toplandığını gösterir ve kullanılacak doğru modu onaylar.
SPDConvert komutunu çalıştırdıktan sonra, textCount.spd öğesinin geçerli dizinde oluşturulduğunu (veya güncellendiğini) onaylayın.
SPDConvert çıkışını yorumlama
SPDConvert textCount.spd textCount.spt komutu, blok kapsamının öncesi ve sonrası için bir özet yazdırır; örneğin:
Block coverage (before) : 33.90% ( 4507/ 13294)
Block coverage (after) : 45.64% ( 6067/ 13294)
Bu özet, ilişkili profil verilerine sahip ikili kod bloklarının yüzdesini gösterir. Daha yüksek bir yüzde daha iyidir. 70% üzerindeki kapsam mükemmeldir, 40% altındaki kapsam ise iyileştirme verimliliğini sınırlayabilir. Kapsam düşükse profil oluşturma iş yükünü daha uzun süre çalıştırın veya farklı iş yükleriyle ayrı çalıştırmalardan birden çok SPT dosyasını birleştirin. Örneğin, farklı kod yolları kullanmak için birden çok metin dosyası üzerinde çalıştırabilirsiniz textCount .
SPDConvert tarafından aşağıdakine benzer bir uyarı görebilirsiniz:
Compiler may be conservative on some hot functions due to sparse sample coverage.
SPGO is estimated to optimize better if sample density is increased to 5.4x of current level.
Sample density can be increased by sampling for longer period, or increasing sample rate.
Bu uyarı, profilleme çalışmanızın iyileştiricinin yoğun kullanılan tüm işlevleri güvenilir biçimde optimize etmesi için yeterli örnek toplayamadığı anlamına gelir. SPD hala kullanılabilir ancak sonuçları şu şekilde geliştirebilirsiniz:
- İş yükünü daha uzun süre çalıştırma (örneğin, 1 dakika yerine 5 veya daha fazla dakika) veya farklı iş yükleri kullanma.
- Örnekleme hızını artırmak için
-setProfIntkomutundakixperfdeğerinin düşürülmesi. Sonuç olarak, bu değişikliğin işlenmesi daha uzun süren daha büyük bir ETL dosyası oluşturur. - Ayrı profilleme çalıştırmalarından elde edilen birden çok SPT dosyasını, hepsini
SPDConvertöğesine vererek birleştirme.
SPT dosyası ikili bir biçimdir. İçeriğini incelemek için komutunu çalıştırabilirsiniz SPTDump.exe textCount.spt. Benzer şekilde, PTDump.exe textCount.spt çalıştırdıktan SPDConvertsonra derlenmiş profil verilerini gösterir. Her iki araç da devam etmeden önce sıfır olmayan örnekleri doğrulamak için kullanışlıdır.
textCount'u /spdin ile yeniden derle
Doldurulan SPD dosyasını kullanarak yeniden oluşturun textCount . Bağlayıcı profil verilerini okur ve SPGO iyileştirmeleri uygular.
Bu adım, üç profil oluşturma yolu için de aynıdır.
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug /spgo /spdin:textCount.spd
Yeni bayrak (Build textCount ile /spgo karşılaştırıldığında):
| Flag | Amaç |
|---|---|
/spdin:textCount.spd |
İyileştirme için bağlayıcıya SPD profil verilerini sağlayın |
Komut hâlâ /spgo içerir. en iyi duruma getirilmiş ikili dosyayla birlikte yeni bir SPD dosyası oluşturur ve bunu sonraki profil oluşturma yinelemeleri için başlangıç noktası olarak kullanabilirsiniz.
Warning
SPD dosyası, profilini çıkardığı belirli ikili dosyayla ilişkilendirilir.
textCount öğesini /spdin olmadan yeniden derlerseniz veya değiştirilmiş kaynaktan yeniden derlerseniz, yeni bir SPD dosyası oluşturmanız gerekir. Mevcut olan, yeni binary’nin GUID’siyle eşleşmiyor ve linker onu kullanmaz.
ile /spdinyeniden derlendikten sonra bağlayıcı, profil verileri kullanılarak kodunuzun ne kadarının iyileştirildiğine ilişkin istatistikler oluşturur. Örneğin:
221 of 221 (100.00%) profiled functions will be compiled for speed
201 of 1383 inline instances were from dead/cold paths
474 of 474 profiled functions (100.0%) were optimized using profile data
202738780 of 202738780 instructions (100.0%) were optimized using profile data
Yüksek bir yüzde, SPD'nin ikili kuyunuzu kapsadığı anlamına gelir. Yüzde düşükse (örneğin, %90'ın altındaysa), bunun nedeni ya profilleme iş yükünün ikili dosyanın yeterli bir bölümünü çalıştırmamış olması ya da profil toplandığından beri ikili dosyanın önemli ölçüde değişmiş olmasıdır. Her iki durumda da mevcut ikili dosyaya göre yeniden profilleyin.
SPGO profil verilerinizle ne yapar?
SPGO, programın denetim akışı grafiğindeki her blok ve kenardaki sayıları doldurmak için toplanan örnek verileri kullanır. Bu sayılar, şunlar gibi optimizasyonlara yön verir:
- Profil güdümlü satır içi genişletme: Soğuk yolların satır içi genişletilmesinden kaynaklanan kod şişmesini önlerken sık kullanılan çağrı noktalarını agresif biçimde satır içi genişletir.
- Sık/soğuk kod ayırma: Seyrek yürütülen kodu ikilinin ayrı bölümlerine taşıyarak yönerge önbelleği kullanımını ve sayfalama davranışını geliştirin.
- İşlev düzeni: İkili dosyada birbirini sık sık birbirine çağıran işlevleri yerleştirerek sayfa hatalarını azaltır ve yerelliği geliştirir. İyileştirilmiş işlevler ikilideki yüksek benşimli COFF grupları halinde düzenlenir.
- Boyut/hız kararları: Sık kullanılan işlevleri hız için, seyrek kullanılan işlevleri ise boyut için derleyin. Profillemede gözlenen isabetleri olmayan rutinler, hız yerine boyut için derlenebilir; bu da söz konusu seyrek çalıştırılan kod yollarında satır içi yerleştirme ve döngü açma gibi iyileştirmeleri sınırlayabilir.
- Spekülatif devirtualizasyon: Örnekleme, dolaylı bir çağrının sürekli olarak aynı fonksiyonu hedeflediğini ortaya koyduğunda, SPGO bu hedefi varsayabilir ve nadir görülen durumlar için bir geri dönüş mekanizmasıyla bunu satır içi yerleştirebilir.
Sonuçları ölçme
Yeniden çalıştırın textCount ve geçen zamanları karşılaştırın.
textCount.exe < warAndPeace.txt
Her yapılandırma için birden çok çalıştırma toplayın ve ortanca değer kullanın. tek bir çalıştırma güvenilir değildir çünkü işletim sistemi zamanlaması ve sistem gürültüsü tek tek ölçümleri çarpıtabilir.
| Yapı | Temsili geçen süre |
|---|---|
Temel (cl /Zi /EHsc /O2 /link /debug) |
(ölçümünüz) |
/spgo yapı (henüz profil bilgisi yok) |
(taban çizgisine yakın olmalıdır) |
SPGO için optimize edilmiş (/spdin) |
(iyileştirme göstermelidir) |
Bir testte, LBR yöntemini kullanan SPGO geçen sürede yaklaşık 7% azalma sundu. SPGO kazançları profil oluşturma iş yükünün tipik yürütmeyi ne kadar iyi temsil ettiğine bağlı olduğundan sonuçlarınız kendi projelerinize göre farklılık gösterebilir. Daha büyük, dal dolu kod temelleri 5-10% aralığında daha fazla gelişme görme eğilimindedir. Profil oluşturma yöntemi, iyileştirme kalitesini etkiler. LBR genellikle PMC'den daha iyi sonuçlar üretir ve bu da işletim sistemi zamanlayıcısından daha iyi sonuçlar verir. İşletim sistemi zamanlayıcı yolunu kullanıyorsanız, daha düşük kazanımlar bekleyin.
Bu öğreticide izlenen LBR yolu, üretim veritabanı kitaplığı olan SQLite projesine uygulandı. SPGO için iyileştirilmiş SQLite ikilisinde yaklaşık 7% iyileştirme gösterildi.
SPGO'yu kendi projenize uygulama
SpGO'yu kendi C veya C++ uygulamanıza uygulamak için bu denetim listesini kullanın.
Mevcut sürüm derleme komutuna ekleyin
/Zi /link /debug /spgo. Derleme betiğinizi veya proje dosyanızı değiştirin:cl /Zi /EHsc /GL /O2 myapp.cpp /link /debug /spgoTemsili bir iş yükü seçin. Uygulamanızın sık erişimli yollarını kullanan gerçek bir kullanım senaryosu seçin. Üretim benzeri verileri kullanın. Birincil profil oluşturma iş yükünüz olarak aşağıdakilerden kaçının: kod kapsamı testleri (performans sorunlarını vurgulamaz), yaygın olmayan hata yolları, başlatma ve kapatma aşamaları ve kullanım dışı kod yolları. Bu iş yükü, iyileştiriciyi besleyen profili yönlendirir.
Algılanan yolunuzu kullanarak xperf'i çalıştırın. Profil oluşturma yönteminizi seçin (LBR, PMC veya işletim sistemi zamanlayıcı) bölümünde belirlediğiniz yolu kullanın. başlatın
xperf, iş yükünü bir kez çalıştırın, durdurunxperfve ETL dosyasını yakalayın.PMC veya işletim sistemi zamanlayıcı yolu için SPTAggregate ve SPDConvert'i doğru
/modebayrakla çalıştırın. ETL'yi SPT'ye ve ardından SPD'ye dönüştürün. LBR verileri için kullanın/mode:LBR; PMC veya işletim sistemi zamanlayıcı verileri için kullanın/mode:IP./spdin:<your-spd-path>ile yeniden derleyin. Uygulamanızı doldurulmuş SPD ile derleyin:cl /Zi /EHsc /GL /O2 yourApp.cpp /link /debug /spgo /spdin:yourApp.spdÖnce ve sonra ölçün. İş yükünüzü hem optimize edilmemiş hem de SPGO ile optimize edilmiş ikili dosyalarla çalıştırın. Her yapılandırma için birden çok çalıştırmanın ortancasını toplayın. Tek bir çalıştırma, performans kıyaslaması için güvenilir değildir.
Dosyayı kaynak denetiminde depolayın
.spd..spddosyasını kaynak kodunuzla birlikte kaynak denetim sisteminize ekleyin.Geliştirici Sürümü derlemelerinde SPGO'yu etkinleştirin. Ekibinizin Release derlemelerinde, üretimde kullanılanlarla aynı SPGO ile optimize edilmiş ikili dosyaları kullanmasını sağlayın. Bu, performans regresyonlarını erken yakalamaya yardımcı olur.
Derlemelerde hata ayıklamada SPGO'yu devre dışı bırakın.
Bağlayıcının profil tamamlama istatistiklerini görüntüleyin. ile
/spgoyapılan her derlemeden sonra, profil verileri kullanılarak iyileştirilmiş profillenmiş işlevlerin yüzdesine dikkat edin. Bu değer önemli ölçüde düşerse (%90'ın altına), mevcut ikili dosyayı yeniden profilleyin. Kod değişiklikleri birikir ve SPD güncelliğini yitirebilir.
xperf kullanmaya alternatif
Profil verilerini toplamanın bir diğer yolu da Windows Performans Kaydedicisi (WPR) gibi bir örnekleme profil oluşturucu kullanmaktır. WPR, Windows 10 ve sonraki sürümlerde varsayılan olarak yüklenir.
xperf ile benzer veriler toplar. WPR'yi çağrı yığınları içeren CPU örneklerini toplayacak şekilde yapılandırabilir, ardından verileri SPTAggregate ETL gibi SPDConvert ve xperf ile işleyebileceğiniz bir ETL dosyasına aktarabilirsiniz. Profil verilerini toplamak için WPR kullanma örneği aşağıda verilmişti:
wpr -start CPU.light -filemode
textCount.exe < warAndPeace.txt
wpr -stop spgo_data.etl
WPR kullanma hakkında daha fazla bilgi için bkz. Using Windows Performance Recorder.
SPD dağıtımı
Şunları yapabilirsiniz:
-
.spddosyayı kaynak kodunuzla birlikte doğrudan sürüm denetimine ekleyin. -
.spddosyasını, ekip arkadaşlarınızla yeniden profil oluşturmadan SPGO iyileştirmeleriyle derleme yapabilmeleri için paylaşın. -
.spddosyayı ikili dosyalarınız ile birlikte sürümlenmiş yapıt (örneğin, NuGet paketi) olarak paketleyin ve hangi sürümün hangi ikili dosyaya karşılık gelen olduğunu kaydedin. -
.spdProfil oluşturma iş akışını yineleyerek dosyayı istediğiniz zaman yeniden üretin.
SPD, oluşturulduğu tam binary'ye bağlıdır. Önemli kod değişiklikleri yaptıktan sonra, yeni bir SPD oluşturmak için yeniden oluşturun.
/spdin Derleme sırasında, derleyici yeni .spd bir dosya da üretir. Bu yeni SPD'yi bir derleme çıktısı olarak kaydedin; bu, bir sonraki profilleme yinelemeniz için başlangıç noktasıdır.
Derlemeler arasında SPD bilgilerinin yeniden kullanımı
SPGO'daki "ileriye taşı" kavramı, tüm senaryolarınızın profilini sıfırdan yeniden oluşturmadan ve mevcut profil bilgilerini kaybetmeden mevcut bir SPD dosyasına profil oluşturma verileri eklemenize olanak tanır. Ayrıca eski profil verilerine ne kadar ağırlık verebileceğinizi de ayarlayabilirsiniz. Bu esneklik, zaman içinde davranış değişiklikleri olabileceğinde ve önceki senaryo çalıştırmalarından profil oluşturma bilgilerini tamamen kaybetmek istemediğinizde kullanışlıdır. Örneğin, onu çağıran uygulama geliştikçe bir DLL farklı API’lerin çağrıldığını görebilir. Hâlâ eskiden nasıl davrandığına ilişkin optimizasyonları istiyorsunuz, ancak artık bazen farklı davrandığı durumlar için optimizasyon fırsatlarını da buna dahil etmek istiyorsunuz. Eski ve yeni verileri karıştırarak profili zaman içinde geliştirebilirsiniz.
SPDConvert öğesini yeni bir SPT dosyasıyla çalıştırdığınızda, mevcut SPD dosyasının adını belirtin. Ardından, yeni SPT dosyaları eklediğinizde /retire:N'in eski profil verilerini ne kadar agresif bir şekilde arka plana iteceğini denetlemek için SPDConvert seçeneğini kullanın:
- Varsayılan (
/retire:8) daha yeni verileri daha ağır bir şekilde ağırlıklandırır. - Tüm çalıştırmalara eşit ağırlık vermek için
/retire:0kullanın. - Yalnızca en yeni verilerin sayılabilmesi için kullanın
/retire:16.
Sorun giderme
Sorununuzu bulun:
- LBR yol sorunları:LBR yol sorunları
- PMC yol sorunları:PMC yol sorunları
- İşletim sistemi zamanlayıcı sorunları:İşletim sistemi zamanlayıcı yolu sorunları
- Tüm yolları etkileyen sorunlar:Genel sorunlar
LBR yol sorunları
| Sorun | Olası neden | Düzelt |
|---|---|---|
SPTAggregate çıktısında sıfır LBR örneği |
CPU LBR'yi desteklemez veya VM LBR'yi kullanıma sunmaz |
Yolunuzu algılayın'dan algılama komutunu çalıştırın. Bir Hyper-V sanal makinesi içindeyseniz, Set-VMProcessor MyVMName -Perfmon @("pmu", "lbr") komutunu ana bilgisayarda çalıştırın. LBR kullanılamıyorsa PMC veya işletim sistemi zamanlayıcı yoluna geçin. |
İşlemci LBR'i destekler ancak SPTAggregate 0 LBR örneği gösterir |
perfcore.ini DLL kaydı tamamlanmadı |
perfcore.ini
perfcore.iniYapılandırma bölümünde kurulumu tamamlayın.
perf_lbr.dll öğesinin kayıtlı olduğundan emin olun. |
SPDConvert başarısız olur veya boş bir SPD oluşturur |
Yanlış /mode bayrak veya SPT yalnızca IP modu örnekleri içeriyor |
SPTAggregate çıktısının LBR örneklerini gösterdiğini onaylayın. Çıktıda yalnızca IP modu örnekleri gösterildiyse, öğesine /mode:IPgeçin. |
PMC yol sorunları
| Sorun | Olası neden | Düzelt |
|---|---|---|
SPTAggregate çıktısında sıfır PMC örneği |
perfcore.ini DLL kaydı yanlış |
perfcore.ini
perfcore.iniYapılandırma bölümünde kurulumu tamamlayın.
perf_spt.dll öğesinin kayıtlı olduğundan emin olun. Bu DLL olmadan, xperf hata iletisi olmadan sıfır PMC örneği üretir.CPU'nuzda kullanılabilen Performans Sayaçları kaynaklarının listesini görmek için komutunu çalıştırın xperf.exe -pmcsources . veya SPT_OP_RETIRE_INSTRSPT_OP_RETIRE_BR_INSTRgibi SPT_OP_ETW_INSTR girdileri görmüyorsanız içindeki DLL kaydı perfcore.ini eksik olabilir veya CPU'nuz PMC'yi desteklemiyor olabilir. DLL kaydını çözümleyemiyorsanız, bunun yerine işletim sistemi zamanlayıcı yolunu deneyin. |
findstr InstructionRetired çıktı döndürür ancak xperf örnek üretmez |
VM maskeli PMC sayaçları | VM'de çalışıp çalışmadığını denetleyin.
Set-VMProcessor ile Hyper-V'da PMU'yı etkinleştirin veya işletim sistemi zamanlayıcı yoluna geçin. |
SPDConvert PMC yolunda başarısız olur |
/mode:LBR kullanımı: yalnızca IP kullanan bir SPT'de |
/mode:IP konumuna geçin. |
İşletim sistemi zamanlayıcı yolu sorunları
| Sorun | Olası neden | Düzelt |
|---|---|---|
| Beklenenden daha az iyileştirme | Beklenen - İşletim sistemi zamanlayıcısı daha düşük hassasiyette | Bu normaldir. İyileştiricinin zamanlayıcı örneklerinden alınan dal akışı bilgileri LBR veya PMC'den daha azdır. Performans kazanımları daha küçüktür. Donanım destekliyorsa PMC veya LBR'ye yükseltmeyi göz önünde bulundurun. |
| Sıfır zamanlayıcı örneği |
xperf yükseltilmiş bir istemde çalıştırılamıyordu veya PROFILE sağlayıcı eksik |
Yönetici olarak çalıştırmayı onaylayın.
-stackwalk profile öğesinin xperf komutuna iletildiğini onaylayın. |
Genel sorunlar (tüm yollar)
| Sorun | Olası neden | Düzelt |
|---|---|---|
"failed to configure counters" Hata |
xperf yönetici olarak çalışmıyor |
Komut istemini Yönetici olarak yeniden başlatın ( Yönetici olarak çalıştır'a sağ tıklayın > ). xperf, donanım performans sayaçlarını yapılandırmak için yükseltilmiş ayrıcalıklar gerektirir. |
xperf bulunamadı |
xperf.exe PATH'de değil |
Windows ADK'nin yüklendiğini onaylayın.
C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\ öğesini denetleyin. Bu dizini PATH'inize ekleyin veya doğrudan xperf'i çalıştırın. |
textCount.etl oluşturulmamış |
xperf sessizce başarısız oldu | Yönetici olarak çalıştırmayı onaylayın. xperf start komutunu yeniden çalıştırın ve hata çıkışını denetleyin. |
SPTAggregate, "ikili dosya bulunamadı" hatası veriyor |
textCount.exe geçerli dizinde değil veya yol yanlış |
textCount.exe ile aynı dizinde olduğunuzu doğrulayın veya tam yolu /binary parametresine belirtin. |
| SPD dosyası oluşturulmadı |
SPDConvert Başarısız |
Boyutun textCount.spt sıfırdan farklı olup olmadığını denetleyin. İçeriğini incelemek için komutunu çalıştırın SPTDump.exe textCount.spt . |
/spdin derleme hiçbir iyileştirme üretmez |
SPD ile ikili dosya arasında GUID/age uyuşmazlığı | SPD, farklı bir textCount.exe kullanılarak oluşturuldu. Yeni bir SPD oluşturmak için geçerli derlemenin profilini yeniden oluşturun. |
/spgo üzerindeki MSVC sürüm hatası |
v14.51'den önceki MSVC araç takımı | Visual Studio Installer’ı açın, >Individual Components> bölümünde MSVC v14.51 veya sonraki bir sürümü yükleyin. Geliştirici Komut İstemi'ni yeniden açın. |
Sonraki Adımlar
Bu öğreticiyi tamamladıktan sonra SPGO'dan daha fazla bilgi edinmek için şu özellikleri keşfedin:
-
Profil harmanlama: Birden fazla iş yükü çalıştırın, her çalıştırmadan SPT dosyalarını toplayın ve bunların tümünü
SPDConvertöğesine geçirin. Karma SPD, gerçek kullanım desenlerinin tamamını yansıtır ve tek senaryolu bir profilden daha iyi iyileştirmeler üretir. Yeni SPT dosyaları eklediğinizde,/retire:Neski profil verilerini ne ölçüde önemsizleştireceğini denetlemek içinSPDConvertseçeneğini kullanın. Varsayılan (/retire:8) daha yeni verileri daha ağır bir şekilde ağırlıklandırır. Tüm çalıştırmalara eşit ağırlık vermek için/retire:0kullanın; yalnızca en yeni verilerin dikkate alınmasını sağlamak için/retire:16kullanın. - En iyi sonuçlar, temel senaryoları yoğun biçimde test eden kıyaslamalar ve mevcut olduğunda gerçek dünya verileri gibi birden çok kaynaktan alınan profillerin harmanlanmasıyla elde edilir. SPT dosyalarını tüm kaynaklardan
SPDConvertöğesine iletin. Daha fazla ağırlık vermek için bağımsız değişkenler listesinde bir SPT dosyasını tekrarlayın (örneğin,SPDConvert myapp.spd critical.spt critical.spt common.spt,critical.spt'ye görecommon.spt'e iki kat daha fazla ağırlık verir). -
Yinelemeli iyileştirme: ile
/spdinher yeniden derleme yeni bir SPD oluşturur. Çalıştırma, profilleme ve yeniden derleme döngüsünü yineleyebilirsiniz. Sonraki yinelemeler giderek azalan getiri sağlayabilir, ancak ikinci bir deneme bazen ilkinde gözden kaçan örüntüleri yakalayabilir. - Kod değişiklikleri: Önemli kaynak değişiklikleri yaptıktan sonra profil verilerini yeniden toplama. Mevcut SPD, profili oluşturulduğu ikili dosyaya bağlıdır. Önemli ölçüde yeniden oluşturulmuş ikili dosyayla eşleşmez.
-
Profil güncelliği: Bağlayıcı, her
/spdinderlemeden sonra profil verileri kullanılarak iyileştirilmiş profillenmiş işlevlerin yüzdesini bildirir. Bu yüzde önemli ölçüde düşerse, kodun profilden ayrılmış olduğunu belirten bir sinyaldir. Geçerli binary dosyayı yeniden profille.