Aracılığıyla paylaş


Öğretici: Derleme süresi üzerindeki üst bilgi dosyası etkisini giderme

Dosyaların C ve C++ derleme süreleri üzerindeki etkisini #include gidermek için Derleme Analizler Dahil Edilen Dosyalar ve Ağaç İçerme görünümlerini kullanın.

Önkoşullar

  • Visual Studio 2022 17.8 veya üzeri.
  • Visual Studio yükleyicisini kullanarak C++ ile Masaüstü geliştirme iş yükünü yüklerseniz C++ Derleme Analizler varsayılan olarak etkinleştirilir:

C++ iş yükünün seçili olduğu Masaüstü geliştirme Visual Studio Yükleyicisi ekran görüntüsü.

Yüklü bileşenlerin listesi gösterilir. C++ Derleme Analizler vurgulanır ve seçilir; bu da yüklü olduğu anlamına gelir.

Veya C++ iş yüküyle oyun geliştirme:

C++ iş yükünün seçili olduğu Oyun geliştirme Visual Studio Yükleyicisi ekran görüntüsü.

Yüklü bileşenlerin listesi gösterilir. C++ Derleme Analizler vurgulanır ve seçilir; bu da yüklü olduğu anlamına gelir.

Genel bakış

Visual Studio ile tümleştirilmiş olan derleme Analizler, özellikle üçlü A oyunları gibi büyük projeler için derleme sürelerinizi iyileştirmenize yardımcı olur. Büyük bir üst bilgi dosyası ayrıştırıldığında ve özellikle de tekrar tekrar ayrıştırıldığında, derleme süresi üzerinde bir etkisi olur.

Derleme Analizler, Dahil Edilen Dosyalar görünümünde analiz sağlayarak projenizdeki dosyaları ayrıştırma #include etkisini tanılamaya yardımcı olur. Her üst bilgi dosyasını ayrıştırmak için gereken süreyi ve üst bilgi dosyaları arasındaki ilişkilerin görünümünü görüntüler.

Bu makalede, ayrıştırmak için en pahalı üst bilgi dosyalarını belirlemek için Derleme Analizler Dahil Edilen Dosyalar ve Ağaç Ekle görünümlerini kullanmayı ve önceden derlenmiş bir üst bilgi dosyası oluşturarak derleme süresini iyileştirmeyi öğrenin.

Derleme seçeneklerini ayarlama

Derleme Analizler verilerini toplamadan önce, ölçmek istediğiniz derleme türü için derleme seçeneklerini ayarlayın. Örneğin, x64 hata ayıklama derleme süreniz hakkında endişeleriniz varsa, derlemeyi Hata Ayıklama ve x64 için ayarlayın:

  • Çözüm Yapılandırmaları açılan listesinde Hata Ayıkla'yı seçin.

  • Çözüm Platformları açılan listesinde x64'i seçin.

    Çözüm Yapılandırması açılan listelerinin ekran görüntüsü.

    Çözüm Yapılandırması açılan listesi gösterilir. Hata Ayıklama, Sürüm ve Yapılandırma yöneticisi seçenekleri vardır. Çözüm Platformu açılan listesi x64 olarak ayarlanmıştır.

Derleme Analizler çalıştırma

Seçtiğiniz bir projede ve önceki bölümde ayarlanan Derleme hatalarını ayıkla seçeneklerini kullanarak Derleme Analizler'ni çalıştırarak Derlemeyi Çalıştır Analizler Seçim>Yeniden Oluşturma'da ana menüden> seçim yapın. Ayrıca çözüm gezgininde bir projeye sağ tıklayıp Derlemeyi Çalıştır Analizler> Yapı oluştur'u seçebilirsiniz. Şu anda yalnızca birkaç dosya için değil, tüm projenin derleme süresini ölçmek için Derleme yerine Yeniden Oluştur'u seçin.

Seçim > Yeniden Oluşturma'da Derlemeyi Çalıştır Analizler seçili ana menünün ekran görüntüsü.

Derleme tamamlandığında bir Olay İzleme Günlüğü (ETL) dosyası açılır. Windows TEMP ortam değişkeninin işaret ettiği klasöre kaydedilir. Oluşturulan ad, koleksiyon süresini temel alır.

Eklenen Dosyalar görünümü

İzleme dosyası derleme süresini gösterir; bu örnek için 16,404 saniyedir. Tanılama Oturumu, Derleme Analizler oturumunu çalıştırmak için geçen genel süredir. Eklenen Dosyalar sekmesini seçin.

Bu görünümde dosyalar işlenirken #include harcanan süre gösterilir.

Eklenen dosyalar görünümünün ekran görüntüsü.

Dosya yolu sütununda, ayrıştırma için derleme süresinin %10'unu aldıkları için yangın simgesine sahip birkaç dosya vurgulanır. winrtHeaders.h, 8,581 saniyelik veya 16,404 saniyelik derleme süresinin %52,3'ünün en büyük olanıdır.

Dosya Yolu sütununda, bazı dosyaların yanında derleme süresinin %10'unu veya daha fazlasını kapsadıklarını belirten bir yangın simgesi bulunur.

Saat [sn, %] sütunu, her işlevin duvar saati sorumluluk süresinde (WCTR) derlenmiş olması için ne kadar sürdüğünü gösterir. Bu ölçüm, paralel iş parçacıklarının kullanımına göre dosyaları ayrıştırmak için gereken duvar saati süresini dağıtır. Örneğin, iki farklı iş parçacığı bir saniyelik süre içinde iki farklı dosyayı aynı anda ayrıştırıyorsa, her dosyanın WCTR değeri 0,5 saniye olarak kaydedilir. Bu, her dosyanın toplam derleme süresindeki orantılı payını yansıtır ve her biri paralel yürütme sırasında kullanılan kaynakları dikkate alır. Bu nedenle WCTR, birden çok derleme etkinliğinin aynı anda gerçekleştiği ortamlarda her dosyanın genel derleme süresi üzerindeki etkisinin daha iyi bir ölçüsünü sağlar.

Ayrıştırma Sayısı sütunu, üst bilgi dosyasının kaç kez ayrıştırıldığını gösterir.

Bu listede vurgulanan ilk üst bilgi dosyası, Toplam 16.404 saniyelik derleme süresinin 8,581 saniyesini veya derleme süresinin %52,3'ünün alınmasıdır winrtHeaders.h . Sonraki en pahalısı ve ardından Windows.Xaml.holurWindows.UI.Xaml.Interop.h.

Hangi dosyanın içerdiğini winrtHeaders.hgörmek için yanındaki köşeli çift ayracı tıklatın. Ayrıştırma Sayısı sütunu, bir üst bilgi dosyasının diğer dosyalar tarafından kaç kez eklendiğinden emin olarak yararlı olabilir. Belki de bir üst bilgi dosyası birden çok kez eklenmiştir. Bu, önceden derlenmiş bir üst bilgi dosyası veya yeniden düzenleme için iyi bir aday olduğunu gösteren bir işaret olabilir.

Çeviri Birimi sütunu, eklenen dosya işlendiğinde hangi dosyanın işlendiğini gösterir. Bu örnekte, winrtHeaders.h derlendiği sırada Grapher.cpp eklendi:

Eklenen Dosyalar görünümünün ekran görüntüsü.

Örnek bir proje için ekleme dosyalarını gösteren örnek bir ETL dosyası. Dosya yolu sütununda winrtHeaders.h seçili ve genişletilmiştir. Derleme süresi %50,1 olan derleme 8,219 saniye sürer. Alt düğümü, çeviri birimi olarak da listelenen Grapher.cpp."

Çeviri birimi sütunu, bir üst bilgi dosyasının birçok kez eklendiği ve bunun en çok nerede gerçekleştiğini öğrenmek istediğiniz durumlarda hangi dosyanın derlendiğinin belirsiz olmasına yardımcı olabilir.

Bunun ayrıştırmak için pahalı olduğunu biliyoruz winrtHeaders.h , ancak daha fazla bilgi edinebiliriz.

Ağaç görünümünü dahil et

Bu görünümde alt düğümler, üst düğüm tarafından eklenen dosyalardır. Bu, üst bilgi dosyaları arasındaki ilişkileri anlamanıza ve üst bilgi dosyasının ayrıştırma sayısını azaltma fırsatlarını belirlemenize yardımcı olabilir.

EtL dosyasındaKi ağaç ekle sekmesini seçerek Ağacı Ekle görünümünü görüntüleyin:

Ağacı Ekle görünümünün ekran görüntüsü.

Projenin ekleme ağacını gösterir. Dosya yolu sütununda, diğer dosyaları içeren her dosya, içerdiği dosya sayısı ve ayrıştırma zamanıyla birlikte listelenir.

Bu görünümde , Dosya Yolu sütunu diğer dosyaları içeren her dosyayı gösterir. Ekleme Sayısı , bu üst bilgi dosyasının kaç dosya içerdiğini listeler. Bu dosyayı ayrıştırma zamanı listelenir ve genişletildiğinde, bu üst bilgi dosyasının içerdiği her bir üst bilgi dosyasını ayrıştırma zamanını listeler.

Daha önce ayrıştırma işleminin winrtHeaders.h zaman alıcı olduğunu görmüştük. Dosyaları Filtrele metin kutusunda, girersek winrtHeaders.hgörünümü yalnızca adı içeren winrtHeaders.h girdilere göre filtreleyebiliriz. Yanındaki köşeli çift ayraç tıklanması winrtHeaders.h hangi dosyaları içerdiğini gösterir:

Genişletilmiş Ağacı Ekle görünümünün ekran görüntüsü.

Dosya yolu sütunu, içerdiği dosya sayısı ve ayrıştırma süresiyle birlikte diğer dosyaları içeren her dosyayı listeler. winrtHeaders.h seçilir ve içerdiği dosyaları gösterecek şekilde genişletilir. Windows.UI.Xaml.Interop.h bu dosyalardan biridir ve içerdiği üst bilgi dosyalarını gösterecek şekilde genişletilmiş Windows.UI.Xaml.Interop.h'yi gösterecek şekilde genişletilir.

bunu içerdiğini winrtHeaders.hWindows.UI.Xaml.Interop.hgörüyoruz. Dahil Edilen Dosyalar görünümünde bunun ayrıştırmak için de zaman alıcı olduğunu unutmayın. öğesinin yanındaki Windows.UI.Xaml.Interop.h köşeli çift ayraca Windows.UI.Xaml.htıklayarak ikisi de sık erişimli listede yer alan 21 diğer üst bilgi dosyasını içerir.

Ayrıştırmak için en pahalı üst bilgi dosyalarından bazılarını tanımladıktan ve bunları getirmekten sorumlu olduğunu winrtHeaders.h görmek, daha winrtHeaders.h hızlı eklemek için önceden derlenmiş bir üst bilgi kullanabileceğimizi önerir.

Önceden derlenmiş üst bilgilerle derleme süresini geliştirme

Dahil Edilen Dosyalar görünümünden winrtHeaders.h ayrıştırmak için zaman alan bir bilgimiz olduğundan ve ayrıştırmak için zaman alan diğer birkaç üst bilgi dosyasını içeren winrtHeaders.h Ağacı Dahil Et görünümünden bildiğimiz için, bunları bir PCH'de yalnızca bir kez ayrıştırarak bu işlemi hızlandırmak için önceden derlenmiş bir üst bilgi dosyası (PCH) oluştururuz.

öğesini eklemek winrtHeaders.hiçin şunun pch.h gibi görünür:

#ifndef CALC_PCH
#define CALC_PCH

#include <winrtHeaders.h>

#endif // CALC_PCH

PCH dosyalarının kullanılabilmesi için önce derlenmelidir, bu nedenle projeye rastgele olarak adlı pch.cppve içeren pch.hbir dosya ekleriz. Tek bir satır içerir:

#include "pch.h"

Ardından projemizi PCH kullanacak şekilde ayarlayacağız. Bu işlem, proje özelliklerinde C/C++>Önceden Derlenmiş Üst Bilgiler aracılığıyla yapılır ve Önceden Derlenmiş Üst Bilgiyi Kullan (/Yu) ve Önceden Derlenmiş Üst Bilgi Dosyası'nın pch.h olarak ayarlanması gerekir.

Önceden Derlenmiş Üst Bilgiler ayarlarının açık olduğu proje özellikleri iletişim kutusunun ekran görüntüsü.

Önceden derlenmiş Üst Bilgi olarak ayarlanır: Kullan (/Yu). Önceden Derlenmiş Üst Bilgi Dosyası pch.h olarak ayarlanır.

PCH'yi kullanmak için, kullanan kaynak dosyalara winrtHeaders.hilk satır olarak ekleriz. Diğer ekleme dosyaları öncesinde gelmelidir. Alternatif olarak, proje özelliğini C/C++>Advanced>Zorlamalı Ekleme Dosyası olarak ayarlayarak proje özelliklerini çözümdeki her dosyanın başına eklenecek pch.h şekilde pch.hdeğiştirebiliriz:

Gelişmiş ayarların açık olduğu proje özellikleri iletişim kutusunun ekran görüntüsü.

Zorlamalı Ekleme Dosyası pch.h olarak ayarlanır.

PCH içerdiğinden winrtHeaders.h, şu anda onu içeren tüm dosyalardan kaldırabiliriz winrtHeaders.h . Derleyici bunun zaten dahil olduğunu winrtHeaders.h fark ettiğinden ve yeniden ayrıştırmadığından kesinlikle gerekli değildir. Bazı geliştiriciler netlik için kaynak dosyada tutmayı #include tercih eder veya PCH'nin yeniden düzenlenebileceği ve bu üst bilgi dosyasını artık içeremeyebilir.

Değişiklikleri test etme

Daha önce olduğu gibi aynı dosyaları derlemeyi karşılaştırdığımızdan emin olmak için önce projeyi temizleyeceğiz. Yalnızca bir projeyi temizlemek için, Çözüm Gezgini projeye sağ tıklayın ve Yalnızca>proje yalnızca prj adını> temizle'yi <seçin.

Bu proje artık önceden derlenmiş bir üst bilgi (PCH) kullandığından, PCH'yi oluşturmak için harcanan süreyi ölçmek istemiyoruz çünkü bu yalnızca bir kez gerçekleşir. Bu işlemi, dosyayı yükleyip pch.cpp yalnızca bu dosyayı oluşturmak için Ctrl+F7 tuşlarına basarak yaparız. Bu dosyayı Çözüm Gezgini sağ tıklayıp pch.cpp seçerek Compilede derleyebiliriz.

Şimdi projeye sağ tıklayıp Derlemede Yalnızca>Proje Çalıştırma Derleme Analizler seçerek Çözüm Gezgini Derleme Analizler yeniden çalıştıracağız. Ayrıca çözüm gezgininde bir projeye sağ tıklayıp Derleme Analizler> Build Çalıştır'ı seçebilirsiniz. Bu kez Yeniden Derle'yi istemiyoruz çünkü bu, ölçmek istemediğimiz PCH'yi yeniden derleyecek. Projeyi daha önce temizledik, bu da normal bir derlemenin ölçmek istediğimiz tüm proje dosyalarını derlediği anlamına gelir.

ETL dosyaları görüntülendiğinde derleme süresinin 16.404 saniyeden 6.615 saniyeye çıktığını görüyoruz. winrtHeaders.h Filtre kutusuna koyun ve hiçbir şey görünmez. Bunun nedeni, önceden derlenmiş üst bilgi tarafından çekildiği için ayrıştırmada harcanan sürenin artık göz ardı edilebilir olmasıdır.

İzleme dosyasındaki Ağacı Ekle bölmesinin ekran görüntüsü. winrtHeaders artık listelenmiyor.

Bu örnek, C++20'den önceki yaygın bir çözüm olduğundan önceden derlenmiş üst bilgileri kullanır. Ancak, C++20'den başlayarak üst bilgi birimleri ve modüller gibi üst bilgi dosyalarını eklemenin başka, daha hızlı, daha az kırılgan yolları vardır. Daha fazla bilgi için bkz . Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma.

Hem Dahil Edilen Dosyalarhem de Dahil Edilen Ağaç görünümleri için bazı gezinti özellikleri vardır:

  • Eklenen Dosyalarveya Ağaç Ekle'de bir dosyaya çift tıklayarak (veya Enter tuşuna basarak) bu dosyanın kaynak kodunu açın.
  • Bu dosyayı diğer görünümde bulmak için bir üst bilgi dosyasına sağ tıklayın. Örneğin, Eklenen Dosyagörünümünde sağ tıklayın winrtHeaders.h ve Ağacı Ekle görünümünde görmek için Ağacı Dahil Et'te Bul'u seçin.

Eklenen Dosyalar görünümünde bir dosyaya sağ tıklama işleminin ekran görüntüsü. Ağaç Görünümünde Göster menü seçeneği vurgulanır.

İsterseniz, Eklenen Dosyalar görünümünde bir dosyaya atlamak için Ağaç Ekle görünümünde sağ tıklayabilirsiniz.

İpuçları

  • Derleme zamanının kaydını tutmak için ETL Dosyası Olarak Kaydet'i daha kalıcı bir konuma kaydedebilirsiniz.> Daha sonra değişikliklerinizin derleme süresini geliştirip geliştirmediğini görmek için bunu gelecekteki derlemelerle karşılaştırabilirsiniz.
  • Derleme Analizler penceresini yanlışlıkla kapatırsanız, dosyayı geçici klasörünüzde bularak <dateandtime>.etl yeniden açın. TEMP Windows ortam değişkeni, geçici dosyalar klasörünüzün yolunu sağlar.
  • Windows Performans Analizi (WPA) ile Analizler verileri oluştur'a gitmek için ETL penceresinin sağ alt kısmındaki WPA'da Aç düğmesine tıklayın.
  • Sütunları sürükleyerek sütunların sırasını değiştirin. Örneğin, Time sütununu ilk sütun olarak taşımayı tercih edebilirsiniz. Sütun üst bilgisine sağ tıklayıp görmek istemediğiniz sütunların seçimini kaldırarak sütunları gizleyebilirsiniz.
  • Eklenen Dosyalar ve Ağaç Ekle görünümleri, ilgilendiğiniz bir üst bilgi dosyasını bulmak için bir filtre kutusu sağlar. Sağladığınız adla kısmi eşleşmeler yapar.
  • Bazen üst bilgi dosyası için bildirilen ayrıştırma süresi, hangi dosyanın içerdiğine bağlı olarak farklılık gösterir. Bunun nedeni, üst bilginin hangi bölümlerinin genişletildiğini, dosya önbelleğe almayı ve diğer sistem faktörlerini etkileyen farklı #defineS'lerin etkileşimi olabilir.
  • Eklenen Dosyalar veya Ağacı Ekle görünümünün size göstermeye çalıştığı şeyi unutursanız, görünümü açıklayan bir araç ipucu görmek için sekmenin üzerine gelin. Örneğin, Ağacı Ekle sekmesinin üzerine gelirseniz araç ipucu şu ifadeyi söyler: "Alt düğümlerin üst düğüm tarafından dahil edilen dosyalar olduğu her dosya için dahil istatistiklerini gösteren görünüm."
  • Bir üst bilgi dosyası için tüm zamanların toplam süresinin derlemenin tamamından daha uzun olduğu durumları (gibi Windows.h) görebilirsiniz. Burada olan, üst bilgilerin aynı anda birden çok iş parçacığında ayrıştırılmasıdır. İki iş parçacığı aynı anda bir üst bilgi dosyasını ayrıştırarak bir saniye harcarsa, duvar saati süresinin yalnızca bir saniyesi geçmiş olsa bile bu 2 saniyelik derleme süresidir. Daha fazla bilgi için bkz . duvar saati sorumluluk süresi (WCTR).

Sorun giderme

  • Derleme Analizler penceresi görünmüyorsa derleme yerine yeniden derleme yapın. Hiçbir şey gerçekten derlenmiyorsa Derleme Analizler penceresi görünmez; son derlemeden sonra hiçbir dosya değişmediyse bu durum söz konusu olabilir.
  • İlgilendiğiniz bir üst bilgi dosyası Eklenen Dosyalar veya Ağaç Ekle görünümlerinde görünmüyorsa, bu dosya derlenmemiştir veya derleme süresi listelenecek kadar önemli değildir.

Ayrıca bkz.

Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma
Visual Studio'da Analizler oluşturma videosu - Pure Virtual C++ 2023
Daha hızlı C++ derlemeleri, basitleştirilmiş: zaman için yeni ölçüm
Öğretici: Derleme zamanında işlev inlining sorunlarını giderme
Öğretici: vcperf ve Windows Performans Analizi