Προγραμματισμός

Τρόπος συγκριτικής αξιολόγησης κώδικα C # χρησιμοποιώντας BenchmarkDotNet

Το BenchmarkDotNet είναι μια ελαφριά, ανοιχτή πηγή, ισχυρή βιβλιοθήκη .NET που μπορεί να μεταμορφώσει τις μεθόδους σας σε σημεία αναφοράς, να παρακολουθείτε αυτές τις μεθόδους και, στη συνέχεια, να παρέχει πληροφορίες σχετικά με τα δεδομένα απόδοσης που καταγράφονται. Είναι εύκολο να γράψετε σημεία αναφοράς BenchmarkDotNet και τα αποτελέσματα της διαδικασίας συγκριτικής αξιολόγησης είναι επίσης φιλικά προς τον χρήστη.

Μπορείτε να εκμεταλλευτείτε το BenchmarkDotNet για να συγκρίνετε και τις δύο εφαρμογές .NET Framework και .NET Core. Σε αυτό το άρθρο θα διερευνήσουμε πώς μπορούμε να συνεργαστούμε με το BenchmarkDotNet στο .NET Core. Μπορείτε να βρείτε το BenchmarkDotNet στο GitHub.

Για να εργαστείτε με τα παραδείγματα κώδικα που παρέχονται σε αυτό το άρθρο, θα πρέπει να έχετε εγκαταστήσει το Visual Studio 2019 στο σύστημά σας. Εάν δεν έχετε ήδη αντίγραφο, μπορείτε να κατεβάσετε το Visual Studio 2019 εδώ.

Δημιουργήστε ένα έργο εφαρμογής κονσόλας στο Visual Studio

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα έργο εφαρμογής .NET Core κονσόλας στο Visual Studio. Υποθέτοντας ότι το Visual Studio 2019 είναι εγκατεστημένο στο σύστημά σας, ακολουθήστε τα βήματα που περιγράφονται παρακάτω για να δημιουργήσετε ένα νέο έργο εφαρμογής .NET Core κονσόλας στο Visual Studio.

  1. Εκκινήστε το Visual Studio IDE.
  2. Κάντε κλικ στο "Δημιουργία νέου έργου".
  3. Στο παράθυρο "Δημιουργία νέου έργου", επιλέξτε "Εφαρμογή κονσόλας (.NET Core)" από τη λίστα των προτύπων που εμφανίζονται.
  4. Κάντε κλικ στο Επόμενο.
  5. Στο παράθυρο "Διαμόρφωση του νέου έργου" που εμφανίζεται στη συνέχεια, καθορίστε το όνομα και την τοποθεσία για το νέο έργο.
  6. Κάντε κλικ στο Δημιουργία.

Αυτό θα δημιουργήσει ένα νέο έργο εφαρμογής .NET Core κονσόλας στο Visual Studio 2019.

Σημειώστε ότι όταν δημιουργείτε το έργο εφαρμογής της κονσόλας, η προκύπτουσα κλάση Προγράμματος (που δημιουργείται αυτόματα στο αρχείο Program.cs) θα έχει την εξής μορφή:

Πρόγραμμα τάξης

{

static void Main (συμβολοσειρά [] args)

  {

Console.WriteLine ("Hello World!");

  }

}

Θα χρησιμοποιήσουμε αυτήν την κατηγορία έργου και προγράμματος για να συνεργαστούμε με το BenchmarkDotNet στις επόμενες ενότητες αυτού του άρθρου.

Εγκαταστήστε το πακέτο BenchmarkDotNet NuGet

Για να εργαστείτε με το BenchmarkDotNet πρέπει να εγκαταστήσετε το πακέτο BenchmarkDotNet. Μπορείτε να το κάνετε είτε μέσω του NuGet Package Manager στο Visual Studio 2019 IDE είτε εκτελώντας την ακόλουθη εντολή στο NuGet Package Manager Console:

Εγκατάσταση πακέτου BenchmarkDotNet

Γιατί ο κωδικός αναφοράς;

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

Βήματα για τον κώδικα συγκριτικής αξιολόγησης χρησιμοποιώντας BenchmarkDotNet

Για να εκτελέσετε το BenchmarkDotNet στην εφαρμογή .NET Framework ή .NET Core, πρέπει να ακολουθήσετε τα εξής βήματα:

  1. Προσθέστε το απαραίτητο πακέτο NuGet
  2. Προσθέστε χαρακτηριστικά αναφοράς στις μεθόδους σας
  3. Δημιουργήστε μια παρουσία BenchmarkRunner
  4. Εκτελέστε την εφαρμογή σε κατάσταση απελευθέρωσης

Δημιουργήστε μια κλάση συγκριτικής αξιολόγησης στο .NET Core

Ανοίξτε το αρχείο Program.cs και γράψτε τον παρακάτω κώδικα.

  [MemoryDiagnoser]

δημόσια τάξη MemoryBenchmarkerDemo

    {

int NumberOfItems = 100000;

[Σημείο αναφοράς]

δημόσια συμβολοσειρά ConcatStringsUsingStringBuilder ()

        {

var sb = νέο StringBuilder ();

για (int i = 0; i <NumberOfItems; i ++)

            {

sb. Απόρριψη ("Hello World!" + i);

            }

επιστροφή sb.ToString ();

        }

[Σημείο αναφοράς]

δημόσια συμβολοσειρά ConcatStringsUsingGenericList ()

        {

var list = νέα λίστα (NumberOfItems);

για (int i = 0; i <NumberOfItems; i ++)

            {

list.Add ("Hello World!" + i);

            }

λίστα επιστροφής. ToString ();

        }

    }

Το παραπάνω πρόγραμμα δείχνει πώς μπορείτε να γράψετε μεθόδους για συγκριτική αξιολόγηση. Σημειώστε τη χρήση του χαρακτηριστικού Benchmark πάνω από καθεμία από τις μεθόδους που πρέπει να συγκριθούν.

Στην κύρια μέθοδο του αρχείου Program.cs πρέπει να καθορίσετε το αρχικό σημείο εκκίνησης - την κλάση BenchmarkRunner. Αυτός είναι ένας τρόπος ενημέρωσης του BenchmarkDotNet για την εκτέλεση σημείων αναφοράς στην καθορισμένη κλάση. Έτσι, αντικαταστήστε τον προεπιλεγμένο κωδικό της κύριας μεθόδου στο αρχείο Program.cs χρησιμοποιώντας το ακόλουθο απόσπασμα κώδικα.

static void Main (συμβολοσειρά [] args)

{

var περίληψη = BenchmarkRunner.Run ();

}

Εκτελέστε το σημείο αναφοράς στην εφαρμογή .NET Core

Εάν εκτελέσετε την εφαρμογή σε κατάσταση εντοπισμού σφαλμάτων, δείτε το μήνυμα σφάλματος που θα δείτε:

Κατά τη συγκριτική αξιολόγηση θα πρέπει πάντα να διασφαλίζετε ότι εκτελείτε το έργο σας σε λειτουργία έκδοσης. Ο λόγος είναι ότι κατά τη διάρκεια της σύνταξης ο κώδικας βελτιστοποιείται διαφορετικά και για τις λειτουργίες εντοπισμού σφαλμάτων και απελευθέρωσης. Ο μεταγλωττιστής C # κάνει μερικές βελτιστοποιήσεις σε λειτουργία απελευθέρωσης που δεν είναι διαθέσιμες σε λειτουργία εντοπισμού σφαλμάτων.

Ως εκ τούτου, θα πρέπει να εκτελέσετε το έργο σας μόνο σε λειτουργία κυκλοφορίας. Για να εκτελέσετε συγκριτική αξιολόγηση, καθορίστε την ακόλουθη εντολή στη γραμμή εντολών του Visual Studio.

dotnet run -p BenchmarkDotNetDemo.csproj -c Έκδοση

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

Λάβετε υπόψη ότι εάν δεν καθορίσετε την παράμετρο διαμόρφωσης, τότε ο χρόνος εκτέλεσης θα προσπαθήσει να κάνει συγκριτική αξιολόγηση σε μη βελτιστοποιημένο κώδικα λειτουργίας εντοπισμού σφαλμάτων. Και θα εμφανιστεί το ίδιο σφάλμα που φαίνεται στο Σχήμα 1.

Αναλύστε τα αποτελέσματα συγκριτικής αξιολόγησης

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

Μερικά αρχεία θα δημιουργηθούν επίσης στο φάκελο BenchmarkDotNet.Artifacts κάτω από τον ριζικό φάκελο της εφαρμογής. Ακολουθεί μια σύνοψη των αποτελεσμάτων.

Όπως φαίνεται από την περίληψη που φαίνεται στο Σχήμα 2, για κάθε μέθοδο συγκριτικής αξιολόγησης, θα δείτε μια σειρά δεδομένων που καθορίζει τις μετρήσεις απόδοσης, όπως ο μέσος χρόνος εκτέλεσης, οι συλλογές Gen 0, Gen 1, Gen 2 κ.λπ.

Κατά την εξέταση των αποτελεσμάτων που φαίνονται στο Σχήμα 3, μπορείτε να δείτε ότι το ConcatStringUsingGenericList είναι πολύ πιο γρήγορο από τη μέθοδο ConcatStringUsingStringBuilder. Μπορείτε επίσης να δείτε ότι υπάρχουν πολλές ακόμη κατανομές μετά την εκτέλεση της μεθόδου ConcatStringUsingStringBuilder.

Τώρα προσθέστε το χαρακτηριστικό RankColumn στην κορυφή της κλάσης MemoryBenchmarkerDemo. Αυτό θα προσθέσει μια επιπλέον στήλη στην έξοδο που δείχνει ποια μέθοδο ήταν πιο γρήγορη. Εκτελέστε ξανά τη διαδικασία συγκριτικής αξιολόγησης χρησιμοποιώντας την ακόλουθη εντολή.

dotnet run -p BenchmarkDotNetDemo.csproj -c Έκδοση

Όταν εκτελείτε αυτήν την εντολή, η διαδικασία συγκριτικής αξιολόγησης ξεκινά και εμφανίζει την έξοδο μετά την επιτυχή εκτέλεση της διαδικασίας συγκριτικής αξιολόγησης. Το σχήμα 4 παρακάτω δείχνει την έξοδο με προσθήκη RankColumn.

Το BenchmarkDotNet είναι ένα ωραίο εργαλείο που παρέχει έναν απλό τρόπο λήψης τεκμηριωμένης απόφασης σχετικά με τις μετρήσεις απόδοσης της εφαρμογής σας. Στο BenchmarkDotNet, η επίκληση μιας μεθόδου που έχει το σύνολο χαρακτηριστικών Benchmark είναι γνωστή ως λειτουργία. Επανάληψη είναι το όνομα που δίνεται σε μια συλλογή πολλών λειτουργιών.

Μπορείτε να εξερευνήσετε μια επίδειξη εφαρμογής ASP.NET Core που απεικονίζει διάφορους τρόπους συγκριτικής αξιολόγησης του κώδικα. Μπορείτε να λάβετε την εφαρμογή από το repo ASP.NET στο GitHub.

Πώς να κάνετε περισσότερα στο C #:

  • Πώς να ενοποιήσετε τις στατικές μεθόδους δοκιμής στο C #
  • Πώς να αναπαράγετε αντικείμενα του Θεού στο C #
  • Πώς να χρησιμοποιήσετε το ValueTask σε C #
  • Πώς να χρησιμοποιήσετε το αμετάβλητο στο C
  • Πώς να χρησιμοποιήσετε const, μόνο για ανάγνωση και στατικό σε C #
  • Πώς να χρησιμοποιήσετε σχολιασμούς δεδομένων στο C #
  • Πώς να εργαστείτε με GUID στο C # 8
  • Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη εναντίον διεπαφής στο C #
  • Πώς να εργαστείτε με το AutoMapper στο C #
  • Πώς να χρησιμοποιήσετε τις εκφράσεις λάμδα στο C #
  • Πώς να συνεργαστείτε με τους αντιπροσώπους Action, Func και Predicate στο C #
  • Πώς να συνεργαστείτε με εκπροσώπους στο C #
  • Πώς να εφαρμόσετε έναν απλό καταγραφέα στο C #
  • Πώς να εργαστείτε με χαρακτηριστικά στο C #
  • Πώς να εργαστείτε με το log4net στο C #
  • Πώς να εφαρμόσετε το μοτίβο σχεδίασης αποθετηρίου στο C #
  • Πώς να εργαστείτε με προβληματισμό στο C #
  • Πώς να εργαστείτε με το σύστημα παρακολούθησης αρχείων στο C #
  • Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #
  • Πώς να εργαστείτε με το MSMQ στο C #
  • Πώς να εργαστείτε με μεθόδους επέκτασης στο C #
  • Πώς να μας εκφράσεις λάμδα στο C #
  • Πότε να χρησιμοποιήσετε την ευμετάβλητη λέξη-κλειδί στο C #
  • Πώς να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης στο C #
  • Πώς να εφαρμόσετε τον πολυμορφισμό στο C #
  • Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #
  • Πώς να εργαστείτε με το RabbitMQ στο C #
  • Πώς να εργαστείτε με μια πλειάδα στο C #
  • Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #
  • Πώς να χρησιμοποιήσετε το Dapper ORM στο C #
  • Πώς να χρησιμοποιήσετε το μοτίβο σχεδιασμού flyweight στο C #
$config[zx-auto] not found$config[zx-overlay] not found