Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Late binding in VB.NET [Performance Issue]

Îåêßíçóå áðü ôï ìÝëïò tasos. Τελευταία δημοσίευση από το μέλος PALLADIN στις 18-12-2006, 16:25. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-12-2006, 16:42 22312

    Late binding in VB.NET [Performance Issue]

    Καλησπέρα σας,

        Δουλεύω ένα project σε VB.NET, στο οποίο έχει μεγάλη σημασία η γρήγορη εκτέλεση του κώδικα. Λόγω σχεδίασης χρησιμοποιώ κάποια αντικείμενα με τέτοιο τρόπο στον κώδικα έτσι ώστε αναγκαστικά έχω late binding. Το θέμα είναι ότι το αντικείμενο είναι το ίδιο σε όλη τη διάρκεια της εκτέλεσης, οπότε πρακτικά χρειάζεται μία φορά να γίνει το late binding. Παραθέτω λίγο κώδικα για να γίνω πιο αντιληπτός



    Public MustInherit Class AbstractObject
       Public MustOverride Sub DoWork()
    End Class

    Public Class ConcreteObject
       Inherits AbstractObject
       Public Overrides Sub DoWork()
          'DoWork Code here...
       End Sub
    End Class

    Sub Main()
       Dim myObj As AbstractObject
       myObj = New ConcreteObject
       For I As Integer = 1 To 1000000
          myObj.DoWork()
       Next
    End Sub


    Άν όντως το late binding γίνεται κάθε φορά, τότε υπάρχει καθυστέρηση στην εκτέλεση του κώδικα. Μέσα στο msdn, υπάρχει ένα άρθρο με τίτλο "Performance Optimization in Visual Basic .NET" όπου προτείνεται να αποφεύγεται το late binding όσο είναι δυνατόν. Για είναι διατηρήσιμος ο κώδικας δεν μπορώ να αποφύγω το late binding. Έκανα κάποια πειράματα και κάποιες χρονομετρήσεις (σε κώδικα όμοιο με τον παραπάνω) και οι αντίστοιχοι χρόνοι βγήκαν πολύ κοντά, αλλά όχι ίδιοι (11,89 με LB και 11,77 χωρίς LB). Γνωρίζει κανείς αν ο compiler κάνει κάποιου είδους βελτιστοποίηση για τέτοιες περιπτώσεις;

    Υ.Γ. Έχω διαβάσει κάπου στο forum ότι η C++ είναι πιο γρήγορη από VB.NET και C# όταν δεν χρησιμοποιείται ο garbage collector (των VB και C#) αλλά οι runtime βιβλιοθήκες της C++. Λίγο αργά βέβαια, για αυτό και επέλεξα την VB.NET.


    Τάσος Καραγιάννης

    Baby debugging steps...
  •  17-12-2006, 14:03 22391 σε απάντηση της 22312

    Απ: Late binding in VB.NET [Performance Issue]

    Καλησπέρα φιλε Tάσο,

    Αυτό που περιγράφεις στον κώδικά σου είναι polymorphic method dispatch

    Σε επίπεδο IL υλοποιείται ως ένα CallVirt instruction.

    Από όλα τα late-bound invocations (delegates, DynamicMethods, InvokeMember) αυτό είναι το ποιο

    γρήγορο, γιατί ο JIT το μονο που έχει να κάνει είναι να χρησιμοποιήσει τον pointer του vtable και να προσθέσει

    το ανάλογο offset (για να φτάσει στην μέθοδο)

    Το method call σου ο JIT θα το μετατρέψει σε x86

    myObj.DoWork()

    mov ecx, ebx
    mov eax, dword prt [ecx]
    call dword ptr [eax+38h]

    Οποτε όπως βλέπεις είναι "αρκετά" γρήγορο

    Μια πολύ καλή πηγή για "inside" πληροφορίες είναι το βιβλίο Shared Source CLI Essentials

    Αυτα,  Happy Coding...


     


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
  •  17-12-2006, 15:34 22393 σε απάντηση της 22391

    Απ: Late binding in VB.NET [Performance Issue]

    Ο Palladin έχει δίκιο, αυτό που περιγράφεις δεν είναι late αλλά early binding. Δεν υπάρχει τρόπος, ούτε λόγος, να εκτελέσεις τον κώδικα γρηγορότερα, αν θέλεις να χρησιμοποιήσεις πολυμορφισμό. Ακόμα και αν προσπαθήσεις να χρησιμοποιήσεις generics, θα πρέπει να κάνεις πάλι κλήσεις σε virtual μεθόδους.

    Το κόστος σε ταχύτητα γενικά δεν είναι σημαντικό. Σε κάθε εφαρμογή υπάρχουν πολλοί σημαντικότεροι παράγοντες καθυστέρησης πριν χρειαστεί optimization των virtual μεθόδων. Ένας καλύτερος αλγόριθμος, χρήση stored procedures αντί χύμα SQL, χρήση StringBuilder αντί για concatenation των strings, όλα αυτά θα βελτιώσουν την ταχύτητα πολύ περισσότερο απ' ότι η αντικατάσταση των virtual μεθόδων.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-12-2006, 13:07 22438 σε απάντηση της 22312

    Απ: Late binding in VB.NET [Performance Issue]

    Ευχαριστώ πολύ, δοκιμάζοντας λίγα πράματα ακόμα είδα ότι έχετε δίκιο σε αυτό. Θα ήθελα βέβαια να ρωτήσω τι ακριβώς είναι το String Builder και τι το concatenation των strings. Ρωτάω γιατί η DoWork() γενικά είναι να διαβάζει και να γράφει strings.
    Τάσος Καραγιάννης

    Baby debugging steps...
  •  18-12-2006, 15:23 22444 σε απάντηση της 22438

    Απ: Late binding in VB.NET [Performance Issue]

    Όταν "προσθαφαιρείς" strings, "απο κάτω" το framework δηιουργεί περιττά string instances, το οποίο σου τρώει performance. Π.χ. η γραμμή:

    string strResult = string1 + string2 + string3 + ... + stringN δημιουργεί N string instances μέχρι να φτιάξει το τελικό αποτέλεσμα.

    ( Concatenation είναι η πράξη του να "κολλάς" strings μεταξύ τους )

    O System.Text.StringBuilder τώρα, είναι ένα μικρό utility class, το οποίο χρησιμοποιείς για να κάνεις την ίδια δουλειά, μόνο που την κάνει πιο efficiently - και σου δίνει και κάποια άλλα "καλούδια" που κάνουν τη ζωή σου ευκολότερη ...

    Αυτά τ'απλά ...
    Angel
    O:]
  •  18-12-2006, 16:25 22452 σε απάντηση της 22444

    Απ: Late binding in VB.NET [Performance Issue]

    Γενικότερα στο .Net εάν έχεις προβλήματα σε performance τότε συνήθως πρέπει να κοιτάξεις τους performance counters του GC (Garbage Collector)

    Και ποτε δεν ξεκινάμε optimization πριν κάνουμε profiling πρώτα...

    "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."


    Palladinos Nick
    Software Engineer
    -----------------------
    The limits of my language mean the limits of my world. (Ludwig Wittgenstein)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems