Optimizasyonları yerel tutun, açık hale getirin, iyi belgelendirin ve optimize edilmiş sürümleri hem kaynak kodu hem de çalışma zamanı performansı açısından birbiriyle ve optimize edilmemiş sürümle karşılaştırmayı kolaylaştırın.
Tam cevap
Böyle optimizasyon gerçekten varsa vardır ürününüz için o kadar önemli, o zaman optimizasyon önce kullanışlı değildi sadece neden bilmek değil, aynı zamanda gelecekte yararlı olup olmayacağını bilmek yardım geliştiriciler için yeterli bilgi sağlamak gerekir.
İdeal olarak, performans testini oluşturma sürecinize dahil etmeniz gerekir, böylece yeni teknolojilerin eski optimizasyonları ne zaman geçersiz kılacağını öğrenirsiniz.
Hatırlamak:
Program Optimizasyonunun İlk Kuralı: Yapmayın.
İkinci Program Optimizasyonu Kuralı (yalnızca uzmanlar için!): Henüz yapma. "
- Michael A.Jackson
Şimdi zamanın olup olmadığını bilmek için kıyaslama ve test gerektirir.
Bahsettiğiniz gibi, yüksek düzeyde optimize edilmiş kodla ilgili en büyük sorun, bakımının zor olmasıdır, bu nedenle, mümkün olduğunca optimize edilmiş bölümleri optimize edilmemiş bölümlerden ayrı tutmanız gerekir. Bunu derleme zamanı bağlantısıyla yapsanız da, çalışma zamanı sanal işlev çağrıları veya aradaki bir şey önemli değil. Önemli olan, testlerinizi yaptığınızda, şu anda ilgilendiğiniz tüm sürümlere karşı test edebilmenizdir .
Üretim kodunun temel optimize edilmemiş versiyonunun her zaman kodun amacını anlamak için kullanılabileceği , daha sonra optimize edilmiş versiyonu veya versiyonları içeren bunun yanında farklı optimize edilmiş modüller inşa edebileceği, her yerde açıkça belgelediği bir sistem kurmaya meyilli olacağım optimize edilmiş sürüm temel çizgiden farklıdır. Testlerinizi (ünite ve entegrasyon) çalıştırdığınızda, testi optimize edilmemiş versiyonda ve mevcut tüm optimize edilmiş modüllerde çalıştırırsınız.
Misal
Örneğin, bir Hızlı Fourier Dönüşümü işleviniz olduğunu varsayalım . Belki de içinde temel, algoritmik bir uygulama fft.c
ve testler vardır fft_tests.c
.
Daha sonra Pentium geliyor ve MMX talimatlarınıfft_mmx.c
kullanarak sabit nokta sürümünü uygulamaya karar veriyorsunuz . Daha sonra Pentium 3 birlikte geliyor ve kullanan bir sürümünü eklemeye karar akış SIMD Extensions içinde .fft_sse.c
Şimdi CUDA eklemek istiyorsunuz , bu yüzden eklersiniz fft_cuda.c
, ancak yıllardır kullandığınız test veri kümesiyle CUDA sürümünün SSE sürümünden daha yavaş olduğunu bulun! Biraz analiz yaparsınız ve 100 kat daha büyük bir veri kümesi eklersiniz ve beklediğiniz hızlanmayı elde edersiniz, ancak şimdi CUDA sürümünü kullanmak için kurulum süresinin önemli olduğunu ve küçük veri kümeleriyle Bu kurulum maliyeti olmadan algoritma.
Bu vakaların her birinde aynı algoritmayı uyguluyorsunuz, hepsi aynı şekilde davranmalı, ancak farklı mimarilerde farklı verimlilik ve hızlarla çalışacaklar (eğer çalışırlarsa). Kod açısından bakıldığında, aynı arabirimin neden farklı şekillerde uygulandığını bulmak için herhangi bir kaynak dosya çiftini karşılaştırabilirsiniz ve genellikle en kolay yol orijinal optimize edilmemiş sürüme geri dönmektir.
Aynı şey, optimize edilmemiş algoritmayı uygulayan bir temel sınıf ve türetilmiş sınıfların farklı optimizasyonlar uyguladığı bir OOP uygulaması için de geçerlidir.
Önemli olan aynı şeyleri tutmaktır aynıdır böylece, farklılıklar ortada .