|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
[C++/C#] Confronto prestazioni in allocazione dinamica
Prima di tutto: non sono mosso dall'ansia da prestazioni, ma da pura curiosità
![]() Ciao, scrivo un aggiornamento a proposito dell'altra mia discussione per sottoporvi un interessante quesito: Kendall è stato molto disponibile e si è offerto di convertire la classe vettore (BbVector) in C#, per confrontare le prestazioni (mi ricordavo che proprio Kendall avesse detto che in C# l'allocazione dinamica è più veloce che in C++ e volevo verificare se, e di quanto ![]() Abbiamo fatto un confronto, fra poco i risultati. Prima di tutto posto parte del codice (quello che ci interessa): *===== BbVector in C++ =====* BbVector.hpp Codice:
class BbVector { private: // ****************** Data double* myVector; // Points to the 1st chunk of memory allocated to the vector, which remains unused because BbVector's index is 1-based; myVector == BbVector(0), unaccessible double* start; // Points to the 1st accessible element of the vector, start == BbVector(1) double* avail; // Points 1 past the last allocated element of the vector (see comments to grow() function) double* limit; // Points 1 past the last chunk of memory allocated to the vector (see comments to grow() function) size_type mySize; // Returns the no. of elements in the vector; mySize == avail - start // Allocator object to dynamically manage memory std::allocator<double> alloc; // ****************** Constructor functions void create(); void create(size_type n, const double& val); void uncreate(); public: // ****************** Constructors BbVector() { create(); } explicit BbVector(int n, double val = 0.); // ****************** Destructor ~BbVector() { uncreate(); } // Norms double normInf() const; double norm1() const; double norm2() const; double normM() const; }; Codice:
// Construct a BbVector of size n, setting all elements to the value val BbVector::BbVector(int n, double val) { if (n <= 0) create(); else create(n, val); } // Private function for memory management: create and empty BbVector void BbVector::create() { mySize = 0; myVector = 0; limit = avail = start = 0; } // Private function for memory management: create a BbVector by allocating n+1 doubles and setting their value to val void BbVector::create(size_type n, const double& val) { mySize = n; myVector = alloc.allocate(n + 1); start = myVector + 1; limit = avail = start + mySize; uninitialized_fill(start, limit, val); } // Private function for memory management: delete the current BbVector by destroying all doubles allocated into myVector and then deallocating such memory void BbVector::uncreate() { if (myVector) { iterator it = avail; while (it != myVector) alloc.destroy(--it); // cout << "About to deallocate " << limit - myVector << " double cells, whereas mySize = " << mySize << endl; alloc.deallocate(myVector, limit - myVector); } mySize = 0; myVector = 0; limit = avail = start = 0; } // Norms: self explanatory double BbVector::normInf() const { return get_max(); } double BbVector::norm1() const { double ret = 0.; for (int i = 1; i <= mySize; ++i) ret += abs(myVector[i]); return ret; } double BbVector::norm2() const { double ret = 0.; for (int i = 1; i <= mySize; ++i) ret += myVector[i] * myVector[i]; return sqrt(ret); } double BbVector::normM() const { return mySize ? this->norm1() / mySize : 0.; } Codice:
class BbVector : IEnumerable<double> { // >>>> Fields <<<< private List<double> vector; // >>>> Constructors <<<< public BbVector() { vector = new List<double>(); } public BbVector(int length, double value = 0d) { vector = new List<double>(length); for ( int i = 0; i < vector.Capacity; i++ ) { vector.Add(value); } } public double NormInf { get { return MaxValue; } } public double Norm1 { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach ( var item in vector ) { norm += System.Math.Abs(item); } return norm; } } public double Norm2 { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach ( var item in vector ) { norm += item * item; } return Math.Sqrt(norm); } } public double NormM { get { return vector.Count != 0 ? Norm1 / vector.Count : 0d; } } ![]() Passiamo ai risultati: il confronto delle performance è effettuato misurato quanto tempo ci vuole a creare (e distruggere) 10M di volte un BbVector di 100 elementi: *===== TEST CODE in C++ =====* Codice:
printf("THIS IS THE C++ VERSION!!\n\n"); ProcessorTimer myTimer; for (int i = 0; i < 10000000; ++i) { BbVector* a = new BbVector(100); delete a; } printf("I have initialized 10M BbVectors of size 100 in %E s\n\n", std::get<0>(myTimer.split_time())); *===== TEST CODE in C# =====* Codice:
Console.WriteLine("THIS IS THE C# VERSION!!\n"); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; ++i) new BbVector(100); Console.WriteLine("I have initialized 10M BbVectors of size 100 in {0} s\n", sw.Split()); I risultati di seguito: ![]() Si vede che il ciclo di 10M di iterazioni, in cui semplicemente si crea un nuovo BbVector(100), in Release e senza debugger, è completato dal C# in 8.3s, mentre dal C++ in 1.2 (in realtà 1.8s circa). Al che mi pareva tutto ok, ma poi Kendall m'ha fatto notare che questo codice: *===== TEST CODE in C++ =====* Codice:
printf("THIS IS THE C++ VERSION!!\n\n"); BbVector* a; for (int i = 0; i < 10000000; ++i) { a = new BbVector[100]; delete a; } Codice:
Console.WriteLine("THIS IS THE C# VERSION!!\n"); BbVector[] a; for (int i = 0; i < 10000000; ++i) a = new BbVector[100]; Ricapitolando: pare che allocare 10M di volte un vettore di 100 BbVector vuoti, in C# sia istantaneo mentre in C++ richiede quasi un secondo; se invece allochiamo 10M di volte un BbVector di 100 elementi, la situazione si ribalta. Come mai? Cioè...capisco benissimo che creare un vettore di 100 oggetti e un oggetto di 100 elementi sono operazioni diverse, ma quello che volevo capire è: cosa, in C#, rende così lenta la seconda operazione? Il fatto che sia stato usata una List<double>? Sembrerebbe che la parte che rallenta il tutto sia nel costruttore BbVector(int n, double val = 0d). E poi, ci sono sicuramente altri modi per scrivere il BbVector in C#, ma per renderlo performante come in C++ come bisogna fare? Usare unsafe e i puntatori, manualmente? Qualcuno con più esperienza mi potrebbe illuminare? Grazie per l'attenzione ![]() |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Iscritto. Per ora non ho tempo per effettuare prove ché sto preparando il contest 19(e poi va a finire come ieri che alla fine sono stanco e debbo rimandare). Ma iscritto.
In B4: ansia da prestazioni. Ultima modifica di Vincenzo1968 : 12-01-2013 alle 12:29. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2008
Messaggi: 429
|
3 cose non ho capito nel codice C#
1) perché bbVector eredita IEnumerable 2) perché usare una List di double quando usare un array non aumenta le linee di codice o diminuisce la leggibilità. si sa che fare un foreach su un List è più lento di fare un for su un array. 3) nei metodi Norm1 e Norm2 c'è un controllo se il vettore è vuoto, e non c'è nel codice C++ puoi mettere da qualche parte l'intero codice in C# per poterlo scaricare? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Quando guardi al codice C# devi considerare due cose: - Il C# è fortemente ottimizzato alla creazione e distruzione degli oggetti (come il Java). Il compilatore JIT si sforza incredibilmente nel cercare di rimuovere chiamate a costruttori quando non serve e non mi stupirei se lo facesse anche in questo caso. Inoltre non esistendo i distruttori questi non vengono chiamati, ma la liberazione delle risorse viene fatta attraverso il GC. PS:A proposito di questo mi ricordo che alla mia uni venne un tipo di microsoft una volta parlando di game development in XNA con C#. La presentazione era la creazione di un piccolo gioco shooter a scorrimento verticale. Il gioco teneva tutti gli oggetti "Proiettili" in una lista e ad ogni rendering update doveva aggiornarne la posizione. Il presentatore ci disse che in C# la generazione di nuovi oggetti era così ottimizzata che era più veloce creare una nuova lista di nuovi oggetti proiettili con le posizioni aggiornate ed eliminare quella precedente (semplicemente assegnando la nuova lista creata coi proiettili aggiornati al reference della vecchia lista e lasciare al GC il resto) che ciclare sulla lista e aggiornare la posizione dei vari proiettili già esistenti - Quando chiami "new" in C# non chiama direttamente l'allocatore del sistema operativo e non è neanche detto che allochi la memoria sullo heap. Il GC potrebbe ritornare della memoria già allocata in precedenza ma marcata come libera oppure allocare gli oggetti sullo stack se sono sufficientemente piccoli , evitando così l'overhead tipico di una chiamata a "new" del C++. La creazione/distruzione degli oggetti C++ quindi è generalmente più costosa del C# e bisognerebbe evitarla il più possibile in cicli grossi come questo nel proprio design se si cerca la massima performance con questo linguaggio. Altrimenti ci sono dei trucchetti per renderla il meno costosa possibile allocando la memoria manualmente usando memory pools (facendo overload di new e delete) , cercando di ridurre all'osso di distruttori o allocando gli oggetti sullo stack. Vorrei comunque farti notare un errore abbastanza grave nella seconda versione del tuo main che avrebbe anche potuto influire in parte sulle performance del tuo test: Codice:
printf("THIS IS THE C++ VERSION!!\n\n"); BbVector* a; for (int i = 0; i < 10000000; ++i) { a = new BbVector[100]; delete a; <- ERRORE! } Cheers.
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 12-01-2013 alle 12:32. |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
2) L'utilizzo dell'array anzichè di una lista ridimensionabile era quello che avevo consigliato a Vendetta, però mi richiedeva una lista di questo tipo quindi ho dovuto usare List<T>. (Però, Vendetta, come ti scrivevo per mail, son ancora convinto che della mia ideaa). 3) L'ho aggiunto perchè la norma di un vettore esiste se il vettore ha per lo meno una dimensione. (tra l'altro, mi hai fatto notare che mi son dimenticato di inserire il controllo su NormM). edit: Ecco il codice completo, con la proprietà NormM corretta: Codice:
namespace LinearAlgebra { class BbVector : IEnumerable<double> { // >>>> Constructors <<<< public BbVector() { vector = new List<double>(); } public BbVector(int length, double value = 0d) { vector = new List<double>(length); for ( int i = 0; i < vector.Capacity; i++ ) { vector.Add(value); } } public BbVector(double[] source) { vector = new List<double>(source.Length); foreach ( var item in source ) { vector.Add(item); } } public BbVector(IEnumerable<double> source) { vector = new List<double>(); vector.AddRange(source); } // >>> Indexer & Properties <<<< public double this[int position] // 1-based { get { return vector[position - 1]; } set { vector[position - 1] = value; } // IndexOutOfRangeExceptions is automatically thrown by vector } public double MaxValue { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double max = vector[0]; for ( int i = 1; i < vector.Count; i++ ) { if ( vector[i] > max ) { max = vector[i]; } } return max; } } public double MinValue { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double min = vector[0]; for ( int i = 1; i < vector.Count; i++ ) { if ( vector[i] < min ) { min = vector[i]; } } return min; } } public double NormInf { get { return MaxValue; } } public double Norm1 { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach ( var item in vector ) { norm += System.Math.Abs(item); } return norm; } } public double Norm2 { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach ( var item in vector ) { norm += item * item; } return norm; } } public double NormM { get { if ( vector.Count == 0 ) { throw new InvalidOperationException("The Vector is Empty!"); } return Norm1 / vector.Count; } } // >>>> Methods <<<< public void Add(double value) { vector.Add(value); } public IEnumerator<double> GetEnumerator() { return vector.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)vector).GetEnumerator(); } public void Resize(int newSize) { vector = new List<double>(newSize); for ( int i = 0; i < vector.Capacity; i++ ) { vector.Add(0d); // Filled with 0 } } public override string ToString() { if ( vector.Count == 0 ) { return "Empty BbVector!!"; } else { StringBuilder vectorString = new StringBuilder(); foreach ( var item in vector ) { vectorString.AppendFormat("{0} ", item); } return vectorString.ToString(); } } // >>>> Fields <<<< private List<double> vector; } // class BbVector } // namespace LinearAlgebra Ultima modifica di [Kendall] : 12-01-2013 alle 14:30. |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Comunque Vendetta un simile ciclo non è poi così utile ai fini del bench, perchè comunque ogni linguaggio deve essere sfruttato per le sue peculiarità.
Il processo di allocazione dinamica È più veloce nel C# come nel Java per il semplice fatto che in questi ultimi la ram viene trattata bene o male come uno stack, mettendo le nuove istanze in coda alle vecchie direttamente e ripulendo e compattando il tutto quando entra in gioco il GC. Nel C++ invece causa allocazione e deallocazione manuale della memoria nella RAM si genera frammentazione quindi devono essere regolarmente eseguiti controlli per verificare che l'allocazione sia possibile o meno, e tutto ciò porta ad un rallentamento generale dell'operazione (la deallocazione invece è di per sè abbastanza veloce perchè la si fa su porzioni di ram della quale si conosce fin da subito l'indirizzo iniziale e finale). Questo che vuol dire? Poco o niente, perchè comunque per l'aspetto puramente prestazionale il C++ è superiore e l'eccellere in singoli aspetti (come l'allocazione dinamica per il C#) non rende più veloci nel computo totale. |
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
Quote:
![]() |
||
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Il sorgente in C++ mi da problemi(con Visual Studio 2010):
Codice:
1>------ Rebuild All started: Project: VendettaaaaaCpp, Configuration: Release Win32 ------ 1> main.cpp 1>main.cpp(83): error C2955: 'std::iterator' : use of class template requires template argument list 1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\xutility(337) : see declaration of 'std::iterator' 1>main.cpp(83): error C2514: 'std::iterator' : class has no constructors 1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\xutility(337) : see declaration of 'std::iterator' 1>main.cpp(85): error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::iterator' (or there is no acceptable conversion) 1> could be 'built-in C++ operator!=(double *, double *)' 1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\system_error(425): or 'bool std::operator !=(const std::error_code &,const std::error_condition &)' 1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\system_error(432): or 'bool std::operator !=(const std::error_condition &,const std::error_code &)' 1> while trying to match the argument list '(std::iterator, double *)' 1>main.cpp(85): fatal error C1903: unable to recover from previous error(s); stopping compilation ========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== Codice:
// Private function for memory management: delete the current BbVector by destroying all doubles allocated into myVector and then deallocating such memory void BbVector::uncreate() { if (myVector) { iterator it = avail; // <--- ERRORE while (it != myVector) alloc.destroy(--it); // cout << "About to deallocate " << limit - myVector << " double cells, whereas mySize = " << mySize << endl; alloc.deallocate(myVector, limit - myVector); } mySize = 0; myVector = 0; limit = avail = start = 0; } Codice:
double BbVector::normInf() const { return get_max(); // <--- ERRORE } |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Anche il sorgente C# di Kendall mi da problemi(sempre Visual Studio 2010):
Codice:
C:\Progetti Visual Studio\Progetti Visual Studio 2010\C#\MyProjects\Vendettaaaaa\Vendettaaaaa\Program.cs(151,9): error CS0305: Using the generic type 'System.Collections.Generic.IEnumerator<T>' requires 1 type arguments Compile complete -- 1 errors, 2 warnings Codice:
IEnumerator IEnumerable.GetEnumerator() // <--- ERRORE { return ((IEnumerable)vector).GetEnumerator(); } Codice:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; Ultima modifica di Vincenzo1968 : 12-01-2013 alle 14:45. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
using System.Collections; oppure utilizzare l'estensione completa quando utilizzi le interfacce IEnumerable e IEnumerator (nella versione non generica): System.Collection.IEnumerable e System.Collection.IEnumerator. Ultima modifica di [Kendall] : 12-01-2013 alle 14:47. |
|
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Grazie mille, Kendall, ora funziona:
![]() Questo è il codice completo: Codice:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; namespace LinearAlgebra { class BbVector : IEnumerable<double> { // >>>> Constructors <<<< public BbVector() { vector = new List<double>(); } public BbVector(int length, double value = 0d) { vector = new List<double>(length); for (int i = 0; i < vector.Capacity; i++) { vector.Add(value); } } public BbVector(double[] source) { vector = new List<double>(source.Length); foreach (var item in source) { vector.Add(item); } } public BbVector(IEnumerable<double> source) { vector = new List<double>(); vector.AddRange(source); } // >>> Indexer & Properties <<<< public double this[int position] // 1-based { get { return vector[position - 1]; } set { vector[position - 1] = value; } // IndexOutOfRangeExceptions is automatically thrown by vector } public double MaxValue { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double max = vector[0]; for (int i = 1; i < vector.Count; i++) { if (vector[i] > max) { max = vector[i]; } } return max; } } public double MinValue { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double min = vector[0]; for (int i = 1; i < vector.Count; i++) { if (vector[i] < min) { min = vector[i]; } } return min; } } public double NormInf { get { return MaxValue; } } public double Norm1 { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach (var item in vector) { norm += System.Math.Abs(item); } return norm; } } public double Norm2 { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach (var item in vector) { norm += item * item; } return norm; } } public double NormM { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } return Norm1 / vector.Count; } } // >>>> Methods <<<< public void Add(double value) { vector.Add(value); } public IEnumerator<double> GetEnumerator() { return vector.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)vector).GetEnumerator(); } public void Resize(int newSize) { vector = new List<double>(newSize); for (int i = 0; i < vector.Capacity; i++) { vector.Add(0d); // Filled with 0 } } public override string ToString() { if (vector.Count == 0) { return "Empty BbVector!!"; } else { StringBuilder vectorString = new StringBuilder(); foreach (var item in vector) { vectorString.AppendFormat("{0} ", item); } return vectorString.ToString(); } } static void Main(string[] args) { Console.WriteLine("THIS IS THE C# VERSION!!\n"); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; ++i) new BbVector(100); //Console.WriteLine("I have initialized 10M BbVectors of size 100 in {0} s\n", sw.Split()); Console.WriteLine("\nI have initialized 10M BbVectors of size 100 in {0}ms", sw.ElapsedMilliseconds); } // >>>> Fields <<<< public List<double> vector; } // class BbVector } // namespace LinearAlgebra /* namespace Vendettaaaaa { class BbVector { private double MaxValue = 21; // >>>> Fields <<<< private List<double> vector; // >>>> Constructors <<<< public BbVector() { vector = new List<double>(); } public BbVector(int length, double value = 0d) { vector = new List<double>(length); for (int i = 0; i < vector.Capacity; i++) { vector.Add(value); } } public double NormInf { get { return MaxValue; } } public double Norm1 { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach (var item in vector) { norm += System.Math.Abs(item); } return norm; } } public double Norm2 { get { if (vector.Count == 0) { throw new InvalidOperationException("The Vector is Empty!"); } double norm = 0d; foreach (var item in vector) { norm += item * item; } return Math.Sqrt(norm); } } public double NormM { get { return vector.Count != 0 ? Norm1 / vector.Count : 0d; } } static void Main(string[] args) { Console.WriteLine("THIS IS THE C# VERSION!!\n"); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 10000000; ++i) new BbVector(100); //Console.WriteLine("I have initialized 10M BbVectors of size 100 in {0} s\n", sw.Split()); Console.WriteLine("\nI have initialized 10M BbVectors of size 100 in {0}ms", sw.ElapsedMilliseconds); } } } */ ![]() Ultima modifica di Vincenzo1968 : 12-01-2013 alle 18:53. |
![]() |
![]() |
![]() |
#12 | ||||
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Rispondo a ritroso:
Quote:
![]() Cmq sia come dicevo capisco che stiamo facendo cose diverse, volevo solo capire quali operazioni fanno da collo di bottiglia nell'uno o nell'altro linguaggio! E a quanto pare le risposte stanno arrivando ![]() Quote:
Quote:
Quote:
Ho rifatto i test e questi sono i risultati: ![]() C++ non ci mette 700 ms a creare per 10M di volte un array di 100 BbVector vuoti (che casino ![]() ![]() Al contrario, la creazione di 10M di BbVector con 100 elementi ribalta la situazione. Quindi quello che dite trova riscontro, e a questo punto: come mai è così lento il C#? E' colpa di List.Add (nel costruttore, il cui codice avete trovato nel primo post)? Un'altra cosa a cui ho pensato: 10M di BbVector di 100 elementi non ci stanno nella RAM...non è che la pulizia dell'heap da parte del GC è la parte lenta? Parlo da ignorante... @Vincenzo fra poco posto tutto il codice |
||||
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Adesso compila ma ho qualche problemino con l'output:
![]() EDIT: Ah no, scusate, visualizza il double in formato scientifico. Come non detto La macchina è sempre questa: ![]() Ultima modifica di Vincenzo1968 : 12-01-2013 alle 15:48. |
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() Modificato main così: Codice:
int main(int argc, char* argv[]) { printf("THIS IS THE C++ VERSION!!\n\n"); double list[5] = {1., -5., 4., 53., -0.66}; clock_t c_start, c_end; c_start = clock(); BbVector bbV(5, list); BbVector bbA(5000000, 666.); bbA = bbV; BbVector* d; for (int i = 0; i < 10000000; ++i) { d = new BbVector[100]; delete[] d; } //printf("I have initialized 10M arrays of BbVectors of size 100 in %E s\n\n", std::get<0>(myTimer.split_time())); c_end = clock(); printf("\nI have initialized 10M arrays of BbVectors of size 100 in -> %5.5f s\n", (double)(c_end - c_start) / CLOCKS_PER_SEC); BbVector* a; c_start = clock(); for (int i = 0; i < 10000000; ++i) { a = new BbVector(100); delete a; } //printf("I have initialized 10M BbVectors of size 100 in %E s\n\n", std::get<0>(myTimer.split_time())); c_end = clock(); printf("\nI have initialized 10M BbVectors of size 100 in -> %5.5f s\n", (double)(c_end - c_start) / CLOCKS_PER_SEC); return 0; } |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Riepilogo:
![]() ![]() La macchina è questa: ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Già che ci sei aggiungi la seconda prova nella versione C# e fai stampare il tempo in secondi
![]() Cmq più o meno i conti tornano anche sulla tua macchina ![]() Anch'io ho provato ad usare clock ma il ProcessorTimer mi sembra abbia più risoluzione. Al momento va usato in quel modo perchè split_time ritorna una tupla...ma volendo basta fargli ritornare un double! |
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Datemi i sorgenti e vi faccio le verifiche. Per il momento sto facendo i benchmark per Lucene, Indri e Zettair(Contest 19). ![]() |
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ah una cosa: questa è la mia macchina vecchia. Di la ho la macchinina nuova con Windows 8 e Linux Ubuntu 12.10 a 64 bit. In questa vecchia macchinina invece ho Windows XP e Linux gNewSense a 32 bit.
Più tardi prendo i tempi anche sulla macchina nuova. EDIT: Vabbuo', il tempo in secondi, questo è facile: Codice:
//Console.WriteLine("\nI have initialized 10M BbVectors of size 100 in {0}ms", sw.ElapsedMilliseconds); Console.WriteLine("\nI have initialized 10M BbVectors of size 100 in {0} s.", (double)sw.ElapsedMilliseconds/(double)1000); ![]() Ultima modifica di Vincenzo1968 : 12-01-2013 alle 17:02. |
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
I tempi presi sulla macchina nuova compilando entrambe le applicazioni a 64 bit con Visual Studio 2012:
![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:35.