Profiler Olmadan Performans Tahmini Neden Yanıltıcı

Yazılımcı olarak bir kodu hızlandırmaya karar verdiğinde ilk yapılan genellikle şu olur: "Bu kısım yavaş olmalı, oraya bakalım." Sonra döngü açılır, string concatenation bulunur, veya bir liste kopyalaması göze çarpar. Sonra da değişiklik yapılır, "Kesinlikle hızlandı" denir. Ama profiler açıldığında çoğu zaman hiç bir şey değişmemiştir.

Bu, yazılım performansının en yaygın yanlış anlaşılmasıdır. İnsan beyni, kodda neyin yavaş olduğunu tahmin etmede inanılmaz derecede kötüdür. Bir fonksiyonun yüzde 80'ini harcayan kodu görmezden gelip, yüzde 2'lik bir döngüyü optimize etmek çok kolaydır.

Gerçek sorun şudur: CPU cache, branch prediction, compiler optimizations ve runtime behavior hakkında sezgi geliştirmek çok zordur. Bir diziye erişim, bir fonksiyon çağrısı, bir bellek ayırma işlemi, bunların her birinin maliyeti bağlama göre değişir. Aynı kod, farklı veri setleriyle çalıştırıldığında tamamen farklı performans gösterebilir.

Microsoft'un eski bir çalışmasında geliştiricilerin tahmin ettikleri performans병목(bottleneck) yerleri ile profiler'in bulduğu yerler karşılaştırılmıştı. Başarı oranı yüzde 30'un altındaydı. Yani altı tahmininden beşi yanlıştı.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Bu neden önemli? Çünkü micro-optimization avı zaman kaybettirir. Bir geliştirici, yanlış yere bakarak saatler harcayabilir. O saatler, gerçek병목 yerlerini bulmaya veya algoritma değiştirmeye harcanabilir. Algoritma değişikliği, genellikle micro-optimization'dan yüz kat daha etkilidir.

Doğru yaklaşım basittir: Ölçümle başla. Profiler aç, kodu çalıştır, verileri oku. Sonra optimize et. Go'da pprof, Python'da cProfile, C#'ta dotTrace gibi araçlar var. Bunlar ücretsiz veya ucuzdur.

Profiler olmadan "bu hızlandırılmalı" demek, tıbbi teşhis yapmadan ameliyat planlamak gibidir. Sonuç, çoğu zaman hastaya zarar verir. Performans optimizasyonunda da aynıdır: ölçümü atlayan optimizasyon, genellikle kodu karmaşıklaştırır ve hiç bir şey kazandırmaz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

4 yorum

  • adlı kullanıcıya yanıt verdi
    sonbirbakis

    işte o zaman anladın işin püf noktasını ya profiler olmadan kod okuyup tahmin etmek çoğu zaman boşa çaba çıkıyor ki asıl sorun bambaşka bir yerde

  • adlı kullanıcıya yanıt verdi
    kucuksehir

    işte ya ben de string birleştirmeyi düzelttim sanmıştım sonra profiler açtım orası tamamen farklı bir yerde patlıyordu

  • sonbirbakis

    bunu çok yaşadım Bir zamanlar bir sistemi hızlandıracağız diye kodu düzenledim çıktı ki hiç bir şey değişmemiş

  • adlı kullanıcıya yanıt verdi
    kucuksehir

    ama bilirsin ya şimdi de hep profiler açıyorum olmadan adım atmıyorum artık