Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Profile-Guided Optimization (PGO) používá data modulu runtime, aby kompilátoru pomohl lépe rozhodovat o optimalizaci. Pomocí dat profilu spouštění shromážděných z reprezentativních úloh umožňuje PGO kompilátoru provádět chytřejší rozhodnutí o vkládání, rozložení kódu a oddělení horkého a studeného kódu. Tato rozhodnutí se nedají provést pouze ze statické analýzy.
SPGO používá jiný přístup. Místo instrumentace binárního souboru a jeho spuštění prostřednictvím syntetických trénovacích scénářů používá SPGO vzorkování čítače výkonu hardwaru shromážděné z vašich binárních souborů skutečné verze. Moderní procesory poskytují možnosti vzorkování hardwaru. Tyto vzorky můžete shromažďovat se zanedbatelnou režií při běhu, takže je praktické získávat profily za běhu přímo z produkčního kódu.
Vzhledem k tomu, že profily SPGO vydávají bity místo instrumentovaných sestavení, umožňuje mnohem větší flexibilitu v tom, kde a jak shromažďujete data. Profily modulu runtime můžete shromažďovat z produkčních serverů, vývojářských počítačů, testovacích prostředí výkonu nebo jakékoli kombinace. Výsledkem je binární soubor, který efektivněji spouští horké cesty s typickým zrychlením výkonu 5 až 15% v závislosti na kvalitě dat profilu.
Další informace o optimalizaci řízené ukázkovým profilem (PGO) v MSVC a o tom, jak zlepšuje výkon pomocí profilování založeného na vzorkování, najdete v článku Představení optimalizace řízené ukázkovým profilem v MSVC.
V tomto kurzu si projdete kompletní pracovní postup SPGO: sestavíte ukázkovou aplikaci, profilujete ji pomocí xperf, připravíte data profilu a znovu sestavíte s daty profilu. Po dokončení můžete stejný proces použít u vlastních projektů.
Předpoklady
Než začnete, ujistěte se, že máte následující software a hardware.
Softwarové vybavení
- MSVC build tools for x64/x86/ARM64 v14.51 nebo novější – Nainstalujte je prostřednictvím instalačního programu Visual Studio. V části Jednotlivé komponenty vyhledejte "nástroje sestavení MSVC".
-
Windows Performance Toolkit (xperf.exe)—
xperfProfiler shromažďuje vzorkovaná data během běhu programu. Stáhněte si sadu Windows Assessment and Deployment Kit (ADK) ze stránky ADK install. Když spustíte instalační program ADK, vyberte komponentu Windows Performance Toolkit, abyste získalixperf. Nemusíte instalovat úplnou sadu ADK. - Textový soubor War and Peace – slouží jako ukázková úloha k vygenerování dat profilace. Stáhněte si ho z Project Gutenberg: https://www.gutenberg.org/ebooks/2600. Uložte ho ve svém pracovním adresáři jako soubor ve formátu prostého textu.
Požadavky na hardware
Návod nabízí tři postupy profilování. Kterou cestu použijete, závisí na vašem hardwaru. Příkazy detekce spustíte v volbě metody profilace , abyste zjistili, jakou cestu váš počítač podporuje. Prozatím tuto tabulku použijte k potvrzení, že splňujete aspoň jednu z požadavků.
| Path | Požadavek na procesor | Poznámky |
|---|---|---|
| LBR (nejlepší výsledky) | Last Branch Records (LBR) jsou čítače výkonu poskytované v procesorech Intel Haswell (4. generace Core, 2013) nebo novější; AMD Zen 4 (2022) nebo novější, ARM64 ARMv9.2-A (2020) nebo novější | Poskytuje nejlepší data o větvích. Další informace o LBR naleznete v úvodu k záznamům poslední větve. |
| PMC/IP režim (dobré výsledky) | Čítače monitorování výkonu (PMC) se podporují na jakémkoli procesoru x64 s jednotkou pro monitorování výkonu (PMU). | Pracuje na většině moderních procesorů, kde LBR není k dispozici. Další informace o PMC naleznete v tématu Zaznamenávání událostí výkonu hardwaru (PMU) a zaznamenávání událostí výkonu hardwaru (PMU) s úplnými příklady. |
| Časovač operačního systému (funguje všude) | Jakýkoli procesor x64 nebo ARM64, včetně virtuálních počítačů Azure a dalších virtuálních počítačů | Ukázky s nižší věrností, ale vždy k dispozici |
Většina vývojářů na moderním desktopovém hardwaru x64 podporuje LBR. Virtuální stroje a některá starší hardwarová zařízení mají PMC nebo časovač operačního systému.
Jak FUNGUJE SPGO
SPGO shromažďuje data profilu z vašeho spuštěného binárního souboru a při příštím sestavení je předá kompilátoru. Kompilátor tato data používá k lepšímu rozhodování o vkládání, rozložení kódu a predikci větví. Pohodlí je, že není vyžadována žádná instrumentace.
Pracovní postup je:
- Sestavte binární soubor s použitím příznaku linkeru /spgo. Tento krok vytvoří prázdnou ukázkovou databázi profilu (
.spdsoubor). - Vytvořte profil binárního souboru pomocí
xperfa vytvořte soubor trasování ETL. - Převeďte ETL na soubor SPT pomocí
SPTAggregate.exe, pak převeďte SPT na soubor SPD pomocíSPDConvert.exe. - Znovu sestavte pomocí přepínače linkeru /spdin, který odkazuje na naplněnou ukázkovou databázi profilů (SPD). Linker použije optimalizace SPGO.
Optimalizátor používá SPD k zodpovězení otázek, jako jsou: které větve se nejčastěji používají? Které funkce se volají v horkých smyčkách? Tento proces vytváří lepší rozložení kódu a vkládání rozhodnutí než samotná statická analýza.
SPGO funguje s jazykem C i C++. Pracovní postup a příznaky jsou pro oba jazyky stejné.
Nejlepší kandidáti pro SPGO: Velké aplikace v jazycích C/C++ s velkým množstvím větvení a náročnými vnitřními smyčkami. Přínosy rostou s velikostí kódové základny a složitostí větví. Malá ukázka v tomto kurzu ukazuje přibližně 7% vylepšení. Větší produkční kódové základny často zaznamenávají výraznější zlepšení.
Porovnání procesů sestavení
Tato část vysvětluje, jak SPGO zapadá do procesu sestavení, pokud chcete pochopit, jak to funguje.
Normální proces sestavení
Ve standardním buildu verze C/C++:
-
Vstupy: Soubory zdrojového kódu (
.cpp,.h) a příznaky kompilátoru v režimu vydání (/O2atd/GL.). - Proces: Kompilátor používá standardní optimalizace, jako je vložení heuristiky, předpoklady předpovědi větví a rozhodování o rozložení kódu založené na samotné statické analýze. Neobsahuje žádná data o tom, jak se program ve skutečnosti chová při spuštění.
-
Výstup: Spustitelný soubor (
.exe), soubory DLL (.dll), informace o ladění (.pdb).
Bez dat za běhu dostávají horké cesty a studené cesty podobné zacházení.
Proces sestavení s podporou SPGO
SPGO přidá data profilace jako nový vstup do kanálu buildu:
-
Vstupy: Zdrojový kód, soubor profilu
.spd(počty vzorků z běhu profilace), příznaky kompilátoru pro režim vydání,/link /spgoa/spdin:<path>pro zadání vstupního souboru SPD (pokud není zadán, jako výchozí se použije soubor .spd podle názvu binárního souboru a umístěný ve složce obj). - Proces: Linker načte SPD spolu s mezikódem. Používá data četnosti větví k lepšímu vkládání, rozložení kódu a rozhodování o řazení větví. Horké funkce jsou rozloženy pro rychlý přístup; studený kód se přesune mimo kritickou cestu.
-
Výstup: Optimalizovaný spustitelný soubor (
.exe), optimalizované soubory DLL (.dll), informace o ladění (.pdb) a nový.spdsoubor pro budoucí iterace profilace.
Klíčová myšlenka: SPGO přesouvá rozhodování o optimalizaci z heuristik kompilátoru a linkeru na rozhodnutí založená na datech z reálného běhu programu.
Klíčové příznaky
| Flag | Typ | Purpose |
|---|---|---|
/spgo |
Linker | Povolí SPGO. Vloží metadata SPGO do binárního souboru a vytvoří prázdný .spd výstupní soubor, pokud /spdin není zadán, v takovém případě se zadaný .spd soubor použije jako vstup. |
/spdin:<path> |
Linker | Vstupní SPD – poskytuje linkeru profilová data pro optimalizaci. |
/spd:<path> |
Linker | Výstupní cesta SPD – určuje, kde je nový spD zapsán (volitelné; výchozí hodnota je stejný adresář jako binární soubor). Slouží jako vstupní cesta SPD, pokud /spdin není zadána. |
/GL |
kompilátor | Optimalizace celého programu vyžadovaná pro fungování SPGO napříč jednotkami překladu |
/O1, /O2 (minimalizovat velikost, maximalizovat rychlost) |
kompilátor | Optimalizovat pro rychlost; umožňuje agresivní optimalizace, které může SPGO dále vylepšit. |
Jak se SPGO liší od PGO
PGO (optimalizace řízená profilem) vyžaduje, abyste binární soubor zkompilovali s instrumentačními příznaky (/GENPROFILE), spustili pomalejší instrumentovanou binárku, aby se shromáždily .pgc soubory s počty spuštění, a poté ji znovu slinkovali s /USEPROFILE. Kompilátor získá přesné počty spuštění, ale musíte nejprve instrumentovat kód. Další informace o tomto procesu naleznete v tématu Optimalizace s asistencí profilu.
SPGO používá čítače výkonu hardwarového procesoru ke shromažďování statistických vzorků z neinstrumentovaného binárního souboru vydané verze. Spusťte existující binární soubor, profilujte ho pomocí xperf, převeďte trasování na soubor SPD a znovu sestavte. Není potřeba instrumentované sestavení a během profilování nedochází ke zpomalení. Kompilátor získá statistická data vzorkování místo přesných počtů, což je méně přesné, ale jednodušší získat a nevyžaduje žádné změny kódu. Umožňuje také profilování systémových komponent nebo komponent v reálném čase, u nichž je obtížné shromažďovat data pomocí instrumentovaného přístupu. Můžete také profilovat konečné/expediční binární soubory.
Tento kurz se zabývá třemi metodami profilace: LBR, PMC a časovač operačního systému. Tuto metodu zvolíte v možnosti Zvolit metodu profilace. Podrobné porovnání normálního procesu sestavení oproti procesu sestavení SPGO, včetně referenční tabulky příznaků, naleznete v tématu Porovnání procesu sestavení.
Konfigurace služby perfcore.ini
⚠✔ Povinné: Bez tohoto kroku
xperfneposkytuje potřebná data profilace. Dokončete tento krok před spuštěnímxperf.
Sada Windows Performance Toolkit (WPT) používá perfcore.ini, který se nachází v umístění C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\perfcore.ini, pokud jste WPT nainstalovali do výchozího umístění, k registraci poskytovatelů DLL, které potřebuje pro SPGO.
Otevřete Windows Poznámkový blok jako správce. Pak otevřete perfcore.ini. Vyhledejte oddíl seznamu knihoven DLL a přidejte následující položky na jeden řádek:
perf_lbr.dll
perf_spt.dll
perf_hv.dll
Pokud xperf.exe není nainstalovaný, přečtěte si téma Obecné problémy s instalací.
Uložte a zavřete perfcore.ini. Soubory DLL jsou již dodávány ve stejném adresáři jako xperf.exe, takže je nemusíte nikam kopírovat. Pouze je registrujete v perfcore.ini. Ujistěte se, že xperf je ve vaší cestě.
Vytvoření ukázkové aplikace
Ukázková aplikace pro tento kurz je program C++, který čte text ze standardního vstupu a vytváří počet řádků, počet slov, celkový počet znaků, tabulku četnosti znaků a uplynulý čas zpracování souboru v milisekundách. Je napsaný v jazyce C++, ale SPGO funguje také s jazykem C. Pracovní postup je stejný pro projekty jazyka C.
Vytvořte soubor s názvem textCount.cpp v pracovním adresáři a přidejte následující zdrojový kód:
// 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;
}
Sestavit a spustit ukázku pro získání výchozího stavu
Před použitím nástroje SPGO sestavte textCount a spusťte ho s velkým textovým souborem, jako je War a Peace (můžete si ho stáhnout z Project Gutenberg), abyste viděli, jak rychle běží. Tento krok ukazuje výkon před jeho optimalizací pomocí nástroje SPGO:
Sestavení:
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug
Spustit:
textCount.exe < warAndPeace.txt
Zobrazí se výstup podobný následujícímu:
=== TEXT STATISTICS ===
Lines: 66041
Words: 566333
Total Characters: 3227531
=== CHARACTER FREQUENCIES ===
Letters:
a: 202719
...
Elapsed time: 512.000 ms
Poznamenejte si Elapsed time hodnotu. Porovnáte ho s časem optimalizovaným pro SPGO ve výsledcích měření.
Sestavit textCount pomocí /spgo
Teď sestavte textCount s povolenou funkcí SPGO. Tento krok stanoví základ pro shromažďování dat profilace.
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug /spgo
Po dokončení sestavení se zobrazí zpráva podobná této:
SPD textCount.spd not found, compiling without profile guided optimizations
Tato zpráva se zobrazí v prvním /spgo buildu. Linker vytvoří soubor SPD, ale je stále prázdný, takže ještě nepoužije žádné optimalizace SPGO. Jakmile spustíte binární soubor, shromáždíte profilová data a převedete je do SPD, tato zpráva se už nezobrazí.
Vysvětlení příznaků:
| Flag | Purpose |
|---|---|
/Zi |
Vygenerujte úplné informace o ladění. To je nezbytné k tomu, aby SPGO mohlo mapovat vzorky profilování na zdrojový kód. |
/EHsc |
Povolení zpracování výjimek C++ |
/GL |
Optimalizace celého programu – vyžadována pro SPGO. Přesouvá finální optimalizaci do fáze linkování, což umožňuje rozhodovat o vkládání funkcí napříč moduly, uspořádání kódu a odstraňování mrtvého kódu. |
/O2 |
Optimalizace pro rychlost – umožňuje agresivní vkládání, optimalizaci smyčky, odstranění mrtvého kódu a související transformace. |
/link /debug |
Předejte linkeru parametr /debug, aby vygeneroval ladicí informace (.pdb), které xperf používá k přiřazení vzorků profilování ke zdrojovému kódu. |
/spgo |
Příznak linkeru SPGO – vloží metadata SPGO do binárního souboru a vytvoří prázdný textCount.spd soubor spolu se spustitelným souborem. |
Note
/spgo je příznak linkeru. Předejte jej linkeru pomocí /link /spgo v příkazu cl.
Příznak /spgo ještě binární soubor neoptimalizuje. Připraví ho na profilaci. Optimalizace probíhá v Rebuild textCount s /spdin po naplnění SPD skutečnými běhovými daty.
Note
Pokud chcete zapsat SPD do konkrétního umístění, přidejte volitelný /spd:<path> příznak linkeru. Například: /link /debug /spgo /spd:.\profiles\textCount.spd. Pokud tento příznak vynecháte, vytvoří se spD společně s parametrem .exe.
Volba metody profilace
SPGO podporuje tři metody profilace. Jakou metodu použijete, závisí na vašem hardwaru.
Tři metody profilace
| Metoda | Ukázková kvalita | Požadavek na hardware | Nejlepší pro |
|---|---|---|---|
| LBR (záznam poslední větve) | Nejvyšší – zaznamenává sekvence nedávno provedených větvení a poskytuje tak optimalizátoru bohatá data o toku řízení pro každý vzorek | Intel Haswell (2013) nebo novější; AMD Zen 4 (2022) nebo novější; ARM64 ARMv9.2-A (2020) nebo novější | Většina moderního desktopového hardwaru |
| PMC / IP režim (Čítač sledování výkonu / Režim ukazatele instrukce) | Dobré. Zaznamenává vzorky čítače instrukcí včetně zásobníků volání pomocí jednotky sledování výkonu procesoru (PMU), shromažďované prostřednictvím Event Tracing for Windows (ETW). | Jakýkoli procesor x64 nebo ARM64 s PMU | Hardware bez podpory LBR |
| Časovač operačního systému | Základní – ukázky založené na časovači | Jakékoli procesory x64 nebo ARM64, virtuální počítače bez průchodu PMU | Virtuální počítače a starší hardware |
V režimu PMC / IP poskytuje každé přerušení hardwaru jenom jeden datový bod: "Procesor byl na adrese 0x1A2B3C4D při aktivaci přerušení". S LBR poskytuje každé přerušení záznam o posledních 16–32 větveních, která procesor provedl před vyvoláním přerušení. Optimalizátor získá lepší data toku řízení a může provádět lepší rozhodnutí o vkládání a rozložení.
Zjistěte svou cestu
Spuštěním následujících dvou příkazů určete, kterou cestu profilace váš počítač podporuje. Tyto příkazy nevyžadují výzvu se zvýšenými oprávněními.
Krok 1: Zkontrolujte podporu LBR. Tento test funguje na Intel/AMD/ARM64.
Na příkazovém řádku pro vývojáře administrator Visual Studio spusťte následující příkaz:
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"
- Pokud tento příkaz najde řádek obsahující
LBR, TimeStamp, pak váš počítač podporuje LBR. Použijte cestu LBR. - V opačném případě pokračujte krokem 2.
Krok 2: Kontrola podpory PMC (bez LBR)
xperf.exe -pmcsources | findstr TotalIssues
- Pokud tento příkaz vytvoří výstup, počítač podporuje čítače PMC, ale ne LBR. Použijte cestu PMC.
- Pokud tento příkaz nevygeneruje žádný výstup, použijte cestu časovače operačního systému.
Další informace o shromažďování událostí PMU se xperf naleznete v tématu Záznam hardwarových událostí PMU pomocí xperf.
Tabulka rozhodnutí
LBR, TimeStamp výstup |
TotalIssues výstup |
Vaše cesta |
|---|---|---|
| Není prázdné | (není zaškrtnuté) | LBR |
| Prázdné | Není prázdné | PMC (Projektová manažerská komise) |
| Prázdné | Prázdné | Časovač operačního systému |
| Procesor ARM64 | N/A | PMC (pokud je k dispozici PMU) nebo časovač operačního systému |
Volba přístupu
Na základě výsledků detekce rozhodněte, jestli se má použít cesta časovače LBR, PMC nebo OS. Každá cesta má různé xperf počáteční parametry, které shromažďují příslušná data profilace. Postupujte podle cesty, která odpovídá vašim hardwarovým možnostem.
Vaše cesta:
- Uživatelé LBR (LBR zjištěno v kroku 1): Přejděte na cestu LBR.
- Uživatelé PMC (InstructionRetired zjištěný v kroku 2): Přejděte na cestu PMC (bez LBR).
- Uživatelé časovače operačního systému (virtuální počítač nebo hardware bez PMU): Přejděte do cesty časovače operačního systému.
Všechny větve se znovu spojí v bodě Spusťte úlohu a zastavte xperf.
Příkazy v této části závisí na cestě profilace, kterou jste identifikovali v části Volba metody profilace. Najděte pododdíl, který odpovídá vašemu postupu, spusťte příkaz xperf start a potom pokračujte na Spuštění úlohy a zastavení xperf, kde spustíte úlohu a zastavíte xperf.
⚠️ Spustit jako správce:
xperfvyžaduje příkazový řádek vývojáře se zvýšenými oprávněními (správce). Bez zvýšení,xperfvrátí hodnotu"failed to configure counters".
Cesta LBR
Začněte xperf s kolekcí LBR:
xperf -on LOADER+PROC_THREAD+PMC_PROFILE -MinBuffers 4096 -MaxBuffers 4096 -BufferSize 4096 -pmcprofile BranchInstructionRetired -LastBranch PmcInterrupt -setProfInt BranchInstructionRetired 16384
Vysvětlení parametru:
| Parameter | Purpose |
|---|---|
LOADER+PROC_THREAD+PMC_PROFILE |
Poskytovatelé jádra: události zavaděče (mapování modulů), události procesů/vláken (kontext provádění) a události profilování PMC |
-MinBuffers 4096 -MaxBuffers 4096 -BufferSize 4096 |
Velké kroužkové vyrovnávací paměti, aby se zabránilo vyhozeným vzorkům během úplné války a míru |
-pmcprofile BranchInstructionRetired |
Spouštěč události PMC: vygenerovat vzorek na každou N-tou dokončenou instrukci větvení |
-LastBranch PmcInterrupt |
Povolí záznam hardwaru LBR: při každém přerušení PMC zachyťte zásobník záznamů poslední větve hardwaru. |
-setProfInt BranchInstructionRetired 16384 |
Interval vzorkování: vyvolat přerušení každých 16 384 dokončených instrukcí větvení |
Po spuštění nástroje xperf pokračujte na Spusťte úlohu a ukončete xperf.
Cesta k PMC (bez LBR)
Začněte xperf se sběrem PMC / v režimu IP:
xperf -on LOADER+PROC_THREAD+PMC_PROFILE+PROFILE -MinBuffers 4096 -BufferSize 4096 -pmcprofile InstructionRetired -setProfInt InstructionRetired 16384 -stackwalk profile
Vysvětlení parametru:
| Parameter | Purpose |
|---|---|
LOADER+PROC_THREAD+PMC_PROFILE+PROFILE |
Přidá PROFILE (vzorkování procesoru) a PMC_PROFILE pro události PMC, ne -LastBranch |
-pmcprofile InstructionRetired |
Spouštěč události PMC: vzorkování podle dokončených instrukcí (režim instrukčního ukazatele) |
-setProfInt InstructionRetired 16384 |
Vyvolat přerušení po každých 16 384 dokončených instrukcích |
-stackwalk profile |
Zachytit zásobník volání při každém přerušení profilování a poskytovat data o řetězci volání namísto sekvencí větvení. |
Ve srovnání s LBR: bez příznaku -LastBranch; používá InstructionRetired místo BranchInstructionRetired. Výsledkem jsou ukázky ukazatelů instrukcí se zásobníky volání, nikoli sekvencemi větví. Tato cesta stále poskytuje efektivní data pro optimalizátor, ale je o něco méně bohatá.
Po spuštění xperfpokračujte na Spusťte úlohu a zastavte xperf.
Cesta časovače operačního systému
Spusťte xperf s vzorkováním založeným na časovači operačního systému:
xperf -on LOADER+PROC_THREAD+PROFILE -MinBuffers 4096 -BufferSize 4096 -setProfInt Timer 1221 -stackwalk profile
Vysvětlení parametru:
| Parameter | Purpose |
|---|---|
LOADER+PROC_THREAD+PROFILE |
Žádné události PMC; vzorkování CPU pouze pomocí přerušení časovače operačního systému |
-setProfInt Timer 1221 |
Spustit při přerušení časovače operačního systému po každých 1 221 tikách časovače (přibližně 1 kHz) |
-stackwalk profile |
Zachytit zásobník volání při každém přerušení časovače |
V porovnání s LBR a PMC tato metoda nepoužívá čítače výkonu hardwaru. Časovač operačního systému se aktivuje přibližně v pevných časových intervalech bez ohledu na aktivitu procesoru. Vzorky jsou méně hustě korelovány s horkým kódem, ale přesto poskytují užitečná data toku řízení pro optimalizátor.
Spusťte úlohu a zastavte xperf (ve všech cestách)
Se spuštěným xperf spusťte textCount na Vojnu a mír:
textCount.exe < warAndPeace.txt
Po dokončení textCount zastavte xperf a uložte trasovací soubor. Povolení běhu dalších procesů během profilace snižuje kvalitu vzorků. Nejlepších výsledků dosáhnete tak, že před spuštěním úlohy zavřete nepotřebné aplikace.
xperf -stop -d textCount.etl
Po zastavení xperf (zápis souboru etl může chvíli trvat), ověřte, že textCount.etl byl vytvořen v aktuálním adresáři.
Převod souboru ETL na SPT
Tento krok je stejný pro všechny tři cesty profilace.
Spusťte SPTAggregate.exe ke zpracování nezpracované trasy ETL a vytvoření souboru profilu SPT:
SPTAggregate.exe /binary textCount.exe /etl textCount.etl textCount.spt
Vysvětlení parametru:
| Parameter | Purpose |
|---|---|
/binary textCount.exe |
Binární soubor pro extrakci vzorků z. EtL může obsahovat vzorky ze všech procesů, které se spustily během profilace. |
/etl textCount.etl |
Vstupní trasovací soubor ETL |
textCount.spt |
Výstupní soubor profilu SPT |
SPTAggregate zobrazí souhrn, který ukazuje, kolik vzorků se shromáždilo. Tento souhrn je vaším prvním potvrzením, že profilace fungovala.
Porovnejte výstup z SPTAggregate s postupem, který jste zvolili:
- Cesta LBR: Vyhledejte nenulový počet použitých vzorků LBR.
- Cesta PMC: Vyhledejte nenulový počet vzorků PMC nebo zásobníku.
- Cesta časovače operačního systému: Vyhledejte nenulový počet použitých vzorků zásobníku.
Pokud jsou všechny počty nulové, než budete pokračovat, přečtěte si téma Řešení potíží .
Převod souboru SPT na SPD
Vaše cesta:
- Uživatelé LBR (používají
/mode:LBR): režim LBR- Uživatelé PMC (používají
/mode:IP): režim IP (PMC a časovač operačního systému)- Uživatelé časovače operačního systému (používají
/mode:IP): režim IP (PMC a časovač operačního systému)Časovací cesty PMC i OS používají
/mode:IP, protože obě vytvářejí vzorky ukazatele instrukcí.
Další krok se větví podle cesty profilování, konkrétně podle příznaku /mode, který se předává do SPDConvert.exe.
Režim LBR
SPDConvert.exe /mode:LBR textCount.spd textCount.spt
/mode:LBR říká SPDConvert, aby interpretoval SPT jako objekt obsahující data o sekvenci větví LBR.
Režim IP (PMC a časovač operačního systému)
Oba časovače PMC i OS vytvářejí ukázky ukazatelů instrukcí, takže oba používají stejný příkaz převodu:
SPDConvert.exe /mode:IP textCount.spd textCount.spt
/mode:IP říká SPDConvert , že interpretuje SPT jako obsahující ukázky instrukčního ukazatele.
Warning
Použití nesprávného režimu pro váš datový typ může vést k prázdnému nebo chybně formátovanému SPD. Pokud jste profilovali pomocí LBR, použijte /mode:LBR.
Pokud jste profilovali pomocí PMC nebo časovače OS, použijte /mode:IP. Souhrnný SPTAggregate výstup ze souboru Convert the ETL to SPT (Převést soubor ETL na SPT ) ukazuje, které ukázkové typy byly shromážděny, a potvrdí správný režim, který se má použít.
Po spuštění SPDConvertpotvrďte vytvoření textCount.spd (nebo aktualizaci) v aktuálním adresáři.
Interpretace výstupu SPDConvert
Příkaz SPDConvert textCount.spd textCount.spt vypíše souhrn pokrytí bloku před a po, například:
Block coverage (before) : 33.90% ( 4507/ 13294)
Block coverage (after) : 45.64% ( 6067/ 13294)
Tento souhrn ukazuje procento bloků kódu binárního souboru, které mají přidružená data profilu. Vyšší procento je lepší. Pokrytí nad 70% je vynikající, zatímco pokrytí nižší než 40% může omezit efektivitu optimalizace. Pokud je pokrytí nízké, spusťte profilační úlohu déle nebo zkombinujte několik souborů SPT ze samostatných spuštění s různými úlohami. Můžete například spustit textCount s více textovými soubory, abyste mohli uplatnit různé cesty kódu.
Může se zobrazit upozornění od SPDConvert, například následující:
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.
Toto upozornění znamená, že váš běh profilace neshromáždil dostatek vzorků, aby optimalizátor mohl spolehlivě optimalizovat všechny nejvytíženější funkce. SpD je stále použitelný, ale výsledky můžete vylepšit takto:
- Spouštění zátěže po delší dobu (například 5 minut nebo déle místo 1 minuty) nebo použití jiné zátěže.
- Snížením
-setProfInthodnoty vxperfpříkazu zvýšíte vzorkovací frekvenci. Nevýhodou je, že tato změna vede k vytvoření většího souboru ETL, jehož zpracování trvá déle. - Sloučení více souborů SPT ze samostatných běhů profilování jejich předáním všech do
SPDConvert.
Soubor SPT je binární formát. Chcete-li zkontrolovat jeho obsah, můžete spustit SPTDump.exe textCount.spt. Podobně se PTDump.exe textCount.spt po spuštění SPDConvertzobrazí zkompilovaná data profilu . Oba nástroje jsou užitečné pro ověření nenulových vzorků před pokračováním.
Znovu sestavit textCount pomocí /spdin
Znovu sestavte textCount pomocí naplněného souboru SPD. Linker načte profilová data a aplikuje optimalizace SPGO.
Tento krok je stejný pro všechny tři cesty profilace.
cl /Zi /EHsc /GL /O2 textCount.cpp /link /debug /spgo /spdin:textCount.spd
Nový příznak (v porovnání s Build textCount s parametrem /spgo):
| Flag | Purpose |
|---|---|
/spdin:textCount.spd |
Poskytněte linkeru data profilu SPD k optimalizaci. |
Příkaz stále obsahuje /spgo. Vygeneruje nový soubor SPD společně s optimalizovaným binárním souborem, který můžete použít jako výchozí bod pro následné iterace profilace.
Warning
Soubor SPD je přidružen k přesnému binárnímu souboru, na který se profiluje. Pokud znovu sestavíte textCount bez /spdin nebo jej znovu sestavíte ze změněného zdroje, musíte vygenerovat nový soubor SPD. Stávající neodpovídá identifikátoru GUID nového binárního souboru a linker ho nebude používat.
Po opětovném sestavení pomocí /spdin linker vypíše statistiky o tom, jak velká část kódu byla optimalizována pomocí údajů profilu. Příklad:
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
Vysoké procento znamená, že SPD dobře pokrývá váš binární soubor. Pokud je procento nízké (například pod 90%), buď úloha profilace nevyužela dostatek binárního souboru, nebo se binární soubor od shromáždění profilu výrazně změnil. V obou případech znovu vytvořte profil na základě aktuální binární verze.
Co SPGO dělá s vašimi profilovými daty
SPGO používá shromážděná data vzorkování k doplnění počtů v jednotlivých blocích a hranách v grafu toku řízení programu. Tyto počty slouží jako podklad pro optimalizace, například:
- Profilově řízený inlining: Agresivně vkládá frekventovaná místa volání a zároveň zabraňuje nabobtnání kódu v důsledku inliningu zřídka používaných cest.
- Oddělení horkého a studeného kódu: Přesuňte zřídka spuštěný kód do samostatných částí binárního souboru, což zlepšuje využití mezipaměti instrukcí a chování stránkování.
- Rozložení funkcí: Umístěte funkce, které se navzájem často volají, blízko sebe v binárním souboru, čímž snížíte počet výpadků stránek a zlepšíte lokalitu. Optimalizované funkce jsou v binárním souboru seskupeny do skupin COFF s vysokou afinitou.
- Volba mezi velikostí a rychlostí: Kompilujte často volané funkce s ohledem na rychlost a málo volané funkce s ohledem na velikost. Rutiny bez zaznamenaných zásahů v profilovacích datech mohou být kompilovány s ohledem na velikost spíše než na rychlost, což omezuje optimalizace, jako je vkládání funkcí a rozbalování smyček, v těchto málo využívaných cestách kódu.
- Spekulativní devirtualizace: Když vzorkování odhalí, že nepřímé volání opakovaně směřuje na stejnou funkci, může SPGO tento cíl předpokládat a vložit ji přímo do místa volání se záložní variantou pro méně obvyklý případ.
Měření výsledků
Spusťte textCount znovu a porovnejte uplynulé časy.
textCount.exe < warAndPeace.txt
Pro každou konfiguraci proveďte několik běhů a použijte medián. Jedno spuštění není spolehlivé, protože plánování operačního systému a šum systému můžou zkosit jednotlivá měření.
| Sestavení | Orientační uplynulý čas |
|---|---|
Základní plán (cl /Zi /EHsc /O2 /link /debug) |
(vaše měření) |
/spgo sestavení (zatím žádná data profilu) |
(mělo by to být blízko výchozí hodnotě) |
Optimalizované pro SPGO (/spdin) |
(mělo by se zobrazit zlepšení) |
Při jednom testu přineslo SPGO využívající metodu LBR přibližně 7 % zkrácení doby běhu. Vaše výsledky se mohou u vašich projektů lišit, protože přínosy SPGO závisí na tom, jak dobře profilovací zátěž odpovídá typickému běhu. Větší kódové základny s mnoha větvemi obvykle vykazují větší zlepšení v rozmezí 5–10 %. Metoda profilace ovlivňuje kvalitu optimalizace. LBR obvykle vytváří lepší výsledky než PMC, což vede k lepším výsledkům než časovač operačního systému. Pokud používáte cestu časovače operačního systému, počítejte s menšími zisky.
Cesta LBR, kterou jste použili v tomto kurzu, se použila na projekt SQLite , což je produkční knihovna databází. Binární soubor SQLite optimalizovaný pro SPGO ukázal přibližně 7% zlepšení.
Použití SPGO na vlastní projekt
Tento kontrolní seznam použijte k použití nástroje SPGO pro vlastní aplikaci jazyka C nebo C++.
Přidejte
/Zi /link /debug /spgodo svého stávajícího příkazu pro sestavení produkční verze. Upravte skript sestavení nebo soubor projektu:cl /Zi /EHsc /GL /O2 myapp.cpp /link /debug /spgoZvolte reprezentativní úlohu. Vyberte skutečný scénář použití, který pokrývá nejčastěji používané cesty vaší aplikace. Používejte data podobná produkčnímu prostředí. Jako primární úlohu profilace nepoužívejte následující kroky: testy pokrytí kódu (nezvýrazní kritické body výkonu), neobvyklé cesty k chybám, fáze spuštění a vypnutí a zastaralé cesty kódu. Tato úloha řídí profil, který podává optimalizátor.
Spusťte xperf pomocí zjištěné cesty. Použijte cestu, kterou jste identifikovali v části Zvolte metodu profilace (LBR, PMC nebo časovač operačního systému). Spusťte
xperf, proveďte zatížení jednou, zastavtexperfa zaznamenejte soubor ETL.Pro cestu časovače PMC nebo OS spusťte SPTAggregate a SPDConvert se správným
/modepříznakem. Převeďte ETL na SPT a pak na SPD. Pro data LBR se používá/mode:LBR; pro data z časovače PMC nebo OS se používá/mode:IP.Znovu sestavte pomocí
/spdin:<your-spd-path>. Zkompilujte aplikaci s vyplněným SPD:cl /Zi /EHsc /GL /O2 yourApp.cpp /link /debug /spgo /spdin:yourApp.spdMěření před a po. Spusťte úlohu s neoptimalizovanými i optimalizovanými binárními soubory SPGO. Zaznamenejte medián z více spuštění pro každou konfiguraci. Jedno spuštění není spolehlivé pro srovnávací testy.
Uložte soubor
.spddo správy verzí..spdZkontrolujte soubor v systému správy zdrojového kódu spolu se zdrojovým kódem.Povolte SPGO v buildech vydaných verzí pro vývojáře. Nastavte, aby buildy typu Release vašeho týmu používaly stejné binární soubory optimalizované pomocí SPGO jako v produkci. To pomáhá včas zachytit regrese výkonu.
Zakažte SPGO v buildech ladění.
Podívejte se na statistiku úplnosti profilu linkeru. Po každém sestavení pomocí
/spgopoznamenejte procento profilovaných funkcí optimalizovaných na základě profilovacích dat. Pokud tato hodnota výrazně klesne (pod 90 %), znovu profilujte aktuální binární soubor. Změny v kódu se hromadí a SPD může zastarat.
Alternativa k použití xperf
Dalším způsobem shromažďování dat profilu je použití profileru vzorkování, jako je Windows Performance Recorder (WPR). WPR se ve výchozím nastavení instaluje na Windows 10 a novějších verzích. Shromažďuje podobná data jako xperf. WPR můžete nakonfigurovat tak, aby shromažďoval vzorky CPU včetně zásobníků volání, a potom exportovat data do souboru ETL, který můžete zpracovat pomocí SPTAggregate a SPDConvert, podobně jako ETL xperf. Tady je příklad použití WPR ke shromažďování dat profilu:
wpr -start CPU.light -filemode
textCount.exe < warAndPeace.txt
wpr -stop spgo_data.etl
Další informace o používání WPR najdete v tématu Using Windows Performance Recorder.
Rozložení SPD
Můžete provádět následující:
- Zařaďte soubor
.spdpřímo do systému správy zdrojového kódu spolu se svým zdrojovým kódem. - Sdílejte soubor
.spds členy týmu, aby mohli sestavovat s optimalizacemi SPGO bez opětovného profilování. - Zabalte soubor
.spdspolu s vašimi binárními soubory jako verzovaný artefakt (například balíček NuGet) a zaznamenejte, která verze odpovídá kterému binárnímu souboru. - Znovu vygenerujte
.spdsoubor kdykoli opakováním pracovního postupu profilace.
SPD je vázáno na přesný binární soubor, ze kterého bylo sestaveno. Po významných změnách kódu znovu vygenerujte novou aktualizaci SPD.
/spdin Během sestavení kompilátor vytvoří také nový .spd soubor. Uložte tento nový soubor SPD jako artefakt buildu – bude výchozím bodem pro další iteraci profilace.
Opětovné použití informací SPD v různých buildech
Koncept „carry forward“ v SPGO umožňuje přidat profilovací data do existujícího souboru SPD, aniž byste museli znovu profilovat všechny své scénáře od začátku a aniž by došlo ke ztrátě stávajících profilových informací. Můžete také upravit, jakou váhu chcete dát starším datům profilu. Tato flexibilita je užitečná, pokud může v průběhu času docházet ke změnám v chování a nechcete úplně ztratit profilovací informace z dřívějších běhů scénářů. Například může u knihovny DLL docházet k volání různých rozhraní API s tím, jak se vyvíjí aplikace, která ji volá. Stále chcete využít optimalizace vycházející z toho, jak se to dříve chovalo, ale zároveň je chcete zkombinovat s možnostmi optimalizace pro případy, kdy se to teď někdy chová jinak. Profil můžete v průběhu času vyvíjet kombinováním starých a nových dat.
Když spustíte SPDConvert s novým souborem SPT, zadejte název existujícího souboru SPD. Poté pomocí možnosti /retire:N nastavte, jak výrazně SPDConvert snižuje váhu starších dat profilu při přidání nových souborů SPT:
- Výchozí (
/retire:8) váží novější data výrazněji. - Slouží
/retire:0k poskytnutí stejné váhy pro všechna spuštění. - Použijte
/retire:16, aby se započítávala pouze nejnovější data.
Troubleshooting
Najděte svůj problém:
- Problémy s cestou LBR:Problémy s cestou LBR
- Problémy s cestou PMC:Problémy s cestou PMC
- Problémy s časovačem operačního systému:Problémy s cestou časovače operačního systému
- Problémy ovlivňující všechny cesty:Obecné problémy
Problémy s cestou LBR
| Problém | Pravděpodobná příčina | Oprava |
|---|---|---|
Žádné vzorky LBR ve výstupu SPTAggregate |
Procesor nepodporuje LBR nebo virtuální počítač nezpřístupňuje LBR | Spusťte příkaz detekce z příkazu Zjistit vaši cestu. Pokud jste ve virtuálním počítači Hyper-V, spusťte na hostiteli Set-VMProcessor MyVMName -Perfmon @("pmu", "lbr"). Pokud není LBR k dispozici, přepněte na režim časovače PMC nebo OS. |
Procesor podporuje LBR, ale SPTAggregate ukazuje 0 vzorků LBR. |
perfcore.ini Nekompletní registrace knihovny DLL |
perfcore.ini Dokončete konfiguraci v části Konfigurace perfcore.ini. Ujistěte se, že je perf_lbr.dll zaregistrován. |
SPDConvert selže nebo vytvoří prázdné SPD. |
Chybný /mode příznak nebo SPT obsahuje pouze ukázky režimu PROTOKOLU IP. |
Potvrďte, že výstup SPTAggregate zobrazil vzorky LBR. Pokud výstup zobrazuje pouze ukázky režimu PROTOKOLU IP, přepněte na /mode:IP. |
Problémy s cestou PMC
| Problém | Pravděpodobná příčina | Oprava |
|---|---|---|
Žádné vzorky PMC ve výstupu SPTAggregate |
perfcore.ini Nesprávná registrace knihovny DLL |
perfcore.ini Dokončete konfiguraci v části Konfigurace perfcore.ini. Ujistěte se, že je perf_spt.dll zaregistrován. Bez této knihovny DLL xperf nevytváří žádné vzorky PMC, aniž by se zobrazila chybová zpráva.Spuštěním xperf.exe -pmcsources zobrazíte seznam zdrojů čítačů výkonu dostupných na vašem procesoru. Pokud nevidíte položky jako SPT_OP_RETIRE_INSTR nebo SPT_OP_RETIRE_BR_INSTRSPT_OP_ETW_INSTR, může být registrace perfcore.ini knihovny DLL neúplná nebo váš procesor nemusí podporovat PMC. Pokud se vám nepodaří vyřešit problém s registrací knihovny DLL, zkuste místo toho použít časovač operačního systému. |
findstr InstructionRetired vrátí výstup, ale xperf nevygeneruje žádné vzorky. |
Maskování PMC čítačů VM | Zkontrolujte, jestli běží na virtuálním počítači. Povolte PMU v Hyper-V pomocí Set-VMProcessor nebo přepněte na cestu časovače operačního systému. |
SPDConvert selhání v cestě PMC |
Použití /mode:LBR v SPT pouze s IP adresou |
Přepněte na /mode:IP. |
Problémy s dráhou časovače operačního systému
| Problém | Pravděpodobná příčina | Oprava |
|---|---|---|
| Menší zlepšení, než se čekalo | Očekává se – časovač operačního systému má nižší přesnost. | To je v pořádku. Optimalizátor má z vzorků časovače méně informací o průběhu větvení než z LBR nebo PMC. Zvýšení výkonu je menší. Pokud hardware podporuje, zvažte upgrade na PMC nebo LBR. |
| Ukázky nulového časovače |
xperf nebyl spuštěn ve zvýšeném příkazovém řádku nebo chybí zprostředkovatel PROFILE |
Potvrďte spuštění jako správce. Potvrďte, že příkazu -stackwalk profile byl předán parametr xperf. |
Obecné problémy (všechny cesty)
| Problém | Pravděpodobná příčina | Oprava |
|---|---|---|
"failed to configure counters" Chyba |
xperf není spuštěn jako správce |
Restartujte příkazový řádek jako správce (klikněte pravým tlačítkem na Spustit > jako správce). Xperf vyžaduje zvýšená oprávnění ke konfiguraci čítačů výkonu hardwaru. |
xperf nenalezena |
xperf.exe není na CESTĚ |
Ověřte, že je nainstalovaná sada Windows ADK. Zkontrolujte C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\. Přidejte tento adresář do proměnné PATH nebo z něj přímo spusťte xperf. |
textCount.etl nebyl vytvořen |
xperf selhal bez chybového hlášení | Potvrďte spuštění jako správce. Spusťte znovu příkaz xperf start a zkontrolujte výstup chyby. |
SPTAggregate selže s chybou „binary not found“ |
textCount.exe není v aktuálním adresáři nebo v nesprávné cestě |
Ověřte, že jste ve stejném adresáři jako textCount.exenebo zadejte úplnou cestu k parametru /binary . |
| Nevytvořil se soubor SPD |
SPDConvert Se nezdařilo |
Zkontrolujte, jestli textCount.spt je velikost nenulová. Spusťte SPTDump.exe textCount.spt, chcete-li zkontrolovat jeho obsah. |
/spdin sestavení nevygeneruje žádné vylepšení. |
Neshoda GUID a věku mezi SPD a binárním souborem | SPD byla sestavena z jiného textCount.exe. Znovu analyzujte aktuální sestavení a vygenerujte nové SPD. |
Chyba verze MSVC na /spgo |
Sada nástrojů MSVC starší než verze 14.51 | Otevřete instalační program Visual Studio >Individual Components> nainstalujte MSVC v14.51 nebo novější. Znovu otevřete příkazový řádek pro vývojáře. |
Další kroky
Po dokončení tohoto kurzu se seznamte s těmito funkcemi, abyste ze SPGO získali více:
-
Kombinování profilů: Spusťte více úloh, shromažďujte soubory SPT z jednotlivých spuštění a předejte je všechny do
SPDConvert. Blended SPD odráží celou řadu skutečných vzorů využití a vytváří lepší optimalizace než profil s jedním scénářem. Pomocí možnosti/retire:Nmůžete řídit, jak agresivněSPDConvertpotlačuje význam starších dat profilu při přidávání nových souborů SPT. Výchozí (/retire:8) váží novější data výrazněji. Použijte/retire:0, aby všechna spuštění měla stejnou váhu; použijte/retire:16, aby se započítávala pouze nejnovější data. - Nejlepších výsledků se dosahuje kombinací profilů z více zdrojů, například ze srovnávacích testů, které zatěžují klíčové scénáře, a z dat z reálného provozu (pokud jsou k dispozici). Předejte soubory SPT ze všech zdrojů do
SPDConvert. Opakujte soubor SPT v seznamu argumentů, aby měl větší váhu (napříkladSPDConvert myapp.spd critical.spt critical.spt common.sptmá dvakrát větší váhu nežcritical.spt). -
Iterativní optimalizace: Každé opětovné sestavení pomocí
/spdinvytvoří nové SPD. Můžete opakovat cyklus spuštění, profilování a opětovného sestavení. Pozdější iterace mohou vykazovat klesající přínosy, ale druhý průchod může někdy odhalit vzorce, které ten první přehlédl. - Změny kódu: Po významných změnách zdrojového kódu znovu shromážděte data profilu. Stávající SPD je vázáno na binární soubor, vůči němuž bylo profilováno. Nebude se shodovat s podstatně znovu sestaveným binárním souborem.
-
Aktuálnost profilu: Linker hlásí procento profilovaných funkcí optimalizovaných pomocí dat profilu po každém
/spdinsestavení. Pokud se toto procento výrazně sníží, je to signál, že se kód od profilu odlišil. Znovu zprofilujte aktuální binární soubor.