Soru Delphi: Derleyici performansını artırmak için kaynak kodu nasıl düzenlenir?


Oldukça fazla dependansa sahip büyük bir delphi 6 projesi üzerinde çalışıyorum. Tüm projeyi derlemek birkaç dakika sürer. Birkaç değişiklikten sonra yeniden derleme bazen çok daha uzun olur, böylece Delphi'yi sonlandırmak, tüm dcu dosyalarını silmek ve her şeyi yeniden derlemek daha hızlıdır.

Kimse tanımlamak için bir yol biliyor mu, derleyiciyi daha yavaş ve yavaş yapan nedir? Derleyici performansını geliştirmek için kodu nasıl düzenleyeceğinize dair ipuçları

Şimdiden aşağıdaki şeyleri denedim:

  • Açıkça, arama yoluna güvenmek yerine dpr'deki birimlerin çoğunu içerir: Hiçbir şey iyileştirmemiştir.
  • Komut satırı derleyicisini dcc32 kullanın: daha hızlı değil.
  • Derleyicinin ne yaptığını görmeye çalışın (SysInternals'dan ProcessExplorer kullanarak): görünüşe göre çoğu zaman 'KibitzGetOverloads' adlı bir fonksiyon çalıştırıyor. Ama bu bilgi ile hiçbir şey yapamam ...

DÜZENLE, Şimdiye kadar cevapların özeti:

Benim durumumda en iyi cevap veren cevap:

  • "Kullanılmayan üniteler referanslarını temizle" işlevi cnpack. Neredeyse iki kat daha hızlı "soğuk" derleme yapma, 1000'den fazla referansları otomatik olarak temizledi. ("soğuk" derleme = derlenmeden önce tüm dcu dosyalarını siler). Derleyici listesinden referans listesi alır. Dolayısıyla, bazı {$ IFDEF} 'i varsa, tüm yapılandırmalarınızın hala derlendiğini kontrol edin.

Bir sonraki şey denemek isterim:

  • Birim referanslarını manuel olarak yeniden doldurma (sonunda soyut bir sınıf kullanarak) ama daha çok iş var, çünkü problemlerin nerede olduğunu belirlemem gerekiyor. Yardımcı olabilecek bazı araçlar:

Benim durumumda hiçbir şey değiştirmeyen şeyler:

  • Programımdan ve tüm bileşenlerden her dosyayı alt klasörsüz bir klasöre koyuyorum.
  • Diskin birleştirilmesi (ramdisk ile denedim)
  • Kod kaynağı ve çıktı klasörleri için bir ramdisk kullanma.
  • Canlı tarama antivirüsünü kapatma
  • Arama yoluna güvenmek yerine dpr dosyasındaki tüm birimleri listeleme.
  • Komut satırı derleyicisi dcc32 veya ecc32'yi kullanarak.

Dava için geçerli olmayan şeyler:

  • Ağ paylaşımlarına bağımlılıklardan kaçınmak.
  • kullanma DelphiSpeedUpçünkü zaten vardı.
  • Tüm dcu için tek bir klasör kullanmak (her zaman yaparım)

Denemediğim şeyler:

  • Başka bir Delphi sürümüne yükseltme.
  • Dcc32speed.exe'yi kullanma
  • Bir katı hal sürücü kullanarak (Ben denemedim, ama tüm kaynak kodu koyduğum bir ramdisk ile çalıştım. Ama belki de ramdisk'e delphi yüklemeliydim)

32
2018-05-28 12:17


Menşei


$ IFDEF sorununuz hakkında, kullanılan birimleri CnPack'in kullanılmadığı şekilde kaldırma sorununu hafifletmek için uygun $ IFDEF'leri kullanmalısınız. - Lieven Keersmaekers
@Lieven: Bütün birimin uygun $ IFDEf ile kapsanması için iyi bir fikir. Fakat bu her zaman mümkün değildir: Eğer ünite değiştirmek istemediğiniz bir kütüphanenin parçasıysa, "Kullanımlar" a $ IFDEF koymanız gerekir. - Name


Cevaplar:


Derleyiciyi yavaşlatabilecek bazı şeyler

  • Yedek birimleri senin içinde uses fıkra. Görmek bu soru bir bağlantı için CnPack.
  • Proje dosyanıza açık bir şekilde birimler eklememek. Bunu zaten biliyorsun.
  • Değişen derleyici ayarları, en önemlisi include TDD32 info.

Kullanım birimlerinde kullanılmayan birimlerden kurtulmaya çalışın ve fark yaratıp yaratmadığına bakın.


11
2018-05-28 12:21



Cevabınız için teşekkürler. cnpack ilginç görünüyor. Bir deneyeceğim. Dahil TDD32 zaten devre dışı bırakılmıştır. BTW de ecc32 (dcc32 olarak adlandırılır) adlı bir derleyici var, tam olarak ne olduğunu bilmiyorum. - Name
@ İsim, bunu bilmiyordum, düzenleme için üzgünüm. Şimdi bahsettiniz, ayrıca dcc32speed.exe var. Andreas Hausladen tarafından yazılmıştır ve derleyiciyi hızlandırmak için çeşitli işlevleri yamalar. - Lieven Keersmaekers
Cnpack'den "Kullanılmayan ünite referanslarını temizle" fonksiyonu çok iyi bir cevaptı. Neredeyse otomatik olarak 1000'den fazla referansı temizleyerek, "soğuk" derlemenin iki kat daha hızlı olmasını sağladı. - Name


Delphi 7 ve 2009 kullanarak, geçen hafta derleme için neredeyse 2 dakika ve f9 isabet başka bir 45 saniye geçmek ve 20 saniye derleme ve çalışan benim app ana formu olsun. Bu şeyler 6 ay boyunca beni deli ediyor ve denediğim hiçbir şey işe yaramıyor gibi görünüyor. SysInternals'ın filemonunu kullanarak, derleyicinin gereksinim duyduğu her birimin (çoğunlukla bileşenler) Arama Yolu'ndaki her klasörde arandığını fark ettim, evet, bu çok sayıda FileOpen, FileExists ve FileNotFound vb. Üretiyor. Tek bir klasördeki tüm bileşenlerden DCU, DFM, RES, vb. Ve sadece arama yolunda bu klasöre ve projenin gerektirdiği birkaç klasöre sahip olmak; Sonuçlar inanılmazdı. Düzeltmeden önceki diğer sorun, hata ayıklamadır. Her F7'de almos 40 saniye, hata ayıklama sırasında F8 tuşa basılır, bu da giderilmiştir. Umarım bu bilgi size yardımcı olabilir. Selamlar, Isla de Margarita, Venezuela'yı oluşturur. İngilizce’mden özür dilerim, herhangi bir hata varsa;)


9
2018-05-28 17:12



Çok pratik değil ama denemeye değer olabilir. - Name
Denedim, davamda hiçbir şey değişmedi. - Name


Yerel makinenizde olmayan arama yollarında herhangi bir yol olup olmadığını kontrol edin.

Örneğin, ağ paylaşımlarındaki ikili dosyalara bağlantı vermeyin ve arama yolunun herhangi bir ağ paylaşımını kontrol etmediğini kontrol edin.


8
2018-05-28 12:23



Hiçbir şey ağ paylaşımında yok. Ama yine de iyi bir ipucu. - Name


Verebilirsin DelphiSpeedUp Bir deneyin ve bir fark yaratıp yaratmadığını görün. Komut satırı derlenmez, ancak IDE derlemesi için bazı hızlandırmaları olduğunu iddia eder.


5
2018-05-28 14:15



Zaten DelphiSpeedUp'ım var. Yine de bahşiş için teşekkürler. - Name


Derleyicinin zamanla daha yavaş geçtiğini görmedim, ancak Delphi 6'yı kullandığımızdan beri çok uzun zaman geçti.

  1. Delphi topluluğunda, en son ve en büyük (Delphi 2007 veya 2009) yükseltmek istemiyorsanız, Delphi 7'nin en iyi / en hızlı / en kararlı olduğu konusunda genel olarak anlaşılmış gibi görünüyor. Yeni sürüme geçmeyi düşünebilirsiniz.
  2. KibitzGetOverloads kibitz derleyicisinden bir şey gibi geliyor - size kod tamamlama, arka plan hatası vurgulama, kod araç ipuçlarını vb. Sağlayan "arka plan" derleyicisi. Komut satırı derleyicisinin çağrı yığınını kontrol etmekten daha iyi gibi geliyor. IDE değil; Daha yararlı bir şey alırsınız.
  3. DCU'ları sildikten sonra daha hızlı olmak için hiçbir zaman derlemeler bulmadım. DCU'lar, yapıyı artımlı hale getirecek, böylece daha hızlı. Tüm DCU'ları sildikten sonra daha hızlı derlemeler görüyorsanız, donanımınızı kontrol edin. Son zamanlarda sabit diskinizi bozdunuz mu? Sürücüde ne kadar boş alan var?

4
2018-05-28 12:34



Komut satırı derleyicisi için aynı şey, görünüşe göre KibitzGetOverloads'da çok fazla zaman harcıyor. Disk alanı birleştirme bir problem değil, muhtemelen bir kaynak koduna bir ramdisk'e koyduğumda aynı sonucu elde ettiğimden, yardımcı olmayacaktır. Yeni bir Delphi'ye yükseltmek bir seçenek olabilir, ancak Delphi'yi yavaşlatmayı öğrenmek isterim. - Name


  1. DCU'ları almak için tek bir klasör ayarladınız mı. Değilse, her tarafa dağılmış olacaklar.
  2. Tüm birimleri ve örtük olarak adlandırılan birimleri (kitaplık yolundan kurulu bileşenler hariç) dpr'ye koyun. Bazılarını kaçırmadığınızdan emin olmak için arama yolunuzu boşaltın, yine de derlemelisiniz.
  3. Arama yolunu azalttıktan sonra, bileşenlerinizi daha az klasöre yükleyerek kütüphane yolunuzu azaltmayı deneyebilirsiniz.

4
2018-05-28 19:39



Sistematik olarak 1 numara yapıyorum ama bunu yapmayan insanlar için iyi bir ipucu olabilir. Aslına bakılırsa, orijinal yazımda zaten söylendiği gibi 2 numarayı denedim. 3 numarasının işe yarayıp yaramadığını bilmiyorum, ama uygulanması çok fazla iş olurdu, bu yüzden deneyebileceğim son menteşe olurdu. - Name


Kesin soruyla kısmen alakalı olsa da, bir katı-hal sürücüsünün kullanılmasının Delphi ile derleme süresinin büyük ölçüde arttığını duydum - Nick Hodges bunu birkaç hafta önce Delphi Podcast'de söyledi. Brian


3
2018-05-28 13:25



Bana başka bir Fikir veren ilginç bir fikir: Tüm kaynak kodunu bir ramdisk'e koymaya çalıştım. Ama hiçbir gelişme göstermedim. Windows muhtemelen dosyaları yeterince önbelleğe alır. - Name