Έχει αλλάξει απόδοση για να χρησιμοποιήσετε ένα μετρητή μη-int σε έναν βρόχο;

ψήφοι
0

Είμαι απλά περίεργος και δεν μπορείτε να βρείτε την απάντηση πουθενά. Συνήθως, χρησιμοποιούμε έναν ακέραιο για ένα μετρητή σε ένα βρόχο, π.χ. σε C / C ++:

for (int i=0; i<100; ++i)

Αλλά μπορούμε επίσης να χρησιμοποιήσετε μια μικρή ακέραιο ή ακόμα και μια χαρα. Το ερώτημά μου είναι το εξής: Μήπως να αλλάξετε την απόδοση; Είναι μερικά bytes σε μικρότερο βαθμό η εξοικονόμηση μνήμης είναι αμελητέα. Απλά δολοπλοκίες μου αν έχω κάνει οποιαδήποτε ζημιά χρησιμοποιώντας μια χαρα αν ξέρω ότι ο μετρητής δεν θα υπερβαίνει τα 100.

Δημοσιεύθηκε 02/04/2009 στις 21:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


10 απαντήσεις

ψήφοι
1

Όχι, πραγματικά δεν θα πρέπει να επηρεάσει την απόδοση.

Απαντήθηκε 02/04/2009 στις 21:44
πηγή χρήστη

ψήφοι
9

Πιθανώς χρησιμοποιώντας το «φυσικό» ακέραιο μέγεθος για την πλατφόρμα θα παρέχει την καλύτερη απόδοση. Σε C ++ αυτό είναι συνήθως int. Ωστόσο, η διαφορά είναι πιθανό να είναι μικρές και είναι απίθανο να διαπιστώσετε ότι αυτό είναι το σημείο κυκλοφοριακής συμφόρησης επιδόσεις.

Απαντήθηκε 02/04/2009 στις 21:44
πηγή χρήστη

ψήφοι
1

Κατά πάσα πιθανότητα θα ήταν πιο γρήγορο να πληκτρολογήσετε ένα γρήγορο πρόγραμμα (που έκανε την πιο σύνθετη γραμμή ήδη) και το προφίλ του, από ό, τι κάνεις αυτή την ερώτηση εδώ. :-)

FWIW, σε γλώσσες που χρησιμοποιούν bignums από προεπιλογή (Python, Lisp, κλπ), ποτέ δεν έχω δει ένα προφίλ όπου ένα μετρητή βρόχου ήταν η συμφόρηση. Έλεγχος της ετικέτας τύπου δεν είναι τόσο ακριβό - ένα ζευγάρι οδηγίες στα περισσότερα - αλλά πιθανώς μεγαλύτερη από τη διαφορά ανάμεσα σε ένα (σταθερό) int και μια σύντομη int.

Απαντήθηκε 02/04/2009 στις 21:50
πηγή χρήστη

ψήφοι
1

Μάλλον όχι, αρκεί να μην το κάνει με μια floatή double. Επειδή η μνήμη είναι φθηνή ίσως θα ήταν καλύτερο από απλά χρησιμοποιώντας ένα int.

Απαντήθηκε 02/04/2009 στις 21:50
πηγή χρήστη

ψήφοι
2

Δεν μπορώ να παρέχει ένα σημείο αναφοράς, αλλά έχω ακούσει ότι συχνά γίνονται με μικρή επιβάρυνση επιδόσεις, χρησιμοποιώντας μια μικρή ή char.

Η εξοικονόμηση μνήμης είναι nonexistant δεδομένου ότι είναι μια προσωρινή μεταβλητή στοίβα. Η μνήμη που ζει σε σχεδόν βέβαιο ότι ήδη διατεθεί, και ίσως δεν θα σώσει τίποτα, χρησιμοποιώντας κάτι μικρότερο, επειδή η επόμενη μεταβλητή είναι πιθανό να θέλουν να ευθυγραμμιστούν σε μεγαλύτερο όριο ούτως ή άλλως.

Απαντήθηκε 02/04/2009 στις 21:50
πηγή χρήστη

ψήφοι
2

Μπορείτε να χρησιμοποιήσετε ό, τι νομικό τύπο που θέλετε σε ένα για? δεν πρέπει να είναι αναπόσπαστο ή ακόμη και ενσωματωμένο Για παράδειγμα, μπορείτε να χρησιμοποιήσετε επαναλήπτες, καθώς και.:

for( std::vector<std::string>::iterator s = myStrings.begin(); myStrings.end() != s; ++s )
{
...
}

Το αν ή όχι θα έχει αντίκτυπο στην απόδοση έρχεται κάτω σε ερώτηση για το πώς εφαρμόζονται οι επιχειρήσεις που χρησιμοποιείτε. Έτσι, στο παραπάνω παράδειγμα, που σημαίνει τέλος (), χειριστή! = () Και του φορέα εκμετάλλευσης ++ ().

Απαντήθηκε 02/04/2009 στις 21:54
πηγή χρήστη

ψήφοι
3

Εξαρτάται από την αρχιτεκτονική. Από την PowerPC, υπάρχει συνήθως μια μαζική ποινή επιδόσεις που ενέχει η χρήση οτιδήποτε άλλο εκτός από int (ή ό, τι η μητρική μέγεθος λέξη είναι) - π.χ., δεν χρησιμοποιούν σύντομες ή char. Float είναι ακριβώς έξω, πάρα πολύ.

Θα πρέπει να φορά αυτό για την ιδιαίτερη αρχιτεκτονική σας, διότι ποικίλλει, αλλά σε περιπτώσεις δοκιμής μου ήταν ~ 20% επιβράδυνση από τη χρήση σύντομο αντί int.

Απαντήθηκε 02/04/2009 στις 22:24
πηγή χρήστη

ψήφοι
1

Μια ανυπόγραφη ή size_t πρέπει, θεωρητικά, να σας δώσει καλύτερα αποτελέσματα (wow, εύκολο οι άνθρωποι, που προσπαθούν να βελτιστοποιήσουν για το κακό, και εναντίον εκείνων φωνάζοντας «πρόωρη» ανοησίες. Είναι η νέα τάση).

Ωστόσο, δεν έχει τα μειονεκτήματά του, κυρίως το κλασικό ένα: βίδα-up.

προγραμματιστές της Google φαίνεται να το αποφύγει να είναι όμως πίτα για την καταπολέμηση της std ή ώθηση.

Απαντήθηκε 02/04/2009 στις 22:47
πηγή χρήστη

ψήφοι
2

Αυτό δεν είναι πραγματικά μια απάντηση. Είμαι απλά να εξερευνήσετε τι είπε Crashworks για το PowerPC. Όπως άλλοι έχουν επισημάνει ήδη, χρησιμοποιώντας έναν τύπο που χαρτογραφεί με το φυσικό μέγεθος του κειμένου θα πρέπει να δώσει το συντομότερο κώδικα και την καλύτερη απόδοση.

$ cat loop.c
extern void bar();

void foo()
{
    int i;

    for (i = 0; i < 42; ++i)
        bar();
}

$ powerpc-eabi-gcc -S -O3 -o - loop.c
.
.
.L5:
        bl bar
        addic. 31,31,-1
        bge+ 0,.L5

Είναι αρκετά διαφορετικό με short i, αντί της int i, και μοιάζει δεν θα αποδίδουν εξίσου καλά ούτε.

.L5:
        bl bar
        addi 3,31,1
        extsh 31,3
        cmpwi 7,31,41
        ble+ 7,.L5
Απαντήθηκε 02/04/2009 στις 23:08
πηγή χρήστη

ψήφοι
0

Αν έχετε καταρτίσει το πρόγραμμά σας με τη βελτιστοποίηση (π.χ. gcc-O), δεν έχει σημασία. Ο compiler θα διαθέσει έναν ακέραιο μητρώο με την αξία και ποτέ δεν αποθηκεύει στη μνήμη ή στη στοίβα. Αν βρόχο σας καλεί μια ρουτίνα, gcc θα διαθέσει μια από τις μεταβλητές R14-R31 που θα σώσει οποιαδήποτε ονομάζεται ρουτίνα και την αποκατάσταση. Έτσι, η χρήση int, γιατί αυτό προκαλεί το λιγότερο έκπληξη για όποιον διαβάζει τον κωδικό σας.

Απαντήθηκε 28/09/2009 στις 01:54
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more