2016-08-29 4 views
2

ich einige Test basiert auf Informationen durchgeführt haben, dass ich in http://www.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdfmake_shared Leistung Einzel vs Doppelbelegung

Der Zweck der Messung lesen war zu überprüfen, wie viel zeitraubende Einzelbelegung und Doppelbelegung (schlechter Stil) von shared_ptr ist. Ich gehe davon aus, dass die Einzelzuteilung weniger zeitaufwändig sein sollte als die Doppelzuteilung. Also ich würde gerne wissen, ob ich etw falsch verstanden habe oder Speicherzuweisung keine Korrelation mit der Zeit hat.

Der Testcode:

#include <iostream> 
#include <memory> 
#include <chrono> 
#include <string> 

using namespace std; 


class Test{ 
private: 
     int value; 
     string name; 
     double value2; 
public: 
     Test(int v, string n, double v2) : value(v), name(n), value2(v2){} 
     ~Test(){} 
}; 


void singleAllocation(){ 
     chrono::system_clock::time_point start = chrono::system_clock::now(); 
     for(int i = 0; i < 3000; i++) 
       shared_ptr<Test> sp(make_shared<Test>(10, "This is simple test", 2.3334)); 


     chrono::system_clock::time_point end = chrono::system_clock::now(); 
     cout<<"single allocation of 3000 objects took " 
      <<chrono::duration_cast<chrono::microseconds>(end - start).count() 
      <<"us.\n"; 
} 

void doubleAllocation(){ 
     chrono::system_clock::time_point start = chrono::system_clock::now(); 
     for(int i = 0; i < 3000; i++) 
       shared_ptr<Test> sp(new Test(10, "This is simple test", 2.3334)); 
correlaction 

     chrono::system_clock::time_point end = chrono::system_clock::now(); 
     cout<<"\n\ndouble allocation of 3000 objects took " 
      <<chrono::duration_cast<chrono::microseconds>(end - start).count() 
      <<"us.\n"; 

} 


int main(){ 
     singleAllocation(); 
     doubleAllocation(); 
} 

Der Ausgang: Einzelbelegung von 3000 Objekten nahm 2483us.

doppelte Zuweisung von 3000 Objekten dauerte 1226us.

+0

Ich habe gerade kompiliert und führen Sie Ihren Code mit einigen weiteren Iterationen (3000000). Die Single-Allokation ist immer schneller: Single braucht 1.04s, Double braucht 1.23s. Haben Sie im Freigabemodus kompiliert? – pschill

+0

Ich habe kompiliert mit: g ++ --std = C++ 11 file.cpp -o file.out – Lukasz

+2

Vielleicht hilft es, wenn Sie die Optimierung einschalten durch Hinzufügen von '-O3' nach' --std = C++ 11'. Leider bin ich auf Windows, also kann ich es jetzt nicht ausprobieren. – pschill

Antwort

-2

Die meiste Zeit kostet die Konstruktion einer Zeichenkette aus einem char *, das heißt "Dies ist ein einfacher Test" für eine Zeichenkette. Löschen Sie das Zeichenfolgenelement, fügen Sie ein Optimierungscompilerflag hinzu, d. H. -O3, Sie erhalten das Ergebnis erwartungsgemäß.

+1

Die Frage ist nicht über 'std :: make_shared' vs.' boost :: make_shared'. Es geht um 'std :: make_shared' vs' new'. – zett42