billyyo Δημοσ. 24 Ιανουαρίου 2010 Δημοσ. 24 Ιανουαρίου 2010 Καλησπερα insomniacs. Απ'όσο ξέρω στην C++ η διαφορά της struct από την class έχει να κάνει μόνο με το γεγονός ότι τα μέλη της struct είναι εξορισμού public. Όμως έκανα 2 εκδόσεις ενός προγράμματος, μία με ένα απλό struct και ένα άλλο με την αντίστοιχη κλάση και είδα μεγάλη διαφορά στην απόδοση. Συγκεκριμένα πιο κάτω φαίνονται οι δομές και η main. Sturcture: >struct Link{ int head; int tail; Link(int a, int { head = a; tail = b; } }; Class: >class Link { public: Link(); Link(const Link& orig); virtual ~Link(); Link(int, int); int head; int tail; private: }; H main() είναι: > int main(int argc, char** argv) { vector<Link> vLinks; for (int i=0; i<1000000; i++){ Link alink(i, i+1); vLinks.push_back(alink); } return (EXIT_SUCCESS); } Χρονομέτρησα με την εντολή time σε linux 100 εκτελέσεις και από τις 2 εκδοχές του προγράμματος και έβγαλά το μέσο όρο. Η εκδοχή του προγράμματος με την struct είναι περίπου 1/3 πιο γρήγορη. Μπορεί κανείς να μου εξηγήσει ή να εικάσει που οφείλεται αυτή η διαφορά.
parsifal Δημοσ. 24 Ιανουαρίου 2010 Δημοσ. 24 Ιανουαρίου 2010 Διαφορετικό cache line alignment, λόγω διαφοράς μεγέθους bytes μεταξύ της αναπαράστασης στη μνήμη του struct και της class σου... ;
jstark Δημοσ. 24 Ιανουαρίου 2010 Δημοσ. 24 Ιανουαρίου 2010 Καλησπερα insomniacs. Απ'όσο ξέρω στην C++ η διαφορά της struct από την class έχει να κάνει μόνο με το γεγονός ότι τα μέλη της struct είναι εξορισμού public. Όμως έκανα 2 εκδόσεις ενός προγράμματος, μία με ένα απλό struct και ένα άλλο με την αντίστοιχη κλάση και είδα μεγάλη διαφορά στην απόδοση. Συγκεκριμένα πιο κάτω φαίνονται οι δομές και η main. Sturcture: >struct Link{ int head; int tail; Link(int a, int { head = a; tail = b; } }; Class: >class Link { public: Link(); Link(const Link& orig); virtual ~Link(); Link(int, int); int head; int tail; private: }; H main() είναι: > int main(int argc, char** argv) { vector<Link> vLinks; for (int i=0; i<1000000; i++){ Link alink(i, i+1); vLinks.push_back(alink); } return (EXIT_SUCCESS); } Χρονομέτρησα με την εντολή time σε linux 100 εκτελέσεις και από τις 2 εκδοχές του προγράμματος και έβγαλά το μέσο όρο. Η εκδοχή του προγράμματος με την struct είναι περίπου 1/3 πιο γρήγορη. Μπορεί κανείς να μου εξηγήσει ή να εικάσει που οφείλεται αυτή η διαφορά. Οι δύο κώδικές σου δεν ειναι ισοδυναμοι. Βγάλε τον virtual destructor. Και κάποια σχόλια: Βάζοντας virtual destructor διπλασιάζεις το μέγεθος του Link. Δοκίμασε με sizeof να δεις ποια τα μεγέθη. Επισης, με απλα loops δεν βγάζεις άκρη τί ειναι πιο γρήγορο και τί οχι. Θα μπορούσε πχ o compiler να αγνοήσει όλο το loop που κάνεις. Ταχύτητες μετράμε (τη χασούρα δηλαδή) με profilers.
Aztec Δημοσ. 24 Ιανουαρίου 2010 Δημοσ. 24 Ιανουαρίου 2010 Επίσης κάτι άλλο που έχω διαβάσει οσον αφορά το .net framework και την διαφορά struct και class. To struct θαωρείται value type ενώ το class reference type. Δηλαδή το struct αποθηκεύεται απευθείας στην μνήμη ενώ η κλάση ως pointer σε περιοχή μνήμης. Άσχετο φυσικά με το θέμα ...
billyyo Δημοσ. 24 Ιανουαρίου 2010 Μέλος Δημοσ. 24 Ιανουαρίου 2010 Ευχαριστώ για τις απαντήσεις σας. Θα βγάλω τον virtual constructor και θα ξαναδοκιμάσω. ---------- Προσθήκη στις 20:44 ---------- Προηγούμενο μήνυμα στις 20:17 ---------- Όντως με το virtual constructor το μέγεθος της κλάσης Link ήταν 12 ενώ χωρις virtual constructor το μέγεθος είναι 8. Με την time οι χρόνοι φαίνονται ίδιοι. Θα κατεβάσω μια trial version του VTune profiler για να δω instruction count. Θα μου κάνατε πολύ μεγάλη χαρη αν μπορούσατε να μου στείλεται ένα link με άρθρο ή κεφάλαιο βιβλίου για να διαβάσω περισσότερα πάνω στο θέμα.
Evgenios1 Δημοσ. 25 Ιανουαρίου 2010 Δημοσ. 25 Ιανουαρίου 2010 1 http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr054.htm 2 http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.8
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.