2012-10-21 2 views
6

Konuyla ilgili bazı test testleri yapıyordum ve bu kod parçalarını yazdım:Seri kod C'de sadece bir vida dişi kullanmaktan çok daha yavaş mı?

resp_threadless [] ve resp_threaded [] global int dizileridir ve boyutları n'dir;

function(); 

Ve böyle ikincisini:

HANDLE hThreadArray[1]; 
DWORD dwThreads[1]; 
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0])); 
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE); 
CloseHandle(hThreadArray[0]); 

Ben function_th kullanarak birden konuları arayarak biliyoruz unutmayın

int n = 100000; 

void function() { 
    for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

DWORD WINAPI function_th(LPVOID lpParam) { 
for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

Sadece onu arayarak ilk fonksiyonu benchmarked() bunu paralelleştirmeyecek, bu sadece bir test çünkü gerçekten garip sonuçlar elde ettim, bu yüzden SAME kodunu kullanarak bir iş parçacığı ve bir işlevde ne olacağını görmeye karar verdim. kullanılarak 425 ms

yaşadım benzer sonuçlar: Seri kod: 1485 ms Bir Konu numproc = 1.

Sonuçları ile

Bir Intel Atom N270 bu test

ve pencereler XP Çok işlemcili makineler ve hatta iş parçacığı tarafından yapılan iş paralelleştirmek için semaforlar kullanarak kod ile.

Neler olabileceğine dair bir fikri olan var mı?

DÜZENLEME

vb birden çok kez her biri, düzeni Inverting çalışan ... -> Değişiklik yok

Yükseköğretim N -> Konu biri orantılı QueryPerformanceCounter (Kullanılması daha hızlı

olduğunu) -> Değişiklik yok

İş Oluşturma Başlığı -> Vida dişi daha yavaş, daha hızlı yapmalı

Orijinal kod: http://pastebin.com/tgmp5p1G

+0

Belki de şu anki başlığınız ('' function() 'işlevini çağırdığınız) düşük önceliğe sahiptir? – SomeWittyUsername

+2

Tek bir program yürütmesinde iki testi sırayla mı çalıştırdınız? Ben vetor [] erişimi için veri önbellek etkisinden şüpheleniyorum. – yohjp

+0

1. Siparişi tersine çevirmeyi denediniz mi, önce işleyin ve sonradan çalışacak mısınız? (önbellek etkisi) 2. Zamanı nasıl ölçtünüz? – Arno

cevap

2

cache hit konu. Sorunu, sizin sorunuzda açıkladığınız sırayla yaptığınızdan şüpheleniyorum. İlk önce işlev çağrıldı ve iş parçacığı sonradan çağrıldı. Bunu daha ayrıntılı olarak değerlendirdiğinizde, nedenini gözlemleyeceksiniz: Veri (sqrt) önbellekteki availabeldir, böylece kod çok daha hızlı çalışacaktır. Testi kanıtlamaya:

  1. iplik çağırmadan önce daha sık iki kez hatta function() çalıştırın. Fonksiyon için ikinci çağrı daha hızlı sonuç verecektir.
  2. İşlevi iş parçacığından önce çağırın ve sonucun tersini gösterecektir. İşlev daha iyi sonuç gösterecektir.

Nedeni: Tüm sqrt hesaplaması (veya en az bir kısmı) önbellekte kullanılabilir ve yeniden hesaplanması gerekmez. Bu çok daha hızlı.

+0

Diğerlerini ters çevirmeyi denedim, her ikisini birden çok kez çalıştırıyorum ve aynı sonuçları aldım. – ruback

+0

Eh, kodunuzu kullandım ve tam olarak bunu yaptım. Ve sonuçlar oldukça açıktı. ** Tekrar: ** Zaman ölçümünü nasıl yaptın? 'Function() 've' function_th() 'dizisinin ardışık 5 çalışmasının zamanlarını bildirebilir misiniz? – Arno

+0

Aslında her işlevin 5 katı koşuyorum ve ortalığı aldım. "(double) clock()/CLOCKS_PER_SEC;" ve diğerinden çıkarılıyor. – ruback