Instruments — je vestavěný profiler v Xcode pro analýzu výkonu aplikací na iOS, macOS, tvOS a watchOS. Nástroj poskytuje sadu šablon pro měření CPU, paměti, sítě, grafiky a spotřeby energie v reálném čase. Podle Apple Developer Documentation se Instruments používá ve všech fázích vývoje — od hledání úniků paměti až po optimalizaci doby spouštění aplikace.
Hlavní body
Instruments — je systém profilování a trasování, který je součástí Xcode a je založen na technologii DTrace vyvinuté Sun Microsystems. Instruments spojuje desítky profilovacích nástrojů (šablon) v jednotném rozhraní: stačí vybrat šablonu, spustit aplikaci přes Xcode a začít sbírat data.
Architektura Instruments je postavena na modelu klient-server: agent na zařízení sbírá data a přenáší je na Mac přes USB připojení. To minimalizuje vliv profileru na výkon aplikace — Instruments pracuje převážně na straně hostitele. Podle WWDC 2022 je režie Time Profileru při vzorkovací frekvenci 1 ms nižší než 3%.
Instruments podporuje vlastní šablony — vývojář může kombinovat několik nástrojů v jedné profilovací relaci. Například současně spustit Time Profiler + Allocations + Leaks a vidět korelaci mezi špičkami CPU a alokacemi paměti. To poskytuje holistický obraz výkonu, nedostupný při izolované analýze každé komponenty.
Xcode je dodáván s 16 předinstalovanými šablonami Instruments: Time Profiler, Allocations, Leaks, Energy Log, Network, Core Animation, Metal System Trace, File Activity, System Trace a další. Každá šablona je optimalizována pro konkrétní úkol a předkonfigurována se správnými nastaveními spouštěčů a filtrů.
Time Profiler — je nejpoužívanější šablona Instruments. Funguje na základě vzorkování zásobníku volání: každých 1-10 milisekund systém zaznamená zásobník volání všech vláken aplikace. Po zastavení relace Instruments sečte vzorky a ukáže, které metody a funkce zabraly nejvíce času. Výsledek je prezentován jako Call Tree — strom volání seřazený podle Self Weight.
Klíčová metrika Time Profileru — Self Weight (čas strávený přímo v metodě, bez započtení volání podřízených metod). Právě Self Weight ukazuje, které funkce skutečně zatěžují procesor. Weight (celkový čas s podřízenými metodami) může být klamavý: metoda s vysokým Weight může jednoduše volat jinou pomalou metodu, zatímco sama je rychlá.
import UIKit
class ImageGalleryViewController: UIViewController {
// Time Profiler ukáže, že cellForItemAt má Self Weight = 40%
// uvnitř něj decodeImage zabírá 35% — to je úzké místo
func collectionView(
_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath
) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(
withReuseIdentifier: "ImageCell",
for: indexPath
) as! ImageCell
// ❌ decodeImage — úzké místo (Self Weight = 35%)
cell.imageView.image = UIImage(contentsOfFile: imagePath)
return cell
}
}
Při analýze Time Profileru věnujte pozornost metodám prováděným v com.apple.main-thread. Pokud na hlavním vlákně Self Weight překročí práh 16 ms na snímek — UI bude zpomalovat. Řešením těchto problémů je přesun dekódování obrázků, výpočtů layoutu a zpracování dat z hlavního vlákna na pozadí prostřednictvím Grand Central Dispatch (GCD).
Call Tree — je hierarchické zobrazení všech volání metod, seřazené podle Self Weight. Nejtěžší metoda v Call Tree — první řádek. Rozbalením řádku vidíte, které podřízené metody tato metoda volala a kolik času zabraly. Hledejte metody, kde Self Weight (vlastní čas) výrazně převyšuje Weight (celkový čas) — to jsou známky synchronních blokování a čekání.
Allocations — je nástroj pro monitorování všech alokací paměti aplikace. Ukazuje, které objekty, v jakém množství a s jakou celkovou velikostí jsou vytvářeny v každém okamžiku. Na rozdíl od Memory Profileru v Android Studio, Allocations podporuje Heapshot — okamžitý snímek živých objektů s možností porovnání dvou snímků.
Rozhraní Allocations se skládá ze dvou hlavních sekcí: All Allocations (souhrnná statistika podle všech typů objektů) a Call Trees (strom volání s rozpadem podle metod, které vytvářejí objekty). Pro hledání úniků použijte Heapshot Analysis: pořiďte snímek před provedením scénáře, proveďte scénář, pořiďte snímek po — a porovnejte, které nové objekty zůstaly v paměti.
Podle Apple Developer Documentation je nejčastějším vzorem úniku detekovatelným přes Allocations — nadměrné vytváření UIView a CALayer při rolování kolekcí. Pokud při každém rolování roste počet živých UIView, zatímco kolekce znovu používá buňky — někde se vytvářejí další view bez uvolňování starých. Allocations ukazuje přesný zásobník volání, kde jsou tato view vytvářena.
| Parametr | Popis | Na co se dívat |
|---|---|---|
| # Living | Počet živých objektů daného typu | Měl by být stabilní při opakování scénáře |
| # Transient | Objekty vytvořené a uvolněné za období | Prudké špičky — známka nadměrných alokací |
| Total Bytes | Celkový objem paměti daného typu | Porovnejte s celkovou dostupnou RAM zařízení |
Heapshot — je okamžitý snímek živých objektů v Allocations. Pořiďte Heapshot před provedením scénáře, proveďte scénář a pořiďte druhý Heapshot. Rozdíl mezi snímky ukáže, které objekty byly vytvořeny a nebyly uvolněny. Ideální výsledek — růst pouze dočasných objektů (Autorelease pool). Pro přesnou analýzu použijte kombinaci Allocations + Leaks v jedné relaci. Allocations ukazuje, které objekty se neuvolňují, a Leaks — proč (která silná reference je drží). Spusťte dvojitou relaci při každém podezření na únik.
Leaks — je specializovaný nástroj pro detekci úniků paměti v aplikacích pro iOS a macOS. Na rozdíl od Allocations, který pouze ukazuje alokace, Leaks aktivně skenuje haldu při hledání retain cycles — situací, kdy dva nebo více objektů vzájemně drží jeden druhého silnými referencemi.
Leaks pracuje ve spojení s Cycles & Roots — vizualizátorem grafu držení objektů. Když je únik detekován, Leaks ukáže všechny objekty v cyklu, jejich retain count a přesná pole, přes která jsou reference předávány. Vývojář se stačí podívat na graf a pochopit, kterou referenci je třeba nahradit weak.
Nástroj automaticky zvýrazňuje úniky červeným markerem na časové ose. Leaks pracuje v reálném čase: jakmile systém detekuje únik, okamžitě signalizuje vývojáři. To umožňuje opravovat problémy na místě, bez čekání na dump a následnou analýzu.
Podle WWDC 2022 je Leaks schopen detekovat i složité víceúrovňové retain cycles — například když tři nebo více objektů tvoří uzavřený řetězec silných referencí. Pro diagnostiku takových cyklů je graf Cycles & Roots nepostradatelný: vizuálně ukazuje, jak se objekty uzavírají jeden na druhý.
Každý uzel grafu je objekt, každá šipka — silná reference. Cyklus — uzavřený obrys šipek. Barva uzlu ukazuje stav: červená — unikající objekt, zelená — kořen (GC Root), šedá — zprostředkující objekt. Pro opravu úniku najděte šipku, kterou lze udělat weak bez porušení logiky — a nahraďte typ reference v kódu.
Energy Log — je šablona Instruments pro měření spotřeby energie aplikace. Sbírá data z hardwarových senzorů zařízení: zatížení CPU, stav Wi-Fi a mobilní sítě, použití GPS, displej a Bluetooth. Energy Log ukazuje, které operace v aplikaci způsobují největší spotřebu baterie, a překrývá je na graf spotřeby energie v časovém měřítku.
Nástroj klasifikuje operace podle úrovně spotřeby energie: nízká (normální práce procesoru), střední (Wi-Fi přenos), vysoká (GPS, mobilní síť, GPU). Pokud Energy Log po delší dobu ukazuje červené indikátory vysoké úrovně — aplikace vybíjí baterii na pozadí a bude uživatelem odstraněna.
Typické problémy detekované Energy Logem: WakeLock bez časového omezení (aplikace drží procesor aktivní po dokončení úkolu), Location Updates s vysokou přesností na pozadí (každých několik sekund požadavek na souřadnice), anomálie síťových relací(častá znovupřipojování k serveru). Energy Log doporučuje zaznamenávat každý takový incident a přidat podmínku pro vypnutí energeticky náročné operace.
Pro testování spotřeby energie používejte skutečné zařízení na bateriové napájení — na emulátoru jsou ukazatele spotřeby energie nesprávné. Spouštějte Energy Log společně s UI testy pro automatizaci kontroly spotřeby baterie v CI.
Spuštění Instruments z Xcode se provádí dvěma způsoby: přes menu Product → Profile (⌘I) nebo otevřením Instruments jako samostatné aplikace v Launchpadu. První způsob je pohodlnější: Xcode automaticky sestaví aplikaci v profilovacím režimu a spustí ji na připojeném zařízení s vybranou šablonou. Po zastavení relace Instruments uloží trasování do souboru s příponou .trace.
Interpretace výsledků závisí na šabloně. Pro Time Profiler se podívejte na Call Tree seřazené podle Self Weight — nejvyšší metody jsou vaše hlavní úzká místa. Pro Allocations — na # Living po cyklickém scénáři: pokud počet objektů vzrostl, hledejte únik. Pro Leaks — na červené markery a graf Cycles & Roots. Porovnávejte výsledky před a po optimalizaci — to je jediný způsob, jak potvrdit účinnost změn.
// Příkazový řádek pro Instruments v CI
// Integrace Instruments do CI/CD pipeline
import XCTest
class PerformanceTests: XCTestCase {
func testScrollPerformance() {
// Měření času rolování kolekce
measure(metrics: [XCTCPUMetric(), XCTMemoryMetric()]) {
app.scrollToBottom()
}
}
}
V CI lze Instruments spouštět z příkazového řádku pomocí xcodebuild -showBuildSettings a xcrun xctrace. To umožňuje automatizovat profilování při každém commitu a nezmeškat regresi. Pro analýzu použijte srovnání s Baseline: pokud se metrika zhoršila o 5% oproti předchozímu commitu — pipeline by se měla zastavit.
Hlavní chyby při práci s Instruments: profilování na simulátoru místo na zařízení (data CPU a GPU jsou nesprávná), sběr dat bez scénáře (výsledky jsou náhodné), ignorování Call Tree (dívání se pouze na graf, ne na konkrétní metody). Oprava těchto chyb dává 80% kvality profilování.
Často kladené otázky
Ano, Instruments plně podporuje SwiftUI. Pro analýzu výkonu UI použijte šablonu Core Animation — ukazuje rychlost vykreslování snímků a odhaluje zbytečné překreslování View. Time Profiler a Allocations také pracují se SwiftUI bez omezení.
Instruments — je univerzální profiler pro celý ekosystém Apple, pokrývající CPU, paměť, síť, grafiku a spotřebu energie. Shark — je interní analyzátor heap dump v LeakCanary, který se specializuje výhradně na hledání úniků paměti na Androidu.
Instruments není vložen do kódu aplikace — je to externí nástroj, který se připojuje k běžícímu procesu přes Xcode. Není třeba provádět žádné změny v kódu. Soubory .trace jsou pouze logy, které se nedostanou do binárního souboru.
Při standardní vzorkovací frekvenci 1 ms je režie Time Profiler nižší než 3%. V režimu přesného trasování (každé volání funkce) může režie dosáhnout 20-30%, proto se pro každodenní profilování používá vzorkování. Přesné trasování je potřeba pouze pro kritické části.
Výsledky se automaticky ukládají do souboru .trace ve složce projektu. Soubor lze otevřít na jiném Macu s Xcode pro společnou analýzu. Pro export do textového formátu použijte xcrun xctrace export --input file.trace --output result.xml.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také