Ana içeriğe atla

C++ Algoritma ve Hız Testleri Uygulaması

 

#include <iostream>

#include <string>

#include <cmath>

#include<chrono>//Algoritmalar arasında performans hızını test etmede kullanılır

using namespace std;

/* Algoritma Alıştırma

* Kullanıcıdan tam sayı değeri alınız

* Kullanıcının 1'den girdiği sayıya kadar tüm asal sayıları bulunuz

* örn : Kullanıcı 100 girdi ise : Tüm asal sayıları bulunuz

* asal sayı sadece kendisine ve 1'e bölünebilen sayıdır.

*/

/*

int main() 

int sayi;

cout << "Lutfen bir sayi giriniz : ";

cin >> sayi;


for (int i = 1; i <= sayi; i++) //1 asal sayı kabul edilmez : Hersayının kendine bölümü 1 dir.

{

//if (i == 1) continue; //1 asal sayı kabul edilemdiğinden contiune ile devam ettirebiliriz.Yada int i=1 yerine 2 diyebiliriz

//Yani bir sayının bölümünden kalan 0 (sıfır) olmalalıdır.

int sayac = 0; //girilen sayılar içinde kalan sıfır ise sayac herzaman sıfırlanır ve bir artar sonraki sayıyı hesaplamak için

for (int j = 1; j <= i; j++) 

{

if (i % j == 0)

sayac++;

}

if (sayac == 2)

cout << i << ", ";

}


cout << endl;

return 0; 

}

*/

//Algoritma Performans iyileştirme

//int main()

//{

// int sayi;

// cout << "Lutfen bir sayi giriniz : ";

// cin >> sayi;

//

// for (int i = 1; i <= sayi; i++) //1 asal sayı kabul edilmez : Hersayının kendine bölümü 1 dir.

// {

// //if (i == 1) continue; //1 asal sayı kabul edilemdiğinden contiune ile devam ettirebiliriz.Yada int i=1 yerine 2 diyebiliriz

// //Yani bir sayının bölümünden kalan 0 (sıfır) olmalalıdır.

//

// int sayac = 0; //girilen sayılar içinde kalan sıfır ise sayac herzaman sıfırlanır ve bir artar sonraki sayıyı hesaplamak için

// for (int j = 1; j <= i; j++)

// {

// if (i % j == 0)

// sayac++;

// if (sayac > 2)

// break; //Kalan sıfır değil ise döngünün sonuna kadar gitmesine gerek kalmaz ve sayacı bir arttrır daha hızlı çalışır

// }

// if (sayac == 2)

// cout << i << ", ";

// }

//

// cout << endl;

// return 0;

//}

//Farklı Algoritmaların performansını nekadar MicroSaniye (ms) çalıştığını hesaplama

int main()

{

//Performans hesaplama için kodumuzun başına ve sonun uygulanan formul

//chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

//chrono ile ms hesaplamada dikkat edilmesi gereken nokta,

//Kullanıcıdan veri geldikten sonra hesaplama fonksiyonunu kullanmak

//sadece hesabın nekadar sürede olduğunu ortaya koyar

//chrono kullanıcının veri girmesini beklerse süre uzar !!!!

int sayi;

cout << "Lutfen bir sayi giriniz : ";

cin >> sayi;

chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

for (int i = 1; i <= sayi; i++)

{


int sayac = 0;

/*

for (int j = 1; j <= i; j++)

{

if (i % j == 0)

sayac++;

//if (sayac > 2)// bu fonsiyona 10000 yazıldığında  çalışma hızı : Time difference = 5215812[us] 

// yazılmadığında Time difference = 4974711[us]

// break;

}

*/

//Kodun geliştirilmiş hali

// 4.9 saniyeyi 0.05 saniyeye düşüren mantık:

for (int j = 2; j * j <= i; j++) // j <= sqrt(i) ile aynı şeydir

{

if (i % j == 0) {

sayac++;

break; // Burada break çok işe yarar!

}

}

/*

sqrt(), karmaşık matematiksel hesaplamalarda karekök bulmanı sağlar. Ama asal sayı bulma gibi döngünün milyonlarca kez döneceği yerlerde,  karesini alarak kıyaslamak (j*j) profesyonel bir hızlandırma taktiğidir.

"Karekök fonksiyonu (sqrt) kullanmak yerine j*j kullanarak işlemciyi fonksiyon hesaplama yükünden kurtardık."

*/

if (sayac == 0 && i > 1)

cout << i << ", ";

/* Kodun Çıktısı ve Çalışma hızı

        Lutfen bir sayi giriniz : 10000

Time difference = 168307[us]

*/

}

cout << endl;

//end sayesinde formulu bitirdik süreyi hesapladık

chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

std::cout << "Time difference = " << chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[us]" << std::endl;

//std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[us]" << std::endl;

cout << endl;

return 0;

}

/* Hız testleri hakkında

* Hız testleri proje tamamlandıktan sonra yapılmalıdır.

* Kodun içinde hız testi yapmak proje sonunda projeyi dahada yavaşlatabilir.

* Hız testleri bu sebepten proje tamamen bittikten sonra yapılır

* Kodun içinde yapılan test kendisinden sonraki gelen kodlara uygulanmayacaktır bu durum projenin yavaşlamasına sebep olabilir

* Asıl temiz test sonucu büyük verilerde ortaya çıkar

* Örneğin break kendisinden sonra gelen kodları çalıştırmaz bu durumda

* kodun daha hızlı çaılşmasını beklemek hatalı test sonucu almamıza neden olabilir ama

* küçük bir kod parcasında break 'den sonra gelen kodun çalışması kodun daha yavaş çalışıyor anlamına gelmez

* bu durumu özetleyecek olursak özellikle büyük testlerde herzaman proje bittikten sonra 

* testin yapılması daha temiz sonuçlar verir.

* Projenin yazıldığı ortam ile projenin çalıştırılacağı cihaz özellikleride çalışma hızlarını iki ortamda da farklılık  gösterebilir

* Arkaplanda çalışan uygulamalar CPU ve GPU RAM ortam sağlayıcılarının yoğunluğunu da göz önünde bulundurmakta fayda var.

*/

Bu blogdaki popüler yayınlar

C++ float double string Aritmatik işlemler

  #include <iostream> using namespace std; //void fonk()  //{ // cout << "Merhaba\n"; //} // //int main()  //{ // cout << "Merhaba C++\n"; // // fonk(); // return 0; //} /* int main()  { //Değişkenler rakam ile başlayamaz //Değişken isimlerinde türkçe karakter olmaz //değişken isimleride boşluk olmaz //Değişken isimlerinde nokta vb karakter olmaz //******************************************** //int ram'da 4 byte yer kaplıyor -2147483648 to 2147483647 //char 1 byte  (ASCII tablosu) //bool 1 byte //float 4 byte //double 8 byte //CPU ramdan byte byte okur //Void herhangi bir return etmiyecekse kendi aldığı değerleri kullanır.Bir değer döndürmez. string isim; isim = "Kaan"; int yas; yas = 22; cout << "Bir zamanlar " << isim << " isminde bir genc varmis." << endl << isim << " " << yas << " yasindaymis." ...

C++ try catch, Call by Value, Call by Referans Kullanımı

  #include <iostream> using namespace std; //int main()  //{ // int bolunen, bolen; // cout << "Lutfen bolunen sayiyi giriniz : "; // cin >> bolunen; // cout << "Lutfen bolen sayiyi giriniz : "; // cin >> bolen; // // int sonuc; // // try{ // if (bolen == 0) // throw 99;//Burada throw için herhangi bir tam sayı girilir.örn: negatif sayılar gibi durumlar için çoğaltılabilir // sonuc = bolunen / bolen; // // cout << "Sonuc : " << sonuc; // } // catch(int hataKodu){ // cout << "Bolen sayi sifir olmamali !!" << endl; // } // // cout << endl; // return 0; //} /* try catch Kullanımı :  * try catch kullanıcının beklenmedik bir girdi vermesi sonucu  * programın çökmesini engllemek amacı ile kullanılır * Ayrıca veri tabanı bağlantılarında bağlantının olmaması ve  * işlem sonrasında veri tabanı bağlantısını kapatma veya programın başlangıcında bağlantıyı a...

Pointer ve & (ampersant) Konusunu Kavrayalım

  #include <iostream> #include <string> using namespace std; /* int main()  {  int x = 7; cout << "x 'in degeri : " << x << endl; cout << "x 'in RAM deki adresi : " << &x << endl;  // & ile ramdeki ilk adres değeri  000000D3ED4FFCF4 ni bulduk  // int 4 byte oldugundan bu adresde dahil 4 byte 'lik yerin tamamını hesaplar // ama bize  4 byte lik adresin ilk değerini verir. return 0;  } */ /* int main() { // Pointer  ve & (ampersant) Konusunu Kavrayalım int x = 7; int *p = &x; // pointer ile x 'in adres değerini bulma cout << "x 'in degeri : " << x << endl; cout << "x 'in & ile RAM deki adresi : " << &x << endl; //pointer ile gösterimi cout <<"pointer p ile adres degeri : "<< p << endl; cout << "*p ile ( *p = &x) x in pointer degeri : " <...