Mehmet

WFN Üye
Konular
1,067
Mesajlar
1,068
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
İlk yapılacak iş, açılış süresini tahmin etmek yerine ölçmektir. Uygulamanın başlangıcını; işlemci kullanımı, disk erişimi, ağ beklemesi, veritabanı bağlantısı ve kullanıcı arayüzünün oluşturulması olarak ayrı bölümlere ayırın. Ardından en uzun süren bölümü erteleyin, yalnız gerektiğinde yükleyin, gereksiz dosya ve bağlantıları başlangıçtan çıkarın. Çoğu C++ masaüstü uygulamasında en belirgin hızlanma, daha hızlı kod yazmaktan önce açılış sırasında yapılan işi azaltmakla elde edilir.

Yavaş açılışın gerçek nedenini nasıl bulabilirsiniz?​


Bir uygulamanın geç açılması tek bir nedene bağlı olmayabilir. Pencere ekrana gelmeden önce yapılan her işlem toplam süreye eklenir. Örneğin ayar dosyasını okuma, büyük bir yapılandırmayı ayrıştırma, veritabanına bağlanma, ağ adresine ulaşma, eklentileri yükleme, yazı tiplerini veya görselleri hazırlama ve ana pencere içindeki bütün kontrolleri oluşturma aynı başlangıç zincirine konulmuş olabilir.

Önce açılışın nerede başladığını ve nerede bittiğini belirleyin. En basit ölçüm için, ana fonksiyonun başında ve ana pencerenin görünür hâle geldiği noktada yüksek çözünürlüklü zaman ölçümü alın. Windows üzerinde C++ için std::chrono::steady_clock kullanılabilir:

C++:
#include <chrono>
#include <iostream>

using Clock = std::chrono::steady_clock;

int main()
{
    const auto start = Clock::now();

    // Ayarlar, veritabanı, ana pencere ve diğer başlangıç işlemleri burada yapılır.

    const auto end = Clock::now();
    const auto elapsed =
        std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

    std::cout << "Baslangic suresi: " << elapsed << " ms\n";
}

Bu ölçüm yalnızca toplam süreyi gösterir; hangi işlemin yavaş olduğunu kanıtlamaz. Bu nedenle ölçümü alt adımlara bölün. Ayar dosyasını okuma, veritabanı bağlantısı, arayüz oluşturma ve ilk veri yükleme için ayrı zaman noktaları koyun. Her ölçümün başlangıç ve bitişini aynı iş akışında tutun; aksi hâlde bir bölümün süresini başka bir bölümle karıştırabilirsiniz.

Ölçümün birden çok çalıştırmada benzer olması önemlidir. İlk çalıştırmada işletim sistemi önbelleği boş olabilir, sonraki çalıştırmalarda dosyalar önbellekten okunabilir. Bu iki durum aynı değildir. Ayrıca hata ayıklama derlemesi, semboller ve ek günlük kayıtları da süreyi etkileyebilir. Performans karşılaştırmasını mümkün olduğunca optimizasyon açık bir derlemede ve aynı makinede yapın; ancak yalnızca hızlı derlemede ölçüm alıp hata ayıklama sürümündeki gerçek sorunu göz ardı etmeyin.

En sık görülen yavaş açılış nedenleri​

BelirtiMuhtemel nedenİlk düzeltme
Pencere uzun süre görünmezBaşlangıçta ağ, veritabanı veya büyük dosya bekleniyorAna pencereyi önce gösterip bekleyen işi arka planda yürütmek
Disk kullanımı açılışta yükseliyorÇok sayıda küçük dosya veya büyük kaynak okunuyorGerekli dosyaları birleştirmek, önbellek kullanmak ve yüklemeyi ertelemek
İşlemci kullanımı uzun süre yüksekBüyük veri ayrıştırma, indeks oluşturma veya hesaplama başlangıçta yapılıyorVeriyi parçalara ayırmak veya hesabı arka plana taşımak
Pencere geliyor ancak kullanılmıyorArayüz oluşturulduktan sonra senkron veri yükleme sürüyorİlk görünüm için gereken en küçük veriyi yüklemek
Yalnızca bazı bilgisayarlarda yavaşDisk, ağ, güvenlik yazılımı, sürücü veya donanım farkıAynı ölçümü farklı makinelerde alıp beklenen kaynağı karşılaştırmak
Tablodaki belirti yalnızca bir başlangıç göstergesidir. Örneğin yüksek işlemci kullanımı mutlaka verimli hesaplama yapıldığı anlamına gelmez; döngü içinde bekleme veya tekrar tekrar bellek ayırma da aynı görüntüyü oluşturabilir. Benzer biçimde düşük işlemci kullanımı uygulamanın hızlı olduğu anlamına gelmez; program ağdan veya diskten yanıt bekliyor olabilir.

Ağ ve veritabanı bağlantısını açılıştan çıkarın​


Bir sunucuya bağlanmak, DNS çözümlemek, kimlik doğrulamak veya veritabanı sorgusu çalıştırmak değişken süreli işlemlerdir. Ağ erişimi olmayan bir bilgisayarda bu işlem daha da uzun sürebilir. Kullanıcı arayüzünün gösterilebilmesi için bağlantının tamamlanması gerekmiyorsa bağlantıyı başlangıç zincirinden çıkarın.

Uygulama önce temel pencereyi ve bağlantı durumunu gösterir. Daha sonra bağlantı ayrı bir işte başlatılır. Bağlantı başarılı olursa gerekli veri yüklenir; başarısız olursa kullanıcıya uygulamanın açılmasını engellemeden çevrimdışı çalışma, yeniden deneme veya bağlantı ayarlarını düzeltme seçeneği sunulur. Ağ işini doğrudan kullanıcı arayüzü iş parçacığında yürütmeyin; bu iş parçacığı pencere mesajlarını işlediği için beklediğinde pencere donmuş gibi görünür.

Buradaki amaç, bağlantıyı hızlandırmış gibi görünmek değil, bağlantı beklenirken kullanıcı arayüzünü kullanılabilir bırakmaktır. Uygulamanın çalışabilmesi için sunucu verisi zorunluysa, pencereyi tamamen işlevsel göstermeyip açıkça “bağlanıyor” durumunu belirtin. Kullanıcının düzenleyebileceği bir ekranı veri gelmeden etkinleştirmek yanlış veya eksik veriyle işlem yapılmasına neden olabilir.

Büyük dosyaları ve yapılandırmayı parça parça yükleyin​


Başlangıçta tüm ayar dosyasını, bütün projeyi veya tüm geçmiş kayıtlarını belleğe almak çoğu zaman gerekli değildir. İlk ekranda gösterilecek kayıtları yükleyin; ayrıntıları kullanıcı ilgili bölümü açtığında okuyun. Liste ekranında yalnızca kimlik, başlık ve tarih gerekiyorsa büyük açıklama alanlarını aynı sorguya veya dosya okuma işlemine katmayın.

Dosya okuma süresi yüksekse dosyanın boyutunu, dosya sayısını ve ayrıştırma süresini ayrı ayrı ölçün. Çok sayıda küçük dosyada dosyaları açıp kapatma maliyeti öne çıkabilir; tek ve büyük bir dosyada ise ayrıştırma veya gereksiz veri okuma baskın olabilir. Bu sonuçlara göre dosyaları birleştirmek, biçimi değiştirmek veya bir indeks oluşturmak değerlendirilebilir. Ancak yalnız dosyayı sıkıştırmak her zaman çözüm değildir; sıkıştırılmış veriyi açma maliyeti diskte kazanılan süreden büyük olabilir.

Ayar dosyasını okurken her açılışta varsayılan değerleri yeniden üretmek, aynı metni tekrar tekrar ayrıştırmak veya kullanılmayan bölümleri işlemek de gereksiz maliyet oluşturur. Ayarlar değiştiğinde oluşturulan bir önbellek kullanılabilir. Önbelleğin geçerli olup olmadığını sürüm numarası, dosya değişiklik zamanı veya yapılandırma şemasıyla kontrol edin. Önbellek geçersizse yeniden oluşturun; geçerliyse doğrudan kullanın. Bu yöntem, dosya biçimindeki değişiklikleri kontrol etmeden eski veriyi kullanma hatasını önler.

Arayüzü tek seferde oluşturmak yerine ilk görünümü küçültün​


Ana pencerenin içindeki bütün sekmeleri, grafik bileşenlerini, önizlemeleri ve raporları açılışta oluşturmak yerine yalnızca ilk görünen bölümü hazırlayın. Kullanıcı bir sekmeye geçtiğinde o sekmenin kontrolleri ve verileri oluşturulabilir. Bu yaklaşıma gecikmeli yükleme denir.

Gecikmeli yükleme, her şeyi rastgele bir zamanda yüklemek değildir. Kullanıcı bir bölümü açtığında kısa süreli bekleme yaşanabilir. Bu nedenle yükleme sırasında bekleme göstergesi verin, aynı işlemi tekrar başlatmayın ve sonuç geldiğinde kullanıcının seçtiği bölümün hâlâ geçerli olduğunu kontrol edin. Kullanıcı sekmeyi değiştirdiyse eski işin sonucunu yanlış ekrana yazmayın.

Bir kontrolün oluşturulması pahalıysa yalnız görünür olduğunda oluşturulması hız kazandırabilir. Fakat çok küçük kontrolleri sırf gecikmeli yükleme kullanmak için ayırmak kodu karmaşıklaştırır. Ölçümde anlamlı süre oluşturmayan işlemleri bölmek yerine, gerçekten uzun süren veri hazırlama ve görsel üretim adımlarına odaklanın.

Arka plan iş parçacığı kullanırken dikkat edilmesi gerekenler​


Ağ erişimi, dosya taraması, büyük veri ayrıştırma ve uzun hesaplamalar ana kullanıcı arayüzü iş parçacığından ayrılabilir. Ancak iş parçacığı kullanmak tek başına uygulamayı hızlandırmaz. Aynı işlemci çekirdeklerini paylaşan iki ağır iş, toplam süreyi artırabilir; ayrıca veriye erişim için kilit beklemek de yeni bir darboğaz oluşturabilir.

Güvenli bir akış şu şekildedir:
  1. Ana iş parçacığında pencereyi ve başlangıç durumunu oluşturun.
  2. Uzun süren işi, gerekli girdileri belirlenmiş bir arka plan işine gönderin.
  3. Arka plan işi yalnızca kendisine ait veriler üzerinde çalışsın veya paylaşılan veriye kontrollü erişsin.
  4. İş tamamlandığında sonucu ana iş parçacığına taşıyın.
  5. Ana iş parçacığında yalnızca arayüz güncellemesini yapın.
  6. Hata, iptal ve yeniden deneme durumlarını ayrı ele alın.
Arka plan işinde oluşturulan bir arayüz nesnesini doğrudan değiştirmek birçok masaüstü arayüz kütüphanesinde güvenli değildir. Sonuç verisini arka planda hazırlayıp arayüz değişikliğini arayüzün kendi iş kuyruğuna göndermek gerekir. Uygulama kapanırken arka plan işinin yaşam süresini de yönetin; pencere kapandıktan sonra tamamlanan bir iş, artık var olmayan bir arayüze erişmemelidir.

Bir iş parçacığına taşımadan önce ölçüm alın. Süreyi azaltmak yerine yalnız pencerenin daha erken görünmesini sağlayabilirsiniz. Bu kullanıcı deneyimi açısından yararlı olabilir, fakat arka plandaki iş hâlâ çok uzunsa uygulama kaynak tüketmeye devam eder. Hem ilk kullanılabilirlik süresini hem de arka plan işinin tamamlanma süresini ayrı izleyin.

Derleme ve dağıtım kaynaklı yavaşlıklar​


C++ uygulamasında açılış performansı yalnızca kaynak koda bağlı değildir. Hata ayıklama derlemesi, gereksiz günlük kayıtları, sembol yükleme, dinamik kütüphanelerin aranması ve antivirüs taraması da sonucu etkileyebilir. Bu nedenle karşılaştırma yaparken hangi derlemenin, hangi makinede ve hangi veriyle çalıştırıldığını kaydedin.

Optimizasyonlu derlemede hızlanan fakat hata ayıklama derlemesinde yavaş kalan bir bölüm, doğrudan kullanıcı sürümünde aynı ölçüde sorun yaratmayabilir. Buna karşılık yavaş dosya okuma, ağ beklemesi veya veritabanı sorgusu derleme türünden bağımsız olarak sorun oluşturabilir. Bu ayrım, yalnız derleyici seçeneklerini değiştirerek çözülemeyecek beklemeleri erken fark etmenizi sağlar.

Dinamik kütüphaneler yüklenirken arama yollarını ve bağımlılıkları kontrol edin. Eksik veya yanlış sürümdeki bir kütüphane için işletim sisteminin uzun süre arama yapması, hata mesajı göstermeden önce açılışı geciktirebilir. Uygulamanın dağıtım klasöründe gereken bağımlılıkların bulunduğunu ve çalışma zamanında kullanılan sürümlerin hedef sistemle uyumlu olduğunu doğrulayın. Bu kontrol, yalnızca geliştirici bilgisayarında değil, temiz bir test makinesinde de yapılmalıdır.

Ölçümden sonra doğru düzeltmeyi seçme​


Ölçüm sonucunu şu sırayla yorumlayın:
  1. Tek bir işlem toplam sürenin büyük bölümünü oluşturuyorsa önce o işlemi küçültün, erteleyin veya arka plana taşıyın.
  2. Birçok küçük işlem benzer süreler oluşturuyorsa başlangıç akışını sadeleştirin ve tekrarları kaldırın.
  3. Süre değişkense ağ, dosya sistemi, veritabanı veya dış süreç beklemelerini araştırın.
  4. Pencere erken görünüyor ancak kullanılamıyorsa ilk etkileşim için gereken işi diğer başlangıç işlerinden ayırın.
  5. Yalnız belirli sistemlerde sorun varsa aynı ölçümü donanım, disk, işletim sistemi ve güvenlik yazılımı bilgileriyle karşılaştırın.
Aşağıdaki örnek varsayımsaldır: ölçümde toplam açılış süresi 4.000 milisaniye, bunun 2.500 milisaniyesi ağ bağlantısı, 900 milisaniyesi arayüz oluşturma ve 600 milisaniyesi ayar okuma olsun. Burada arayüz kontrollerini yüzde 10 hızlandırmak toplam süreyi yaklaşık 90 milisaniye azaltır. Ağ bağlantısını kullanıcı arayüzünden ayırmak ise pencerenin kullanılabilir hâle gelmesini yaklaşık 2.500 milisaniye öne çekebilir; bağlantı işleminin tamamlanma süresi yine ayrı bir sonuç olarak izlenmelidir. Bu hesap kesin bir performans sonucu değil, darboğazın neden önce ele alınması gerektiğini gösteren basit bir önceliklendirme örneğidir.

Bir değişiklikten sonra yalnız yeni toplam süreyi kaydetmeyin. Değişikliğin hangi alt adımı etkilediğini, ilk çalıştırma ile sonraki çalıştırma arasındaki farkı ve uygulama kullanılabilir hâle geldikten sonra devam eden işleri de kaydedin. Toplam süre azalmış olsa bile hata oranı, bellek kullanımı veya kullanıcı arayüzünün yanıt verme durumu kötüleştiyse değişiklik başarılı sayılmaz.

Uygulanabilir bir açılış planı​


C++ masaüstü uygulamanız için şu sırayı izleyin:
  1. Ana fonksiyonun başlangıcını ve pencerenin kullanılabilir hâle geldiği noktayı ölçün.
  2. Ayar okuma, dosya tarama, ağ, veritabanı, arayüz oluşturma ve ilk veri yüklemeyi ayrı süreler olarak kaydedin.
  3. Birden çok çalıştırmada aynı bölümün gerçekten yavaş olduğunu doğrulayın.
  4. Pencerenin görünmesi için zorunlu olmayan işlemleri başlangıçtan çıkarın.
  5. Ağ, veritabanı ve büyük hesaplamaları uygun yaşam süresi ve iptal yönetimiyle arka plana taşıyın.
  6. İlk ekranda gösterilmeyen verileri gecikmeli yükleyin.
  7. Değişiklikten sonra hem ilk kullanılabilirlik süresini hem de arka plandaki işin tamamlanma süresini yeniden ölçün.
  8. Düzeltmenin yalnızca geliştirici bilgisayarında değil, hedef donanım ve temiz dağıtım ortamında da geçerli olduğunu kontrol edin.
Ölçümde belirgin bir darboğaz görünmüyorsa rastgele optimizasyon yapmayın. Bu durumda açılış günlüğüne işlem adı, başlangıç zamanı, bitiş zamanı, hata durumu ve mümkünse kullanılan veri boyutunu ekleyin. Sorun yalnız bazı kullanıcılarda görülüyorsa bu günlükte kişisel veri veya gizli bağlantı bilgisi tutmadan; işletim sistemi, işlemci, disk türü, uygulama sürümü, ilk çalıştırma olup olmadığı ve ilgili süreleri toplayın. Böylece “yavaş açılıyor” bilgisini, hangi koşulda hangi adımın uzadığı görülebilen bir hata kaydına dönüştürebilirsiniz.

Sık sorulan sorular​

Ana pencereyi hemen göstermek uygulamayı gerçekten hızlandırır mı?​

Kullanıcının pencereyle etkileşime geçebilme süresini azaltabilir; ancak arka plandaki işlemler devam ediyorsa toplam açılış işini hızlandırmış olmaz. Bu nedenle hem ilk kullanılabilirlik süresini hem de başlangıç işlemlerinin tamamlanma süresini ayrı ölçün.

Her yavaş işlemi ayrı bir iş parçacığına taşımak doğru mudur?​

Hayır. İş parçacığı, ağ veya disk beklemesini arayüzü kilitlemeden yürütmeye yardımcı olabilir; fakat CPU ağırlıklı işlerde çekirdek paylaşımı, kilit beklemesi ve veri kopyalama ek maliyet doğurabilir. Önce ölçün, sonra yalnız uygun işi taşıyın.

Derleyici optimizasyonunu açmak açılış sorununu çözer mi?​

Büyük hesaplamalarda yardımcı olabilir, fakat ağ beklemesi, yavaş disk erişimi, veritabanı bağlantısı veya gereksiz veri yükleme gibi sorunları çözmez. Optimizasyonlu derlemede ölçüm alın, ancak darboğazın türünü belirlemeden yalnız derleme ayarlarına güvenmeyin.

SSD kullanmak uygulamanın her zaman hızlı açılmasını sağlar mı?​

SSD, dosya erişimini hızlandırabilir; ancak uygulama ağ yanıtı bekliyor, büyük veriyi ayrıştırıyor veya başlangıçta gereksiz hesaplama yapıyorsa ana sorun değişmez. Disk değişikliğinden önce ve sonra alt adımları ölçerek gecikmenin gerçekten diskten kaynaklandığını doğrulayın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic