SORU
28 Mayıs 2010, Cuma


Modern C derleyicileri üzerinde etkili optimizasyon stratejileri

Performans-kritik çok bilimsel bir kod üzerinde çalışıyorum. Kod ilk sürümü yazılı ve test edilmiştir, ve şimdi, elinde profiler ile, sıcak noktalar devir traş etmek için zamanı geldi.

Bazı iyileştirmeler, örneğin döngü çözümü, çok daha etkili bir şekilde bu gün elle programcı bir zamana karışarak daha derleyici tarafından işlenen tanınmış. Hangi teknikler hala değerli? Belli ki, bir profiler ile çalışıyorum, ama eğer çalışma eğilimi olarak geleneksel bilgelik varsa ve Bana önemli bir zaman kazanmış oluruz, değil her şeyi yapacağım.

Bu en iyi duruma getirme derleyici - mimarlık - bağımlı olduğunu çok iyi biliyorum. Core 2 Duo hedefleyen Intel C compiler kullanıyorum, ama aynı zamanda iyi gcc için çalışıyor merak ediyorum, ya da "herhangi bir modern derleyici."

İşte düşünüyorum bazı somut fikirler:

  • Yerine STL fayda kaplar/elle sarılmış olanlar ile algoritmalar var mı? Özellikle, benim program toplam çok zaman alıyor olan çok büyük bir öncelik sırası (std::priority_queue şu anda bir) içerir. Bu, STL uygulama zaten büyük olasılıkla mümkün olan en hızlı bakarak değer bir şey mi?
  • Benzer çizgiler, bilinmiyor ama oldukça küçük bir üst sınır olan std::vectorler için, birlikte statik olarak ayrılan dizilerin yerine karlıdır?
  • Dinamik bellek ayırma genellikle ciddi bir darboğaz olduğunu, ve onu ortadan kaldırmak önemli speedups yol açabilir buldum. Sonuç olarak değeri büyük bir geçici veri yapıları dönen vs sonucu başvuru geçerken işaretçi vs döndürerek performans karşılaştırılması ilginç değilim. Bir şekilde güvenilir ya da derleyici belirli bir yöntem (arayanın sonuç tabii ki değiştirmek gerek yok varsayarak) rvt li kullanıp kullanmayacağını belirler.
  • Nasıl önbellek uyumlu Derleyiciler olabilir? Örneğin, yeniden iç içe döngü içine bakarak değer mi?
  • Programın bilimsel niteliği göz önüne alındığında, kayan nokta numaraları her yerde kullanılır. Önemli bir darboğaz içinde kodumu eskiden dönüşümlerden kayan nokta için tamsayılar: derleyici ki yayarlar kodu kaydetmek için geçerli yuvarlama modu, değiştirme, dönüştürme gerçekleştirmek, sonra geri eski yuvarlama modu --- olsa bile hiçbir programı hiç değişmedi yuvarlama modu! Bu davranışı devre dışı bırakma önemli ölçüde benim kod hızlandırdı. Kayan nokta ile ilgili benzer herhangi bir frikiklerinden gereken farkında olmak var mı?
  • Bir önemi C olmak derlenmiş ve Bağlantılı ayrı derleyici mümkün olsa ne yapardı galiba çok basit iyileştirmeler gibi hareket yöntemini çağırır gibi strlen() fesih şartları döngü. Çünkü Dikkat Etmeliyim bu gibi herhangi bir optimizasyon varolamazderleyici tarafından yapılan ve elle yapılmalı?
  • Kapak tarafında, orada gereken herhangi bir teknikleri vardırönlemekderleyicinin otomatik olarak kodu optimize etmek için yeteneği ile müdahale olasılığı için mi?

Son olarak, nip tomurcuk cevaplar belirli bir tür için

  • Optimizasyon karmaşıklığı açısından, güvenilirlik ve sürdürülebilirliği bir maliyeti olduğunu biliyorum. Bu özel uygulama için, daha yüksek performans bu maliyetler değer.
  • En iyi optimizasyon genellikle yüksek seviyeli algoritmaları geliştirmek için olduğunu anlıyorum, ve bu zaten yapıldı.

CEVAP
28 Mayıs 2010, Cuma


Yerine STL fayda kaplar/elle sarılmış olanlar ile algoritmalar var mı? Özellikle, programım çok büyük bir öncelik sırası içerir (şu anda bir std::priority_queue) toplam çok zaman alıyor olan. Bu, STL uygulama zaten büyük olasılıkla mümkün olan en hızlı bakarak değer bir şey mi?

STL kapları öğeleri kopyalama güveniyor haberin vardır herhalde. Bazı durumlarda, bu önemli bir kayıp olabilir. Mağaza işaretçiler ve konteyner manipülasyon bir sürü yaparsanız performans artışı görebilirsiniz. OTOH, önbellek mevkiinde azaltmak ve size zarar verebilir. Başka bir seçenek özel oran kullanmaktır.

Bazı kaplar (, *, ***3 örneğin *2 4*) işaretçi manipülasyon çok güveniyor. Mantığa aykırı olsa da, sık sık vector bunların yerine daha hızlı kod yol açabilir. Sonuç algoritması mevkiinde uygulamada çok daha hızlı olabilir O(n) ama önbellek nedeniyle O(1) O(log n) gidebilir. Profil emin olmak için.

Özellikle büyük eğer onlar öder öğeleri yeniden düzenlemek için bir çok şey hayal ediyorum ki priority_queue, kullanmakta olduğunu da söylemiştin. Alttaki kabı (belki de deque veya özel) değiştirmeyi deneyebilirsiniz. Neredeyse kesinlikle işaretçiler - yine de emin olmak için mağaza Profil istiyorum.

Bir std için benzer doğrultuda,:: bilinmeyen ama oldukça küçük bir üst olan vektörler bağlı, statik olarak ayrılan dizilerin yerine faydalıdır?

Yine, bu küçük bir miktar kullanın duruma göre yardımcı olabilir. Sen-ebilmek önlemek yığın ayırma, ama sadece ihtiyacın yok senin dizi için daha uzun yaşamak yığını... ya da olabilir reserve() boyutu vector çok az kopyalama düzenliyoruz.

Dinamik bellek ayırma genellikle ciddi bir darboğaz olduğunu, ve onu ortadan kaldırmak önemli speedups yol açabilir buldum. Sonuç olarak değeri büyük bir geçici veri yapıları dönen vs sonucu başvuru geçerken işaretçi vs döndürerek performans karşılaştırılması ilginç değilim. Bir şekilde güvenilir ya da derleyici belirli bir yöntem (arayanın sonuç tabii ki değiştirmek gerek yok varsayarak) rvt li kullanıp kullanmayacağını belirler.

Oluşturulan kurulda eğer rvt li uygulanabilir olup olmadığını görmek için bakmak olabilir, ama eğer işaretçi veya başvuru dönerseniz, kopya yok emin olabilirsiniz. Bu ne yaptığınızı bağlıdır yardımcı olup olmadığı - örneğin başvurular iade edemem geçici. Arenas ayırmak için kullanabilirsiniz ve yeniden nesneler, büyük bir yığın ceza ödemek değil.

Nasıl önbellek uyumlu Derleyiciler olabilir? Örneğin, yeniden iç içe döngü içine bakarak değer mi?

Gördümdramatikdiyar. (ciddi) dramatik bu speedups Ben daha sonra benim kod çoklu den gördüm daha bundan daha fazla ilerleme gördüm. Şeyler - emin olmak için tek bir yol profilli yana geçen beş yıl içinde değişmiş olabilir.

Diğer taraftan, derleyici otomatik olarak kodu optimize etmek için yeteneği ile müdahale olasılığı nedeniyle Kaçınılması gereken herhangi bir teknikleri var mı?

  • Tek argüman senin kurucular explicit kullanın. Geçici nesne inşaat ve yıkım kodunuzu gizli olabilir.

  • Büyük nesneleri gizli kopya kurucu çağırır farkında olun. Bazı durumlarda, işaretçileri ile değiştirmeyi düşünün.

  • Profil, profil, profil. Melodi alanlarda sorunları olduğunu.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009
  • Crossover

    Crossover

    18 HAZİRAN 2007