Şimdi Ara

Uygulamaya İşlemci Kısıtlaması Getirmek (Verimliliğini anlamak için)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
11
Cevap
0
Favori
179
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba arkadaşlar belki bir çoğumuzun anlayamadığı şey uygulamanın farklı versiyonlarının verimliliği çünkü işlemci çok hızlı olduğu için aynı işi yapan çok verimli uygulama ile çok verimsiz uygulamanın arasındaki hız farkını anlayamıyoruz belki bir çoğumuz kendimizi ne gerek var canım artık yavaş bilgisayarlar geride kaldı artık ddr4 bellekler i7 işlemciler var nasıl yazarsan yaz hız farkını anlayamazsın yaz gitsin kodun verimliliğinin canı cehenneme! diyerek kendimizi avutuyoruz ve kendimizi çok prof programcı zannedebiliyoruz tabi herkes için demiyorum ama bu hataya düşen insanlar var şimdi bazılarınız hatamı ? dediğini duyar gibiyim bence hata çünki bu yaptığımız tutarsızlıklar işlemcilere çektirdiğimiz acılar :D elbet birgün bizi yakalayıp pataklıyacaktır buna inanıyorum.. şimdi gelelim asıl konumuza ben bir uygulamanın birçok verisoyununu yazdığımı hatırlıyorumda ama arasındaki hız farkını hiç hatırlamıyorum çünki farkedemedim bunu anlamak içinde gidip düşük seviyeli bir pc almak istemiyorum bunu kendi bilgisayarımda yapabilirmiyim diye düşünüyorum yani asıl yapmak istediğim şey mesela işlemcimin hızı 2.5 ghz ise ben işlemcinini bu uygulama için gücünü kısıtlamasını ve tıpkı 2.0 mhz lik bir işlemci gibi veya daha düşük hızda bir işlemeci gibi davranmasını istiyorum bu sayede işlemci uygulamayı daha yavaş çalıştırdığı için, yani olduğundan çok daha düşük hızda bir işlemci gibi davrandığı için hız farkını anlayabilirim hatta gerekirse bunu bellek içinde yapmak istiyorum yani bellekte benim koyduğum örneğin 2 kb sınırını aşmasını istemiyorum işte bunu nasıl yaparım bunu yaparsam bu sayede kodlarımın arasındaki hız farkını anlayabilirim yardımlarınız için hepinize çok teiekkürler...
    prof bir programcı olmak dileğiyle... diyorum yardımlarınızı bekliyorum...







  • Ne sorduğunu anlamadım ama concurrency'den bahsediyorsun diye düşünüyorum. Concurrency uygulama alanlarına göre değişen bir şey, silikon vadisinde front-end/back-end yazılım geliştiren bazı abilerimiz concurrency'yi pek kullanmadıklarını söylerken savunma sanayi ile ilgilenen arkadaşlarımız multithreading/multiprocessing'den baya yararlandıklarını söylüyorlar. Şunu bilmen lazım ki bilmeden yapılmış concurrency kötüdür, programın gücünü arttırayım derken işletim sisteminin thread yönetimine göre genel bir performans düşüşü yaşayabilirsin.

    Bu yüzden bu işlemleri programlama dilleri yapmalı diyen araştırmacılar var. Bu araştırmacılardan en yetkinleri Carnegie Mellon'da görev yapan Onur Mutlu ve Umut Acar. Şuradan bu değerli insanların çalışmalarına ulaşabilirsin:
    https://www.csd.cs.cmu.edu/people/faculty/umut-acar
    https://users.ece.cmu.edu/~omutlu/

    Disclaimer: Bunlar denediğim şeyler değil, sadece teorik konuşuyorum.



    < Bu mesaj bu kişi tarafından değiştirildi onepl -- 31 Ocak 2016; 18:24:47 >




  • onepl O kullanıcısına yanıt
    şey ingilizcem iyi olmadığı için verdiğiniz linklerden fazla birşey anlayamadım benim demek istediğim şey işlemcinin gücünü belirli uygulama için kısıtlama yöntemleri nebileyim belki bu dediğim şey bir başka bir programla veya programlarla oluyordur veya çeşitli kütüphaneler yardımıyla oluyordur...
  • Dediğin şeyi işletim sistemleri kendileri yapıyor zaten, bununla senin uğraşmana gerek yok. Eğer sadece meraktan sorduğun bir soruysa bu memory management konusunu araştırabilirsin. Pek bilgili olduğum bir alan değil ama. Zaten yanlış bir bilgi vermişsem arkadaşların düzelteceğini düşünüyorum.
  • Sen yazdığın kodların çalışma hızlarını gözünle mi ölçmeye çalışıyorsun pek anlayamadım. Kodun başına ve sonuna sayaç koyarsın, ne kadar kaliteli iş yaptığın ortaya çıkar. Ne kadar bellek kullandığın da görev yöneticisinde görünür bu kadar basit.
  • hocam programın sonlanma zamanı konsolda gözüküyordu sanırım ama sürekli değişiyordu yalnış hatırlamıyorsam acaba bir örnek verebilirmisiniz programın belirli kodlarının nekadar sürede çalıştığını nasıl anlayabiliriz C koduyla örnek verebilirsiniz

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • Harun2525 H kullanıcısına yanıt
    Yani bizim program yazdığımız Windows, Linux, MacOS, Android, IOS gibi işletim sistemlerinde herhangi bir program her çalıştırıldığında aynı işi yapsa dahi farklı zamanlarda bu işi tamamlayacaktır, çünkü o an programda işlemcinin cache'si tarafından ayrılmış hafıza miktarı farklı olabilir, o esnada başka programlar da işlemciyi meşgul ediyordur diye birsürü sebep sayılabilinir. Ha ne yapılır belki o program değişik koşullar altında 100 kere çalıştırılıp bu 100 örneğin bir ortalaması alınabilinir herhalde.

    İşlemcinin hızının kısıtlanabileceğini zannetmiyorum. Ona dair bir API'de duymadım şimdiye kadar. Mesela gerçi herhangi bir programın yani process'in (veya thread'in) hız önceliği değiştirilebilinir ancak bu da senin istediğin şeye tam cevap değil.

    Fakat şöyle birşeyden bahsedeyim:
    Modern işlemcilerde (hatta 20 yıldır falan) direkt işlemcinin saat frekansıyla senkronize çalışan çok yüksek çözünürlüklü kronometreler ve sayaçlar mevcut. Bu sayaçlar saniyenin milyonda biri hassasiyetinde oluyorlar. Onları kullanarak herhangi bir programın veya fonksiyonun performansını ölçebilirsin. Hatta bu yüksek çözünürlüklü sayaçlar sayesinde göze gayet akıcı gelen çeşitli animasyon gösterimleri, film gösterimleri ve mesela oyun motorlarındaki saniyenin her 60'da birinde ekrana yeni görüntü çizilebilmesi mümkün kılınabilmekte. Kısacası tüm senkronizasyon hadiselerinden bu sayaçlar sorumlu dolayısıyla hem performans ölçümü gibi işlerde hem de PERFORMANS KISITLAMASI gibi bir görevde de fevkalade kullanılabilinir ve kullanılıyorlarda.

    Windows için mesela bu sayaçlara erişim için gereken API'ler şunlar:

    QueryPerformanceFrequency fonksiyonu
    QueryPerformanceCounter fonksiyonu
    ve LARGE_INTEGER veri yapısı.




  • Buzz Lightyear B kullanıcısına yanıt
    Hocam acaba bahsettiğiniz apilerle ilgili bir kod örneği verebilirmisiniz

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Harun2525 H kullanıcısına yanıt
    İşlemcilerin performans sayacı bilgisayar açıldığında sıfır değerinden başlayarak her saniye yaklaşık milyon mertebesinde sürekli artar. Tabiyatıyle bilgisayar kapandığında bu değer de kaybolur. Bilgisayar tekrar açıldığında yine en baştan yani sıfırdan başlayarak artar.
    (Her ne kadar bu değer saniyede milyon mertebesinde artsa dahi 64Bitlik bir alanda tutulduğu için bilgisayar açık olduğu müddetçe tekrar sıfırlanıp en başa dönmesi için 1 yıldan bile daha uzun süre geçmesi gerekir. Hadi diyelim ki resetlendi yine de problem olmaz çünkü biz zaten bu sayacı kullanırken başlangıç ve bitiş zamanında aldığımız değerlerin farkını kullanıyoruz.)

    Not: Çok kısa süre içersinde ardarda yapılan ölçümlerde aynı değeri alma olasılığı her zaman vardır fakat "sayaç" kavramının tabiyatı gereği herhangi bir ölçümden sonra yapılan başka bir ölçümün en azından önceki ölçümden daha az olmaması garantilenmiştir.

     

    #include <windows.h> // QueryPerformanceFrequency, QueryPerformanceCounter, APIleri için gereken header.
    #include <iostream>
    using std::cout;
    using std::endl;


    void PerformaniOlculecekFonksiyonVeyaIslemler()
    {
    // vıdı vıdı işler

    for (int i=0; i < 100000; i++)
    {
    // ...
    }
    }

    int main()
    {
    LARGE_INTEGER obj;
    QueryPerformanceFrequency ( &obj );

    const __int64 TickPerSec = obj.QuadPart; // bu değeri programın başında sadece bir kereye mahsus olmak üzere alıp saklıyoruz.
    // bu değer sayacın saniyede kaç kere arttığını belirtir. O da milyon mertebesinde bir sayıdır.
    // bu değer aynı zamanda Her değişik tip işlemcide farklıdır.
    // bu değer bilgisayar çalıştığı müddetçe sabit olacağının garantisi vardır.


    LARGE_INTEGER Baslangic_Zamani, Bitis_Zamani;

    QueryPerformanceCounter ( &Baslangic_Zamani ); // süreyi ölçmek için başlangıç zamanını alıyoruz

    PerformaniOlculecekFonksiyonVeyaIslemler();

    QueryPerformanceCounter ( &Bitis_Zamani ); // ölçüm bittiğinde sayacın geldiği son değeri aldık.

    const __int64 fark = Bitis_Zamani.QuadPart - Baslangic_Zamani.QuadPart; // arada geçen sürede sayaç "fark" kadar tiklemiş

    const double SaniyeCinsinden = double(fark) / double(TickPerSec); // kaç saniye geçtiğini bu şekilde bir dönüşümle bulabiliriz...

    cout << "Performans Sayaci bu bilgisayarda saniyede " << TickPerSec << " kadar artiyor." << endl << endl;

    cout << "Olcum yapilan islemdeki gecen sure ise: " << SaniyeCinsinden << " saniye." << endl << endl;

    system ("PAUSE");

    return 0;
    }




    Bende bu kod şu çıktıları verdi:

    Performans Sayaci bu bilgisayarda saniyede 2732436 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.000253254 saniye.

    Press any key to continue . . .


    Performans Sayaci bu bilgisayarda saniyede 2732436 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.000252522 saniye.

    Press any key to continue . . .


    Performans Sayaci bu bilgisayarda saniyede 2732436 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.000252888 saniye.

    Press any key to continue . . .



    Bendeki işlemci Intel Core i7-930 bu arada (2010 senesinde yaklaşık 300 dolar gibi bir fiyata aldığımı hatırlıyorum)

    Sende bir dene bakalım senin frekans ne çıkacak acaba ?



    < Bu mesaj bu kişi tarafından değiştirildi Buzz Lightyear -- 1 Şubat 2016; 16:57:09 >




  • Buzz Lightyear B kullanıcısına yanıt
    Hocan bende kodlarınızı denedim bendeki çıktılar bu şekilde bu arada benim işlemci i5-4200

    Performans Sayaci bu bilgisayarda saniyede 2240966 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.000341817 saniye.

    Devam etmek için bir tuşa basın . . .


    Performans Sayaci bu bilgisayarda saniyede 2240966 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.00032129 saniye.

    Devam etmek için bir tuşa basın . . .


    Performans Sayaci bu bilgisayarda saniyede 2240966 kadar artiyor.

    Olcum yapilan islemdeki gecen sure ise: 0.000319505 saniye.

    Devam etmek için bir tuşa basın . . .


    hocam verdiğiniz kodlar için çok teşekkürler muhtemelen performans denetimlerini bu kodların C versiyonu şeklinde şekilde yapacağım...
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.