myprotia logo Electrical and Computer Engineering Community
Ημερολόγιο
 Portal » Community » myprotia.gr magazine » Τεχνολογία - Eπιστήμη
Ερώτηση σε C++ και Visual Studio
Συντονιστές: Apo_
Δημοσίευση νέας Θ.Ενότητας   Απάντηση στη Θ.Ενότητα Επισκόπηση προηγούμενης Θ.ΕνότηταςΕπισκόπηση επόμενης Θ.Ενότητας
Σελίδα 1 από 1 [4 Posts]  
Συγγραφέας Μήνυμα
Apo_ Offline
Administrator


Ένταξη: Σαβ 10 Ιαν 2009, 18:25
Δημοσιεύσεις: 1973
 Ερώτηση σε C++ και Visual Studio

Έγραφα C++ σε Visual Studio 2013 και παρατήρησα μια περίεργη διαφορά στις επιδόσεις διαχείρησης array όταν χρησιμοποιώ τη "Multi-threaded Debug" runtime library και όταν χρησιμοποιώ τη "Multi-threaded" (επιλογές /MDd και /MD αντίστοιχα). Αυτή η διαφορά είναι τεράστια όταν ο πίνακας βρίσκεται στο heap.

Συγκεκριμένα παρακάτω φαίνονται οι χρόνοι που παίρνω για τον ίδιο κώδικα με διαφορά μόνο τις παραπάνω επιλογές για runtime library και το πού βρίσκεται ο πίνακας στη ram.
Κώδικας:

 ------+---------+-----------
|      |   /MD   |   /MDd    |
|------+---------+-----------|
| Heap |  8,5ms  |   3,5ms   |
|------+---------+-----------|
| Stack|  3,5ms  |   3,5ms   |
|------+---------+-----------|
| bss  |   10ms  |   10ms    |
 ------+---------+-----------


Φαντάζομαι η μεγάλη διαφορά μεταξύ heap/bss και stack υπάρχει, γτ μάλλον η stack στην πράξη δε θα βρίσκεται στη ram, αλλά σε κάποια γρήγορη cache (ή τουλάχιστον μέρος της stack). Για τη διαφορά μεταξύ bss και heap δν έχω ιδέα.

Το πολύ περίεργο όμως είναι η διαφορά μεταξύ md debug και md, όταν έχουμε dynamic memory allocation. Όπως καταλαβαίνω και με τις δύο επιλογές χρησιμοποιείται το ίδιο dll με τη μόνη διαφορά τον καθορισμό του _DEBUG (και επομένως εκτέλεση επιπρόσθετων τμημάτων κώδικα)?

Αν το έχει συναντήσει κάποιος αυτό ας postάρει.

edit: Η assembly που παράγεται στο γέμισμα του πίνακα είναι η ίδια

------
Κώδικας του test. Μπορεί να τρέξει και σε gcc ο κώδικας, χωρίς εγγύηση για data alignment(δν έχει σημασία έτσι κι αλλιώς), αν κάποις ξέρει τις αντιστοιχήσεις των παραπάνω σε g++
Κώδικας:

#include <iostream>
#include <numeric>
#include <chrono>

using std::cout;
using std::cerr;
using std::endl;
typedef std::chrono::high_resolution_clock hclock;

#define ALIGNMENT 32
#ifdef _MSC_VER
   #define ALIGN __declspec(align(ALIGNMENT))
#else
   #define ALIGN
   #ifndef _mm_malloc
   #define _mm_malloc(a, b) malloc(a)
   #endif
   #ifndef _mm_free
   #define _mm_free(a) free(a)
   #endif
#endif

#ifdef _DEBUG
#endif

#define HEAP 0
#define STACK 1
#define BSS 2
//SWITCH HERE
#define STORAGE 1

int main()
{
   const size_t size = 10000000, alignment = ALIGNMENT;

#if STORAGE == HEAP
   cout << "Storing in the Heap\n";
   int * a = (int*)_mm_malloc(sizeof(int)*size, alignment);
#elif STORAGE == STACK
   cout << "Storing in the Stack\n";
   ALIGN int a[size];
#else
   cout << "Storing in the BSS\n";
   ALIGN static int a[size];
#endif

   if ((int)a % alignment)
   {
      cerr << "Data is not aligned" << endl;
   }

   //MAGIC STARTS HERE
   hclock::time_point end, start = hclock::now();
   std::iota(a, a + size, 0);
   end = hclock::now();
   //MAGIC ENDS HERE

   cout << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << endl;
   
#if STORAGE == HEAP
   _mm_free(a);
#endif

   getchar();
   return 0;
}

main.cpp
Description 
cpp

 Download 
Όνομα Αρχείου  main.cpp 
Filesize  1.24KB 
Downloaded  177 Time(s) 

ΔημοσίευσηΔημοσιεύθηκε: Τρι 09 Δεκ, 2014 4:15 am
Έχει επεξεργασθεί από τον/την Apo_ στις Τρι 09 Δεκ, 2014 9:04 pm, 1 φορά
 Επισκόπηση του προφίλ των χρηστών Αποστολή προσωπικού μηνύματος
 Επιστροφή στην κορυφή 
Chris_C2 Offline


Ένταξη: Πεμ 18 Ιαν 2007, 00:34
Δημοσιεύσεις: 67
Το /MDd χρησιμοποιεί τα Debug DLLs (όχι optimizations δηλαδή κτλ). Άρα είναι λογικό να βλέπεις αισθητά χειρότερες επιδόσεις.

Δες κι εδώ, μπορεί να βρεις τπτ χρήσιμο. http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx[/url]
_________________
0110110001101111011101100110010101110011010111110110110001101001011011100111010101111000

ΔημοσίευσηΔημοσιεύθηκε: Τρι 09 Δεκ, 2014 2:23 pm
 Επισκόπηση του προφίλ των χρηστών Αποστολή προσωπικού μηνύματος Αποστολή email Επίσκεψη στην ιστοσελίδα του Συγγραφέα
 Επιστροφή στην κορυφή 
Apo_ Offline
Administrator


Ένταξη: Σαβ 10 Ιαν 2009, 18:25
Δημοσιεύσεις: 1973
Με την /MDd είναι πιο γρήγορο όμως. Αυτό είναι το περίεργο : P.

Btw, δν το ανέφερα, αλλά και στις 2 περιπτώσεις τρέχω με -O2 optimizations

ΔημοσίευσηΔημοσιεύθηκε: Τρι 09 Δεκ, 2014 4:53 pm
 Επισκόπηση του προφίλ των χρηστών Αποστολή προσωπικού μηνύματος
 Επιστροφή στην κορυφή 
Apo_ Offline
Administrator


Ένταξη: Σαβ 10 Ιαν 2009, 18:25
Δημοσιεύσεις: 1973
Δώθηκε απάντηση τελικά στο StackOverflow. Παραθέτω την απάντηση για όποιον ενδιαφέρεται.

Παράθεση:

It might be related to lazy allocation. The debug library is probably initializing the data with garbage for the purpose of debugging. But in release, the pages aren't committed until first access. So you pass the overhead from setup to runtime.


ΔημοσίευσηΔημοσιεύθηκε: Δευ 22 Δεκ, 2014 6:13 am
 Επισκόπηση του προφίλ των χρηστών Αποστολή προσωπικού μηνύματος
 Επιστροφή στην κορυφή 
Επισκόπηση όλων των Δημοσιεύσεων που έγιναν εδώ και:   Ταξινόμηση κατά:   
Σελίδα 1 από 1 [4 Posts]  
Δημοσίευση νέας Θ.Ενότητας   Απάντηση στη Θ.Ενότητα Επισκόπηση προηγούμενης Θ.ΕνότηταςΕπισκόπηση επόμενης Θ.Ενότητας
 Portal » Community » myprotia.gr magazine » Τεχνολογία - Eπιστήμη
Μετάβαση στη:  

Δεν μπορείτε να δημοσιεύσετε νέο Θέμα σ' αυτή τη Δ.Συζήτηση
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης
Δεν μπορείτε να επεξεργασθείτε τις δημοσιεύσεις σας σ' αυτή τη Δ.Συζήτηση
Δεν μπορείτε να διαγράψετε τις δημοσιεύσεις σας σ' αυτή τη Δ.Συζήτηση
Δεν έχετε δικαίωμα ψήφου στα δημοψηφίσματα αυτής της Δ.Συζήτησης
You cannot attach files in this forum
You can download files in this forum
You cannot post calendar events in this forum


myprotia.gr - myprotia@myprotia.gr - 2011

Forum with support of Syndicator RSS