c++ ile asal sayı hesaplanırken donanımlar arası hesaplama süresi farkı.

ShadowMan

Üye
Katılım
22 Kasım 2023
Mesajlar
27
Merhaba, c++ ile 0 dan başlayarak kullanıcının girdiği sayıya kadar olan asal sayıları hesaplayan bir kod yazdım bu kodu yazmamın amacı pi zero 2w cihazım için işlemci overclock stabilitesini sağlamak için gerekli konfigürasyonu yapmaktı. Ancak merak ettiğim ve deneyip şaşırdığım bir durum gözlemledim. Arduino ide ile derlediğim ve pi pico da çalıştırdığımda 100 bin e kadar olan asal sayıları hesaplama süresi 768 milisaniye iken pi zero 2w de ise 106 milisaniye (cpu frekansı 1350 over voltage 4) buraya kadar bir sorun yok zero 2w haliyle daha hızlı ancak kodu ryzen 5 3500u işlemcili bilgisayarımda çalıştırdığımda ise sonuç şaşırtıcı bir şekilde 1233 milisaniye olarak çıktı o sırada işlemci yük altında değil normal bir şekilde çalışıyor bu sonucun işlemci alu'su ile veya komut setleri farkı ile ilişkisi var mıdır?

(algoritma olarak kod aynı sadece biri terminalde diğeri seri ekranda)

pico için yazdığım kod:

pico için yazdığım kod:
#include <Arduino.h>

bool asalmi(int n) {
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;

    if (n % 2 == 0 || n % 3 == 0)
        return false;

    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;

    return true;
}

void setup() {
    Serial.begin(9600);
    while (!Serial) {
      ;
    }

    Serial.println("sayı gir:");
    while (!Serial.available()) {
        ;
    }
    int limit = Serial.parseInt();
    unsigned long start_time = millis();

  
    Serial.println("Asal sayılar:");
    for (int i = 2; i <= limit; ++i) {
        if (asalmi(i)) {
            Serial.print(i);
            Serial.print(" ");
        }
    }
    Serial.println();

    unsigned long end_time = millis();
    unsigned long duration = end_time - start_time;
    Serial.print("İşlem süresi: ");
    Serial.print(duration);
    Serial.println(" milisaniye");
}

void loop() {}

pi zero ve laptop için yazdığım kod::
#include <iostream>
#include <chrono>

bool asalmi(int n) {
    if (n <= 1)
        return false;
    if (n <= 3)
        return true;

    if (n % 2 == 0 || n % 3 == 0)
        return false;

    for (int i = 5; i * i <= n; i = i + 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;

    return true;
}

int main() {
    int limit;


    std::cout << "sayı gir: ";
    std::cin >> limit;

    auto start_time = std::chrono::steady_clock::now();


    std::cout << "Asal sayılar:" << std::endl;
    for (int i = 2; i <= limit; ++i) {
        if (asalmi(i)) {
            std::cout << i << " ";
        }
    }
    std::cout << std::endl;


    auto end_time = std::chrono::steady_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
    std::cout << "İşlem süresi: " << duration.count() << " milisaniye" << std::endl;

    return 0;
}
 
Desktop işletim sistemleri zaman paylaşımlı çalışıyor, o yüzden eğer prosesi işletim sistemi bazan dondurup başka işler yapıyor olabilir. Mesela harddisk ile meşgul olur, ethernet ile meşgul olur vs. Bu tip değişkenlikleri elimine etmek için çok yüksek bir sayı kullan.

Ben şimdi denedim benim linux makinada 100 bine kadar olan asalları 6 ms de hesapladı.
 
Desktop işletim sistemleri zaman paylaşımlı çalışıyor, o yüzden eğer prosesi işletim sistemi bazan dondurup başka işler yapıyor olabilir. Mesela harddisk ile meşgul olur, ethernet ile meşgul olur vs. Bu tip değişkenlikleri elimine etmek için çok yüksek bir sayı kullan.

Ben şimdi denedim benim linux makinada 100 bine kadar olan asalları 6 ms de hesapladı.
Benim yazdığım kod ile mi? denedin yoksa siz başka bir şekilde mi yazdınız?
 
Referans olması için piton kodunu ver bir de ben çalıştırayım.


Python:
import time

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

if __name__ == "__main__":
    limit = int(input("sayı gir: "))

    start_time = time.time()

    print("Asal sayılar:")
    for i in range(2, limit + 1):
        if is_prime(i):
            print(i, end=" ")

    print()

    end_time = time.time()
    duration = (end_time - start_time) * 1000
    print("İşlem süresi: {} milisaniye".format(duration))
 
@taydin abi sonuçları paylaşma moralimiz bozulmasın :D
 
Referans olması için piton kodunu ver bir de ben çalıştırayım.
benim kod bu şekilde:
import time

def asalmi(sayi):

  baslangic_zamani = time.time()

  asal_sayilar = []

  for i in range(2, sayi + 1):
    asal_mi = True
    for j in range(2, i):
      if i % j == 0:
        asal_mi = False
        break
    if asal_mi:
      asal_sayilar.append(i)

  bitis_zamani = time.time()

  return asal_sayilar, bitis_zamani - baslangic_zamani


sayi = int(input("sayi gir: "))
asal_sayilar, sure = asalmi(sayi)

print("0'dan {}'ya kadar olan asal sayılar:".format(sayi))
print(*asal_sayilar, sep=", ")
print("Hesaplama süresi: {} saniye".format(sure))
 
@taydin abi sonuçları paylaşma moralimiz bozulmasın :D

Yav bendeki de 10 senelik makina, çok hava atılacak birşey değil :)

Bash:
99533 9999593 9999601 9999637 9999653 9999659 9999667 9999677 9999713 9999739 9999749 9999761 9999823 9999863 9999877 9999883 9999889 9999901 9999907 9999929 9999931 9999937 9999943 9999971 9999973 9999991
İşlem süresi: 31891.051292419434 milisaniye
Fri Mar 29 12:59:57 AM +03 2024
[ta@bonsai ~]$
 
  • Haha
Reactions: nt
PC de CPU gucunun tamamini bir taska ayirmanin yolu yok mu? Kisa bir sureligine.

Multitasking yapan isletim sistemi kosturan bir yapida deneme yapiyorsunuz. MCU nun kim bilir kacta kacini kullanyorsunuz. Linux windows yarisinda kim bilir bu task sureleri nasil ayarlaniyor.
 
PC de CPU gucunun tamamini bir taska ayirmanin yolu yok mu? Kisa bir sureligine.

scheduler'i kapatman lazım, bunu da ancak bir device driver'da yapabilirsin.

Windows'da böyle bir sürü kötü yazılmış device driver var. Bazan farkedersin, kısa süreliğine hem fare hem klavye donar. İşte onun sebebi birisinin yazdığı device driver işlemciye el koyumuş, bırakmıyor.
 
PC de CPU gucunun tamamini bir taska ayirmanin yolu yok mu? Kisa bir sureligine.

Multitasking yapan isletim sistemi kosturan bir yapida deneme yapiyorsunuz. MCU nun kim bilir kacta kacini kullanyorsunuz. Linux windows yarisinda kim bilir bu task sureleri nasil ayarlaniyor.
Windows da Görev Yöneticisinden öncelik verebiliyorsun. Cpu Priority diye geçiyor fakat işlevsel çalışır mı orası muamma.
 
Windows da Görev Yöneticisinden öncelik verebiliyorsun. Cpu Priority diye geçiyor fakat işlevsel çalışır mı orası muamma.

Priority vermek, user modda işe yarar. Kernel modda çalışan yazılım parçaları (device driver'ların çalıştığı mod) senin verdiğin önceliğin her zaman üzerindedir.
 
Priority vermek, user modda işe yarar. Kernel modda çalışan yazılım parçaları (device driver'ların çalıştığı mod) senin verdiğin önceliğin her zaman üzerindedir.
Evet o yüzden yazıda belirttim. Windows o konuda ne kadar itelersen itele kendi bildiğini okumaya devam ediyor. :D
 
PC de CPU gucunun tamamini bir taska ayirmanin yolu yok mu? Kisa bir sureligine.

Multitasking yapan isletim sistemi kosturan bir yapida deneme yapiyorsunuz. MCU nun kim bilir kacta kacini kullanyorsunuz. Linux windows yarisinda kim bilir bu task sureleri nasil ayarlaniyor.
python ise evet var

tümü için
import multiprocessing


bir kısmı için örneğin dört çekirdek siz ikinisi kullanıcaksınız
import threading
 
PC de delphi ile 1milyara kadar asal taramasi sonucunda 279720284 tane asal sayiyi 7600 ile 7700 ms araliginda buluyor.

Yanlis mi kodladim 10 milyona kadar 2797207 asal sayi buluyor ve sadece 78 ms suruyor.
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,847
Mesajlar
99,733
Üyeler
2,482
Son üye
ilker29

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top