<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22452.aspx</link><pubDate>Tue, 19 Dec 2006 00:25:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22452</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22452.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22452</wfw:commentRss><description>Γενικότερα στο .Net εάν έχεις προβλήματα σε performance τότε συνήθως πρέπει να κοιτάξεις τους performance counters του GC (Garbage Collector)&lt;br /&gt;
&lt;br /&gt;
Και ποτε δεν ξεκινάμε optimization πριν κάνουμε profiling πρώτα...&lt;br /&gt;
&lt;br /&gt;
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil."&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Απ: Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22444.aspx</link><pubDate>Mon, 18 Dec 2006 23:23:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22444</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22444.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22444</wfw:commentRss><description>Όταν "προσθαφαιρείς" strings, "απο κάτω" το framework δηιουργεί περιττά string instances, το οποίο σου τρώει performance. Π.χ. η γραμμή:&lt;br /&gt;
&lt;br /&gt;
string strResult = string1 + string2 + string3 + ... + stringN δημιουργεί N string instances μέχρι να φτιάξει το τελικό αποτέλεσμα. &lt;br /&gt;
&lt;br /&gt;
( Concatenation είναι η πράξη του να "κολλάς" strings μεταξύ τους )&lt;br /&gt;
&lt;br /&gt;
O System.Text.StringBuilder τώρα, είναι ένα μικρό utility class, το οποίο χρησιμοποιείς για να κάνεις την ίδια δουλειά, μόνο που την κάνει πιο efficiently - και σου δίνει και κάποια άλλα "καλούδια" που κάνουν τη ζωή σου ευκολότερη ... &lt;br /&gt;
&lt;br /&gt;
Αυτά τ'απλά ...</description></item><item><title>Απ: Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22438.aspx</link><pubDate>Mon, 18 Dec 2006 21:07:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22438</guid><dc:creator>tasos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22438.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22438</wfw:commentRss><description>Ευχαριστώ πολύ, δοκιμάζοντας λίγα πράματα ακόμα είδα ότι έχετε δίκιο σε αυτό. Θα ήθελα βέβαια να ρωτήσω τι ακριβώς είναι το String Builder και τι το concatenation των strings. Ρωτάω γιατί η DoWork() γενικά είναι να διαβάζει και να γράφει strings.</description></item><item><title>Απ: Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22393.aspx</link><pubDate>Sun, 17 Dec 2006 23:34:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22393</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22393.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22393</wfw:commentRss><description>Ο Palladin έχει δίκιο, αυτό που περιγράφεις δεν είναι late αλλά early binding. Δεν υπάρχει τρόπος, ούτε λόγος, να εκτελέσεις τον κώδικα γρηγορότερα, αν θέλεις να χρησιμοποιήσεις πολυμορφισμό. Ακόμα και αν προσπαθήσεις να χρησιμοποιήσεις generics, θα πρέπει να κάνεις πάλι κλήσεις σε virtual μεθόδους.&lt;br /&gt;
&lt;br /&gt;
Το κόστος σε ταχύτητα γενικά δεν είναι σημαντικό. Σε κάθε εφαρμογή υπάρχουν πολλοί σημαντικότεροι παράγοντες καθυστέρησης πριν χρειαστεί optimization των virtual μεθόδων. Ένας καλύτερος αλγόριθμος, χρήση stored procedures αντί χύμα SQL, χρήση StringBuilder αντί για concatenation των strings, όλα αυτά θα βελτιώσουν την ταχύτητα πολύ περισσότερο απ' ότι η αντικατάσταση των virtual μεθόδων.</description></item><item><title>Απ: Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22391.aspx</link><pubDate>Sun, 17 Dec 2006 22:03:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22391</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22391.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22391</wfw:commentRss><description>&lt;FONT size=1&gt;
&lt;P&gt;Καλησπέρα φιλε Tάσο,&lt;/P&gt;
&lt;P&gt;Αυτό που περιγράφεις στον κώδικά σου είναι polymorphic method dispatch&lt;/P&gt;
&lt;P&gt;Σε επίπεδο IL υλοποιείται ως ένα CallVirt instruction.&lt;/P&gt;
&lt;P&gt;Από όλα τα late-bound invocations (delegates, DynamicMethods, InvokeMember) αυτό είναι το ποιο &lt;/P&gt;
&lt;P&gt;γρήγορο, γιατί ο JIT το μονο που έχει να κάνει είναι να χρησιμοποιήσει τον pointer του vtable και να προσθέσει&lt;/P&gt;
&lt;P&gt;το ανάλογο offset (για να φτάσει στην μέθοδο)&lt;/P&gt;&lt;FONT size=1&gt;
&lt;P&gt;Το method call σου ο JIT θα το μετατρέψει σε x86&lt;/P&gt;
&lt;P&gt;myObj.DoWork()&lt;/P&gt;
&lt;P&gt;mov ecx, ebx&lt;BR&gt;mov eax, dword prt [ecx]&lt;BR&gt;call dword ptr [eax+38h]&lt;/P&gt;&lt;FONT size=1&gt;
&lt;P&gt;Οποτε όπως βλέπεις είναι "αρκετά" γρήγορο &lt;/P&gt;
&lt;P&gt;Μια πολύ καλή πηγή για "inside" πληροφορίες είναι το βιβλίο &lt;A href="http://www.oreilly.com/catalog/sscliess/"&gt;Shared Source CLI Essentials&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Αυτα,&amp;nbsp; Happy Coding...&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;</description></item><item><title>Late binding in VB.NET [Performance Issue]</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22312.aspx</link><pubDate>Sat, 16 Dec 2006 00:42:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22312</guid><dc:creator>tasos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22312.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=22312</wfw:commentRss><description>&lt;P&gt;Καλησπέρα σας,&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Δουλεύω ένα project σε VB.NET, στο οποίο έχει μεγάλη σημασία η γρήγορη εκτέλεση του κώδικα. Λόγω σχεδίασης χρησιμοποιώ κάποια αντικείμενα με τέτοιο τρόπο στον κώδικα έτσι ώστε αναγκαστικά έχω late binding. Το θέμα είναι ότι το αντικείμενο είναι το ίδιο σε όλη τη διάρκεια της εκτέλεσης, οπότε πρακτικά χρειάζεται μία φορά να γίνει το late binding. Παραθέτω λίγο κώδικα για να γίνω πιο αντιληπτός&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;MustInherit&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt; AbstractObject&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;MustOverride&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; DoWork()&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt; ConcreteObject&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Inherits&lt;/span&gt; AbstractObject&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Overrides&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; DoWork()&lt;br /&gt;      &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;'DoWork Code here...&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt; Main()&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; myObj &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; AbstractObject&lt;br /&gt;   myObj &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;New&lt;/span&gt; ConcreteObject&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;For&lt;/span&gt; I &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Integer&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; 1 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;To&lt;/span&gt; 1000000&lt;br /&gt;      myObj.DoWork()&lt;br /&gt;   &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Next&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Sub&lt;/span&gt;&lt;/span&gt;&lt;BR&gt;&lt;BR&gt;Άν όντως το late binding γίνεται κάθε φορά, τότε υπάρχει καθυστέρηση στην εκτέλεση του κώδικα. Μέσα στο msdn, υπάρχει ένα άρθρο με τίτλο "&lt;STRONG&gt;Performance Optimization in Visual Basic .NET&lt;/STRONG&gt;" όπου προτείνεται να αποφεύγεται το late binding όσο είναι δυνατόν. Για είναι διατηρήσιμος ο κώδικας δεν μπορώ να αποφύγω το late binding. Έκανα κάποια πειράματα και κάποιες χρονομετρήσεις (σε κώδικα όμοιο με τον παραπάνω) και οι αντίστοιχοι χρόνοι βγήκαν πολύ κοντά, αλλά όχι ίδιοι (11,89 με LB και 11,77 χωρίς LB). Γνωρίζει κανείς αν ο compiler κάνει κάποιου είδους βελτιστοποίηση για τέτοιες περιπτώσεις; &lt;BR&gt;&lt;BR&gt;Υ.Γ. Έχω διαβάσει κάπου στο forum ότι η C++ είναι πιο γρήγορη από VB.NET και C# όταν δεν χρησιμοποιείται ο garbage collector (των VB και&amp;nbsp;C#) αλλά οι runtime βιβλιοθήκες της C++. Λίγο αργά βέβαια, για αυτό και επέλεξα την VB.NET.&lt;/P&gt;</description></item></channel></rss>