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

ShadowMan

Üye
Katılım
22 Kasım 2023
Mesajlar
30
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))
 
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
6,951
Mesajlar
118,753
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top