Instruments — iOS, macOS, tvOS və watchOS üçün tətbiqlərin performansını analiz etmək üçün Xcode-a daxil edilmiş profilerdir. Alət CPU, yaddaş, şəbəkə, qrafika və enerji istehlakını real vaxtda ölçmək üçün şablonlar dəsti təqdim edir. Apple Developer Documentation-ya görə, Instruments inkişafın bütün mərhələlərində istifadə olunur — sızıntıların axtarışından tətbiqin başlanma vaxtının optimallaşdırılmasına qədər.
Əsas
Instruments — Xcode-un tərkib hissəsi olan və Sun Microsystems tərəfindən hazırlanmış DTrace texnologiyasına əsaslanan profilləşdirmə və izləmə sistemidir. Instruments onlarla profilləşdirmə alətini (şablonu) vahid interfeysdə birləşdirir: sadəcə şablon seçmək, tətbiqi Xcode vasitəsilə işə salmaq və məlumat toplamağa başlamaq kifayətdir.
Instruments-in arxitekturası müştəri-server modelinə əsaslanır: cihazdakı agent məlumatları toplayır və USB bağlantısı vasitəsilə Mac-a ötürür. Bu, profilerin tətbiqin performansına təsirini minimuma endirir — Instruments əsasən host tərəfində işləyir. WWDC 2022-yə görə, 1 ms seçmə tezliyində Time Profiler-in yükü 3%-dən azdır.
Instruments xüsusi şablonları dəstəkləyir — tərtibatçı bir profilləşdirmə seansında bir neçə aləti birləşdirə bilər. Məsələn, eyni vaxtda Time Profiler + Allocations + Leaks işə salmaq və CPU pikləri ilə yaddaş ayırmaları arasında korrelyasiyanı görmək. Bu, hər bir komponentin təcrid olunmuş analizində mümkün olmayan vahid performans mənzərəsini verir.
Xcode 16 əvvəlcədən quraşdırılmış Instruments şablonu ilə gəlir: Time Profiler, Allocations, Leaks, Energy Log, Network, Core Animation, Metal System Trace, File Activity, System Trace və digərləri. Hər bir şablon müəyyən bir tapşırıq üçün optimallaşdırılıb və müvafiq trigger və filtr parametrləri ilə əvvəlcədən konfiqurasiya olunub.
Time Profiler — ən çox istifadə olunan Instruments şablonudur. O, çağırış yığınının seçilməsi əsasında işləyir: hər 1-10 millisaniyədən bir sistem tətbiqin bütün thread-lərinin çağırış yığınını qeyd edir. Seans dayandırıldıqdan sonra Instruments nümunələri cəmləyir və hansı metod və funksiyaların daha çox vaxt apardığını göstərir. Nəticə Self Weight-ə görə sıralanmış Call Tree — çağırışlar ağacı şəklində təqdim olunur.
Time Profiler-in əsas metriki — Self Weight (metodda birbaşa sərf olunan vaxt, uşaq metodların çağırışları istisna olmaqla). Məhz Self Weight göstərir ki, hansı funksiyalar prosessoru həqiqətən yükləyir. Weight (uşaq metodlarla ümumi vaxt) aldadıcı ola bilər: yüksək Weight olan metod sadəcə başqa yavaş metodu çağıra bilər, özü isə sürətli ola bilər.
import UIKit
class ImageGalleryViewController: UIViewController {
// Time Profiler göstərəcək ki, cellForItemAt Self Weight = 40% var
// onun içərisində decodeImage 35% tutur — bu dar boğazdır
func collectionView(
_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath
) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(
withReuseIdentifier: "ImageCell",
for: indexPath
) as! ImageCell
// ❌ decodeImage — dar boğaz (Self Weight = 35%)
cell.imageView.image = UIImage(contentsOfFile: imagePath)
return cell
}
}
Time Profiler analizində com.apple.main-thread-də icra olunan metodlara diqqət yetirin. Əgər əsas thread-də Self Weight kadr başına 16 ms həddini keçərsə — UI ləngiyəcək. Belə problemlərin həlli — şəkillərin dekodlanması, layout hesablamaları və məlumat emalının əsas thread-dən Grand Central Dispatch (GCD) vasitəsilə fon thread-lərinə köçürülməsidir.
Call Tree — Self Weight-ə görə sıralanmış bütün metod çağırışlarının iyerarxik təsviridir. Call Tree-də ən ağır metod — birinci sətirdir. Sətri genişləndirərək, bu metodun hansı uşaq metodları çağırdığını və onların nə qədər vaxt apardığını görürsünüz. Self Weight-in (öz vaxtı) Weight-dən (ümumi vaxt) əhəmiyyətli dərəcədə çox olduğu metodları axtarın — bu sinxron blokadaların və gözləmənin əlamətidir.
Allocations — tətbiqin bütün yaddaş ayırmalarını izləmək üçün alətdir. Hansı obyektlərin, hansı miqdarda və hansı ümumi ölçüdə hər an yaradıldığını göstərir. Android Studio-dakı Memory Profiler-dən fərqli olaraq, Allocations Heapshot — iki şəkli müqayisə etmək imkanı ilə canlı obyektlərin anlıq şəklini dəstəkləyir.
Allocations interfeysi iki əsas bölmədən ibarətdir: All Allocations (bütün obyekt növləri üzrə ümumi statistika) və Call Trees (obyektləri yaradan metodlar üzrə bölgü ilə çağırışlar ağacı). Sızıntıları tapmaq üçün Heapshot Analysis-dən istifadə edin: ssenarini icra etməzdən əvvəl şəkil çəkin, ssenarini icra edin, sonra şəkil çəkin — və hansı yeni obyektlərin yaddaşda qaldığını müqayisə edin.
Apple Developer Documentation-ya görə, Allocations vasitəsilə aşkar edilən ən geniş yayılmış sızıntı nümunəsi — kolleksiyaların sürüşdürülməsi zamanı UIView və CALayer-in həddindən artıq yaradılmasıdır. Əgər hər sürüşdürmədə canlı UIView-lərin sayı artırsa, kolleksiya isə hüceyrələri təkrar istifadə edirsə — hardasa köhnələri azad etmədən əlavə view-lər yaradılır. Allocations bu view-lərin harada yaradıldığını dəqiq çağırış yığınını göstərir.
| Parametr | Təsvir | Nəyə baxmaq |
|---|---|---|
| # Living | Bu tip canlı obyektlərin sayı | Ssenari təkrarlandıqda sabit olmalıdır |
| # Transient | Dövr ərzində yaradılmış və azad edilmiş obyektlər | Kəskin artımlar — həddindən artıq ayırmaların əlaməti |
| Total Bytes | Bu tip yaddaşın ümumi həcmi | Cihazın ümumi mövcud RAM-ı ilə müqayisə edin |
Heapshot — Allocations-da canlı obyektlərin anlıq şəklidir. Ssenarini icra etməzdən əvvəl Heapshot çəkin, ssenarini icra edin və ikinci Heapshot çəkin. Şəkillər arasındakı fərq hansı obyektlərin yaradıldığını və azad edilmədiyini göstərəcək. İdeal nəticə — yalnız müvəqqəti obyektlərin (Autorelease pool) artımı. Dəqiq analiz üçün bir seansda Allocations + Leaks kombinasiyasından istifadə edin. Allocations hansı obyektlərin azad edilmədiyini, Leaks isə niyə (hansı güclü istinadın onları saxladığını) göstərir. Hər sızıntı şübhəsində ikiqat seans işə salın.
Leaks — iOS və macOS tətbiqlərində yaddaş sızıntılarını aşkar etmək üçün ixtisaslaşmış alətdir. Sadəcə ayırmaları göstərən Allocations-dan fərqli olaraq, Leaks retain cycles — iki və ya daha çox obyektin bir-birini güclü istinadlarla saxladığı vəziyyətləri axtarmaq üçün yığını aktiv şəkildə skan edir.
Leaks Cycles & Roots — obyekt saxlama qrafının vizuallaşdırıcısı ilə birlikdə işləyir. Sızıntı aşkar edildikdə, Leaks dövrədəki bütün obyektləri, onların retain count-nu və istinadların ötürüldüyü dəqiq sahələri göstərir. Tərtibatçı qrafa baxıb hansı istinadın weak ilə əvəz edilməli olduğunu anlamalıdır.
Alət sızıntıları zaman xəttində qırmızı markerlə avtomatik vurğulayır. Leaks real vaxtda işləyir: sistem sızıntını aşkar edən kimi dərhal tərtibatçıya xəbər verir. Bu, problemləri dump və post-analiz gözləmədən yerində düzəltməyə imkan verir.
WWDC 2022-yə görə, Leaks hətta mürəkkəb çoxsəviyyəli retain cycles — məsələn, üç və ya daha çox obyektin qapalı güclü istinad zənciri yaratdığı halları belə aşkar edə bilir. Belə dövrələrin diaqnostikası üçün Cycles & Roots qrafı əvəzolunmazdır: obyektlərin bir-birinə necə bağlandığını vizual olaraq göstərir.
Qrafın hər bir düyünü obyektdir, hər bir ox — güclü istinaddır. Dövrə — oxların qapalı konturudur. Düyünün rəngi statusu göstərir: qırmızı — sızan obyekt, yaşıl — kök (GC Root), boz — aralıq obyekt. Sızıntını düzəltmək üçün məntiqi pozmadan weak edilə bilən oxu tapın — və koddakı istinad növünü dəyişdirin.
Energy Log — tətbiqin enerji istehlakını ölçmək üçün Instruments şablonudur. Cihazın aparat sensorlarından məlumat toplayır: CPU yükü, Wi-Fi və mobil şəbəkə vəziyyəti, GPS istifadəsi, displey və Bluetooth. Energy Log tətbiqdə hansı əməliyyatların daha çox batareya istehlakına səbəb olduğunu göstərir və onları zaman şkalası üzrə enerji istehlakı qrafikinə yerləşdirir.
Alət əməliyyatları enerji səviyyəsinə görə təsnif edir: aşağı (prosessorun normal işi), orta (Wi-Fi ötürülməsi), yüksək (GPS, mobil şəbəkə, GPU). Əgər Energy Log uzun müddət ərzində yüksək səviyyənin qırmızı göstəricilərini göstərirsə — tətbiq fonda batareyanı boşaldır və istifadəçi tərəfindən silinəcək.
Energy Log tərəfindən aşkar edilən tipik problemlər: vaxt məhdudiyyəti olmayan WakeLock (tətbiq tapşırığı bitirdikdən sonra prosessoru aktiv saxlayır), yüksək dəqiqlikli Location Updates fonda (hər bir neçə saniyədən bir koordinat sorğusu), şəbəkə sessiyalarının anomaliyaları (tez-tez serverə yenidən qoşulma). Energy Log hər bir belə insidenti qeyd etməyi və enerji tutumlu əməliyyatı söndürmək üçün şərt əlavə etməyi tövsiyə edir.
Enerji istehlakını test etmək üçün batareya ilə işləyən real cihazdan istifadə edin — emulyatorda enerji istehlakı göstəriciləri düzgün deyil. CI-da batareya istehlakını avtomatlaşdırılmış şəkildə yoxlamaq üçün Energy Log-u UI testləri ilə birlikdə işə salın.
Instruments-i işə salmaq Xcode-dan iki yolla edilir: Product → Profile (⌘I) menyusu vasitəsilə və ya Launchpad-də Instruments-i ayrıca tətbiq kimi açmaqla. Birinci üsul daha rahatdır: Xcode avtomatik olaraq tətbiqi profilləşdirmə rejimində yığır və seçilmiş şablonla qoşulmuş cihazda işə salır. Seans dayandırıldıqdan sonra Instruments izləməni .trace genişlənməsi olan faylda saxlayır.
Nəticələrin şərhi şablondan asılıdır. Time Profiler üçün Self Weight-ə görə sıralanmış Call Tree-yə baxın — ən yüksək metodlar sizin əsas dar boğazlarınızdır. Allocations üçün — tsiklik ssenaridən sonra # Living-ə baxın: obyektlərin sayı artıbsa, sızıntı axtarın. Leaks üçün — qırmızı markerlərə və Cycles & Roots qrafına baxın. Optimizasiyadan əvvəl və sonra nəticələri müqayisə edin — bu, dəyişikliklərin effektivliyini təsdiqləməyin yeganə yoludur.
// CI-da Instruments üçün komanda sətri
// Instruments-in CI/CD pipeline-a inteqrasiyası
import XCTest
class PerformanceTests: XCTestCase {
func testScrollPerformance() {
// Kolleksiyanın sürüşdürülmə vaxtını ölçürük
measure(metrics: [XCTCPUMetric(), XCTMemoryMetric()]) {
app.scrollToBottom()
}
}
}
CI-da Instruments-i komanda sətri vasitəsilə xcodebuild -showBuildSettings və xcrun xctrace ilə işə salmaq olar. Bu, hər commit-də profilləşdirməni avtomatlaşdırmağa və reqressiyanı qaçırmamağa imkan verir. Analiz üçün Baseline müqayisəsindən istifadə edin: əgər metrik əvvəlki commit-ə nisbətən 5% pisləşibsə, pipeline dayanmalıdır.
Instruments ilə işləyərkən əsas səhvlər: cihaz əvəzinə simulyatorda profilləşdirmə (CPU və GPU məlumatları düzgün deyil), ssenarisiz məlumat toplama (nəticələr təsadüfi olur), Call Tree-ni göz ardı etmə (yalnız qrafikə baxmaq, konkret metodlara deyil). Bu səhvlərin düzəldilməsi profilləşdirmə keyfiyyətinin 80%-ni təmin edir.
Tez-tez verilən suallar
Bəli, Instruments SwiftUI-ni tam dəstəkləyir. UI performans analizi üçün Core Animation şablonundan istifadə edin — o, kadrların göstərilmə sürətini göstərir və lazımsız View yenidən çəkilmələrini aşkar edir. Time Profiler və Allocations da SwiftUI ilə məhdudiyyətsiz işləyir.
Instruments — CPU, yaddaş, şəbəkə, qrafika və enerji istehlakını əhatə edən bütün Apple ekosistemi üçün universal profilerdir. Shark — LeakCanary-də yalnız Android-də yaddaş sızıntılarının axtarışı üzrə ixtisaslaşmış daxili heap dump analizatorudur.
Instruments tətbiqin koduna daxil edilmir — bu, Xcode vasitəsilə işləyən prosesə qoşulan xarici alətdir. Koda heç bir dəyişiklik etmək lazım deyil. .trace faylları sadəcə loqlardır, ikili fayla daxil olmurlar.
Standart 1 ms seçmə tezliyində Time Profiler-in yükü 3%-dən azdır. Dəqiq izləmə rejimində (hər funksiya çağırışı) yük 20-30%-ə çata bilər, buna görə gündəlik profilləşdirmə üçün seçmə istifadə olunur. Dəqiq izləmə yalnız kritik hissələr üçün lazımdır.
Nəticələr avtomatik olaraq layihə qovluğunda .trace faylına saxlanılır. Fayl birgə analiz üçün Xcode ilə başqa Mac-da açıla bilər. Mətn formatına ixrac üçün xcrun xctrace export --input file.trace --output result.xml istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun