2015-05-01 22 views
9

Windows üzerinde 2x daha hızlı çalışan bir kod parçam var. İşte ölçülen zamanlardır:Kod, linux'e göre 2x daha hızlı çalışır.

g++ -Ofast -march=native -m64 
    29.1123 
g++ -Ofast -march=native 
    29.0497 
clang++ -Ofast -march=native 
    28.9192 
visual studio 2013 Debug 32b 
    13.8802 
visual studio 2013 Release 32b 
    12.5569 

Gerçekten çok büyük bir fark gibi görünüyor.

#include <iostream> 
#include <map> 
#include <chrono> 
static std::size_t Count = 1000; 

static std::size_t MaxNum = 50000000; 

bool IsPrime(std::size_t num) 
{ 
    for (std::size_t i = 2; i < num; i++) 
    { 
     if (num % i == 0) 
      return false; 
    } 
    return true; 
} 

int main() 
{ 
    auto start = std::chrono::steady_clock::now(); 
    std::map<std::size_t, bool> value; 
    for (std::size_t i = 0; i < Count; i++) 
    { 
     value[i] = IsPrime(i); 
     value[MaxNum - i] = IsPrime(MaxNum - i); 
    } 
    std::chrono::duration<double> serialTime = std::chrono::steady_clock::now() - start; 
    std::cout << "Serial time = " << serialTime.count() << std::endl; 

    system("pause"); 
    return 0; 
} 

Tüm bu Linux 3.19.5 (gcc 4.9.2, çınlama 3.5.0) vs pencereler 8 ile aynı makine üzerinde ölçülmüştür: Burada

kodudur. Hem linux hem de pencereler 64bit'dir.

Bunun nedeni ne olabilir? Bazı programlayıcı sorunları?

DÜZENLEME: Bu linux üzerinde 64b ikili aksine pencerelerde 32b binarylerinin neden oldu, burada pencereler için 64b sayılardır:

Visual studio 2013 Debug 64b 
    29.1985 
Visual studio 2013 Release 64b 
    29.7469 
+0

IsPrime'ın bazı rahatsızlıklarını sağlayabilirseniz ilginç olurdu. Ve optimizasyon ayarlarını biraz yapın. –

+0

Sadece "değer" haritasındaki sonucu kaydetmeden "IsPrime" öğesini çağırmayı deneyin. Ve sonra "değer" haritasına "IsPrime" çağrılmadan boglu değerleri depolamayı deneyin ve ne olduğuna bakın. –

+0

'VS2013'' std :: steady_clock' için 'QueryPerformanceCounter'' kullanmıyor: http://stackoverflow.com/a/13266477/2502409 – Nazar554

cevap

4

Sen söyleme pencereler/Linux işletim sistemleri olsun 32 veya 64 bit.

64 bitlik bir linux makinesinde, size_t değerini bir int olarak değiştirirseniz, yürütme sürelerinin linux'ta windows için sahip olduğunuz değerlere benzer bir değere düştüğünü görürsünüz.

size_t, win32 üzerinde bir int32, win64 üzerinde bir int64'tür.

DÜZENLEME: sadece pencerelerinizin sökülmesini gördünüz.

Windows işletim sisteminiz 32 bitlik bir çeşittir (veya en azından 32 bit için derlediniz).

+0

Haklısınız. Ben linux üzerinde varsayılan olarak 64b binary yapıyorum olduğumu farketmedim (bu yüzden -m64'ü gcc'ye göndermeyi denedim). – hynner

+0

@hynner, 64-bit kodun yarısı kadar hızlı olması beni şaşırtdığını söylemem gerekse de! –

+2

Birçok algoritma aslında bellek bant genişliğine bağlı. Çift boyutlu değer türlerini kullanırsanız, okuma ve yazma sırasında kullanımları iki kat uzun sürer. –