#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.
*/