Έξυπνες αναζητήσεις
Το googling είναι μια από τις πιο σημαντικές δεξιότητες για κάθε προγραμματιστή. Ας δούμε πώς κάνουμε εξειδικευμ...
Το googling είναι μια από τις πιο σημαντικές δεξιότητες για κάθε προγραμματιστή. Ας δούμε πώς κάνουμε εξειδικευμ...
Στη JavaScript, οι χρονικές σημάνσεις συνήθως συσχετίζονται με την ώρα Unix. Και υπάρχουν διαφορετικές μέθοδοι για τ...
Αλληλεπιδρούμε πολύ με το HTTP και το HTTPS στην καθημερινή μας ζωή, αλλά πολλοί από εμάς δεν γνωρί...
An absolute path refers to defining the full exact file path, for example, D:\http\project\lib\file.php. While a relative path is based on the current working directory, where the script is located. ...
What Is a PHP Interface? A PHP interface defines a contract which a class must fulfill. If a PHP class is a blueprint for objects, an interface is a blueprint for classes. Any class implementing a ...
@Με την πρώτη ματιά Array και List φαίνονται ίδια, αλλά η διαφορά στην ταχύτητα μπορεί να είναι έως και 97,35%. Ποιες είναι οι διαφορές μεταξύ Array και List στη C#; Ένας πίνακας και μία λίστα χρησιμεύουν και οι δύο ως συλλογές τιμών, αλλά διαφέρουν ως προς τον τρόπο αποθήκευσης των περιεχομένων τους στη μνήμη και τον τρόπο πρόσβασης σε αυτά. Για να χρησιμοποιήσετε μία από τις 2 μεθόδους πρέπει να κατανοήσουμε τις διαφορές μεταξύ τους, ώστε να επιλεγεί η κατάλληλη μέθοδος για τον σκοπό σας. Αρχικά, ας εξετάσουμε γρήγορα τις βασικές έννοιες του τι είναι ένας πίνακας και τι είναι μία λίστα:
Τι είναι ένας πίνακας (Array);
Ένας πίνακας είναι ένα σύνολο ή μια ακολουθία στοιχείων που μπορεί να είναι διαφορετικών τύπων (string, double, int, float, κ.λπ.) αλλά πρέπει να αναφέρεται μόνο σε έναν από αυτούς κάθε φορά. Επιτρέπει την αποθήκευση πολλών μεταβλητών του ίδιου τύπου μέσα σε μια μεταβλητή.
Ας φανταστούμε ότι έχουμε ένα ημερολόγιο που αποθηκεύει το "holidays". Μπορούμε να αποθηκεύουμε π.χ. πολλές αργίες σε μία μόνο μεταβλητή.
string[] holidays = {"christmas", "easter", "new year"};
Ένα από τα κύρια χαρακτηριστικά των πινάκων είναι ότι έχουν πάντα καθορισμένο μήκος, το οποίο είναι ίσο με τον αριθμό των στοιχείων που χωρούν στο εσωτερικό τους.
Τι είναι μια λίστα (List);
Μια λίστα είναι μια ομάδα αντικειμένων που μπορεί να είναι διαφορετικών τύπων (δεν χρειάζεται να είναι όλα του ίδιου τύπου όπως στον Πίνακα).
Ας δούμε πώς θα ήταν το παράδειγμα των "holidays" σε μια λίστα:
var holidays = new List
holidays.Add("christmas");
holidays.Add("easter");
holidays.Add("new year");
Το κύριο χαρακτηριστικό μιας λίστας (και η διαφορά της με έναν πίνακα) είναι ότι το μήκος της δεν χρειάζεται να οριστεί, μπορεί να έχει μεταβλητό μήκος.
Τι είναι η χρήση μνήμης και ποιοι τύποι υπάρχουν;
Η μνήμη που εξηγείται με πολύ βασικό τρόπο, είναι ο χώρος στον οποίο η εφαρμογή «θυμάται» πληροφορίες ή δεδομένα που χρησιμοποιούνται σε μια χρονική περίοδο. Είναι σαν την ανθρώπινη μνήμη. Όταν μιλάμε για χρήση μνήμης, συχνά συγχέεται με το μέγεθος της μνήμης που χρησιμοποιεί στο δίσκο και εδώ δημιουργούνται αμφιβολίες. Ας δούμε γρήγορα τους 2 τύπους μνήμης που υπάρχουν:
Στατική μνήμη: Ο τύπος μνήμης που ορίζεται κατά το χρόνο μεταγλώττισης. Αυτός ο χώρος μνήμης είναι δεσμευμένος για μια μεταβλητή και δεν μπορεί να αλλάξει κατά το χρόνο εκτέλεσης.
Δυναμική μνήμη: Ο τύπος της μνήμης που χρησιμοποιείται κατά το χρόνο εκτέλεσης. Αυτός ο χώρος μνήμης προορίζεται επίσης για μια μεταβλητή, αλλά σε αυτήν την περίπτωση μπορεί να τροποποιηθεί κατά το χρόνο εκτέλεσης.
Ας είμαστε πιο σαφείς στη διαφορά μεταξύ στατικής και δυναμικής μνήμης. Για αυτήν τη σύγκριση, μεταξύ Array και List, ας εστιάσουμε σε αυτό που μας ενδιαφέρει αυτή τη στιγμή: Στη δυναμική μνήμη.
Επεξήγηση δυναμικής μνήμης (Array)
Ας υποθέσουμε ότι έχουμε χώρο στη δυναμική μνήμη, ας σκεφτούμε τα κελιά. Σε κάθε κελί αποθηκεύεται μια τιμή. Τώρα φανταστείτε ότι έχουμε ήδη πολλά κελιά που καταλαμβάνονται από κάτι.
Τώρα, ας φανταστούμε ότι θέλουμε να προσθέσουμε στη μνήμη τον προηγούμενο Πίνακα (array), αυτόν με τις διακοπές:
string[] holidays = {"c hristmas ", "easter", "new Year"};
Το αποτέλεσμα θα ήταν κάπως έτσι:
Λοιπόν, όλα καλά αλλά... τι θα γινόταν αν ήθελα να προσθέσω ένα άλλο στοιχείο στον πίνακα; Για παράδειγμα fallas (fallas είναι οι τυπικές ισπανικές διακοπές).
Αν νομίζουμε ότι το νέο στοιχείο θα πήγαινε στο επόμενο κελί (μετά το πρώτο Χ, κάτω από τα Χριστούγεννα), αποτύχαμε στην πρόβλεψη! Αυτό είναι το κύριο χαρακτηριστικό του Array, πρέπει να είναι πάντα συνεχής στη μνήμη. Δηλαδή, όλα τα στοιχεία του Array πρέπει να είναι το ένα δίπλα στο άλλο, δεν μπορούν να διαχωριστούν.
Έτσι, αν προσθέσουμε τις διακοπές Fallas , το αποτέλεσμα θα ήταν το εξής:
Να θυμάστε: Ο πίνακας θα αναζητά πάντα τον απαιτούμενο αριθμό ελεύθερων κελιών το ένα δίπλα στο άλλο για να τοποθετήσει εκεί τις τιμές τους.
Τώρα, έχοντας κάνει σαφές πώς λειτουργεί ένας πίνακας στη μνήμη, ας δούμε πώς λειτουργεί μια λίστα στη μνήμη.
Επεξήγηση δυναμικής μνήμης (List)
Οι λίστες λειτουργούν με nodes, ένα node αποτελείται από μια τιμή και έναν δείκτη στον επόμενο κόμβο/node. Υπάρχουν επίσης δείκτες έναρξης και λήξης, πράγμα που σημαίνει ότι αν θέλω την τιμή "new year" (παίρνοντας το παράδειγμα των διακοπών), θα ακολουθούσα απλώς τους δείκτες μέχρι να φτάσω σε αυτήν:
var holidays = new List
holidays.Add("christmas");
holidays.Add("easter");
holidays.Add("new year");
Ας φανταστούμε σε αυτό το σχήμα το πώς λειτουργούν οι Λίστες. Θέλουμε να προσθέσουμε τις διακοπές των ισπανικών fallas. Απλά ο δείκτης του τελευταίου στοιχείου (δηλαδή new year) θα δείχνει σε ένα νέο στοιχείο (που θα είναι fallas) και ο δείκτης αυτού του τελευταίου, θα δείχνει στον τελικό δείκτη. Ας δούμε το παράδειγμα:
Τώρα, πώς θα ήταν αν προσθέταμε ένα νέο στοιχείο (fallas) στη μνήμη μιας λίστας; Ας θυμηθούμε το πρόγραμμά μας:
Σε αυτήν την περίπτωση, καθώς τα στοιχεία λίστας λειτουργούν με δείκτες που δείχνουν προς το επόμενο στοιχείο, το νέο στοιχείο θα μπορούσε να πάει στο επόμενο ελεύθερο κελί. Δεν χρειάζεται να πάνε το ένα μετά το άλλο. Έτσι θα έμοιαζε:
Να θυμόμαστε ότι η λίστα μπορεί να συνεχιστεί στο επόμενο ελεύθερο κελί. Τα στοιχεία μιας λίστας δεν χρειάζεται να είναι όλα μαζί στη σειρά.
Τώρα, γνωρίζουμε τις διαφορές μεταξύ ενός πίνακα Array και μιας λίστας List, όσον αφορά τη μνήμη, αλλά τι γίνεται με την απόδοση; Νομίζω ότι έχετε ήδη μια ιδέα, αλλά ας πάμε λίγο πιο βαθιά.
Σημείο αναφοράς απόδοσης: Array vs List
Ας ξεκινήσουμε με την εξάσκηση! Θα έχουμε μια class που θα φορτώσει ένα σύνολο εγγραφών μέσα σε από ένα loop.
Οι δοκιμές που θα κάνουμε θα είναι οι ίδιες για λίστες και πίνακες:
int
object
long
ulong
Μπορείτε να τρέξετε τη δοκιμιή χρησιμοποιώντας το προγραμματάκι από το gist Array vs List benchmark για να μπορείτε να το δοκιμάσετε.
Κατά την εκτέλεση της δοκιμής βρήκαμε αυτό:
Αποτέλεσμα: οι πίνακες μπορεί να είναι έως και 97% πιο γρήγοροι από τις λίστες (προφανώς πρόκειται για ένα τεστ - σε πραγματικές δοκιμές η διαφορά θα είναι μικρότερη).
Ελπίζω η εξήγηση να ήταν σαφής, τώρα ξέρετε τις διαφορές μεταξύ ενός Array και μιας λίστας τόσο από άποψη μνήμης όσο και από άποψη απόδοσης!
Εγγραφείτε για να βλέπετε τα εξειδικευμένα άρθρα.