Dot Net Perls
Top 37 C# Example Pages...

["*frwrle.+CXCXST~~}T~~Y7966F(+CC.Bc(/CS}T~~}T~~","Inline Optimization."," Manually inlining a method body affects performance. Until recently, C# did not provide macros or the inline keyword. But you can always paste in nested function bodies into the enclosing methods. This influences performance. ","Caution: ","Please consider the AggressiveInlining option built into the .NET Framework before using this approach.","Example."," In this benchmark program, we test the execution engine performance of the .NET Framework on two different methods: A and B. Method A contains all the necessary operations in its body directly. ","And: ","Method B contains another method call (C) that does part of the execution logic.","The Main entry point"," then demonstrates the performance difference between the two first methods. It shows that manually inlining improves performance by about 1.5 nanoseconds per invocation on the test computer. ","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","C# program that benchmarks inlined method","\n\nusing System;\nusing System.Diagnostics;\n\nclass Program\n{\n static int ","A","(int v)\n {","\n // This is a single method call.\n // ... It contains twenty increments.\n ","v++; v++; v++; v++; v++; v++; v++; v++; v++; v++;\n v++; v++; v++; v++; v++; v++; v++; v++; v++; v++;\n return v;\n }\n\n static int ","B","(int v)\n {","\n // This does ten increments.\n // ... Then it does ten more increments in another method.\n ","v++; v++; v++; v++; v++; v++; v++; v++; v++; v++;\n v = C(v);\n return v;\n }\n\n static int C(int v)\n {","\n // This does ten increments.\n ","v++; v++; v++; v++; v++; v++; v++; v++; v++; v++;\n return v;\n }\n\n static void Main()\n {\n const int max = 100000000;\n int temp1 = 0;\n int temp2 = 0;\n A(0);\n B(0);\n C(0);\n\n var s1 = Stopwatch.StartNew();\n for (int i = 0; i < max; i++)\n {\n temp1 = A(i);\n }\n s1.Stop();\n var s2 = Stopwatch.StartNew();\n for (int i = 0; i < max; i++)\n {\n temp2 = B(i);\n }\n s2.Stop();\n Console.WriteLine(s1.Elapsed.TotalMilliseconds * 1000 * 1000 / (double)max);\n Console.WriteLine(s2.Elapsed.TotalMilliseconds * 1000 * 1000 / (double)max);\n Console.WriteLine(\"{0} {1}\", temp1, temp2);\n Console.Read();\n }\n}\n\n","Output","\n\n2.236963 (inlined)\n3.820417 (regular method)\n100000019 100000019","The first method"," A was measurably faster than method B, and this is due to the manually inlined method C. The benchmark also demonstrates that the result of the calls is equivalent in both loops, proving correctness.","Discussion."," In structural programming, developers use routines to organize complex programs. However, computers execute instructions, not routines. Compilers translate methods into series of instructions that operate on the evaluation stack. ","And: ","Unfortunately, these method instructions are pure overhead, at least when they are not required for modularity of design.","Tip: ","This explains the benefit to inlining methods. The just-in-time compiler inlines certain methods, but typically only small ones.","The AggressiveInlining option"," is available in .NET 4.5. Microsoft works continually to make C# faster. And this continually invalidates my articles. With AggressiveInlining, you can inline methods. ","AggressiveInlining ","aggressiveinlining","Code Complete."," The book Code Complete by Steve McConnell discusses the inline routine optimization. It states that in some languages, such as C++ and C, you can use the inline keyword or macros with #define.","The benchmark"," in that book shows that inlining a routine in C++ was mildly beneficial, but not beneficial in another language. This optimization makes some programs slower and others faster. You must test it to be certain of its effect.","Summary."," We explored inlining methods using a manual optimization technique in the C# language. This technique can explode the complexity of your program. But it can also improve performance in a measurable way. ","Thus: ","Methods are notational conveniences for programmers. Processors use instructions.","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","3679700504","data-ad-format","link","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAB4BAMAAADS7QcCAAAAGFBMVEX////0hHKambK+vs74sKT4raH4tKr2lYU8ckipAAAAfUlEQVR42u3XsQmAMBgF4V9xAAOCfVxAdAEdQtwg1il0fsHS8IpIsLob4OvPnKy1V7WXWb+J9pQZZpG3zkRNyowmmmBgYGBgYGBgYGBgYGA+Mn0QHTl3V+o1iYieKifLYq4gilnMYqIVBgYGBgYGBgYGBgYG5gfm3ESx0GvePshxrr29cIIAAAAASUVORK5CYII=)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANIAAABFCAMAAAAIJEiLAAAAGFBMVEUAru+g2Pf///8xt/BpxvPS6/vp9f0TtPCISbH1AAADCklEQVR4Xu2bwY7CMAxEPWM7/P8fr9baaNSG0lIQK6q8U2vhxk9ODD1gJBE3uwS3AEkjwy5EkCajqzgZ7GLAwi5G2M2uxceEJpPJZDKZTCYTzzCBsH8kAMCeA0OOJykNkLDP4iZAMu05UjkyYnMZveyEX3QJf9iVJN6npIC6FNTtWfSI/aeRfLsSpCAnup0nyF4nPqwkAwwV5ctKrS9G4qNKPtT/+nEK9t44/0EJ2mUiFTyr1EoEdSGlQGYi+t0vpRSFS6k+CZgwh5K1FJCJRkrJ7zYk7kQdiCeUUIskCSlFY8EWmiJCpy89WaRLiEruoLEjJfRNLxTesxRjdpB0r4ueB4p4rJTrQj0poHXuKG0UGsOcapXnh5WcJEDSajnNQWQJ+LaSUBG5Dsooc6EUW3W2laqziMNKlqVElFJ/ZLoavjkeCrhBn0OPRbm11VdeSknjZXfnPa0EsjUyuhLU5bp8rFQRnfqm5HIKXayVsmeLjfZBzT2mFCyslLSUtvUjJSwqVV810BRbKSkslBirOuHHvyb+Th/qLvtSUewqtVWl6rB6V7EYlRReo4TnycWaySqRgntKeU/JTNGm2FElzYfzSlFr9p7FaSVdKMozSvmykpPE+5TaQqmbfXbjWWoy6XCKUxtPUXxUqWmBrqTSTyvFYuItYu3cxItM2DE4KLk2zxmloLwxDnFQOUpaUwnjC8dZpdh+gMrZVjL2ZL2gVreaV4aUtCHF+GD1lvQTStCrE5kIiwio41nh3yjivpKqBiA5/IWS42+8ODLDWeC8Uq0lIGPFNpU82VFMAbnrYO3+HlJ393GSGJUMg1KRO0qDU7oVUJ5yNDfExhnzPKwUoxJWr3HMUAL2lAq0ITNaTxveanPndUmxtBeJACL8bvRQri9DgNIetcm1HYdp+w3kOMmgkHBW8BsInbhHX0Ge39EkGeRDI0DD4YucfLgTLOD2VU7QTRkNSgj7JkAogMHIIsK+DSwEZPR+JpPJZDKZTG7XEwq7GG6wi4Er/n+J7VJO0Wgk4Vf5L6CD5A+G4BPe8JfzjgAAAABJRU5ErkJggg==)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABDCAMAAADu8bq3AAAAMFBMVEX/////87L/99H/63he//Os//jR//v/507/7pH//fX/++aO//b/5C/p//0A//D0//4M59PNAAAC9klEQVR4XtXa627qMBCFUc+M77nw/m97dFAreWscJg2BOPsfpTJdEp8SQd0QW5sFd8FGgqzdxS4grt2NBrFPC/eD+C7E3w+yGuiRIXYk8Y6QYCQyMMSOxN8RshrmcSF2JPGeEH1euCdkUpDpcxDf7GzIeuA3L926N5J4T4iOJNwJEjxEspWID6ND4P2zLY5ueMhjKxIgPvZBmIlE0vx/STJxOQNQmJ5niuCBCHFeRaIT8c6C1OeL6WX+63VkbkbOOc7qwD5k6keCT7yGUAYDTuobkEL6ZCldSBuJ37pjjK8h88slPgyR1D2wdiAIWxrH0nINiLF6FIJDiYZMcGQvkelNSCrnQmYpPUjoRYI+A5IsST4ZMpOGYCQbiRgQma3VkyGpKAhWvfQTeRtCJ0NmUhAdiU7kfYicDUka0o8EdfshSZ5TF8ezIXPtQBYdCb7fLAgRM3MBXM0YyWGIPE9X11xSEIzk8eN4IE5D7IGED0ESsftdyQDJCoKRRH3HOB2EMMR5CELbKYqCqL9a2Q5C3NkQhki62epIPFjHgDjB6hCiIlGJjAMhqK4HCRAJJhLGgbABwUhUIscgzHwBBCJRieyHVCbKItIIzoQUQHYhU0ND2LQXUgla/ATEmRCMRCdiQygB4DLI0hyLrmUPhIFxGQSj8OqRCSEAXAnBSDARG8LzKBCsIsIDG1LSSJBHc26byMOG0DwOBLOARGxIJ3QRIaJrIKHBQYcWhNGQuf4KL4BgJI0p2hBSH51dC2l8HpwWRPD06yHTqjf9EZLcAJDQgYQdEIh8BEjsQOIdIc4rh3e3hOhIJgOiLyNDQEI/ETv2ZrwFyV+ELAqy7IHk/jchhQme+CLE+W4i9gURJMTM1PlSkb4ImTYTsW9R7Al/DRJXXDQgULs9+hqkIQLSgOTxIBiJ3wmp40ECQMJOiKPhIBhJ3AspMhrExXbOgNiSlFoIfw+CMyAg6QWf2VUZHaLGGRWZCvz8E5APrVKW9Pt/WmCkLAKQc/YPKd9C4FftKeoAAAAASUVORK5CYII=)"]

["url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAACCAgMAAADasxWRAAAADFBMVEX/6Nn///+VlZX29va5ksB5AAAASElEQVR4AWPACZj/f0DmjkqOSjKtQgcLyJccZiEE9SOmP8mXHEaBMBoIo4EwGggryJccvvVKKAogTnJUclRyVHLklgmjkqOSAALWyrsxEHLDAAAAAElFTkSuQmCC)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAAB4BAMAAADS7QcCAAAAGFBMVEX////0ctuZsLL4pOe8y8z4oej4qunCz9FAYxXHAAAAf0lEQVR42u3XwQ1AQBQG4YcGvAgFbCSudCCiAQcFuGhB+xJHm/+wsnGaKeC7j7mstldlkJnvoi1m+lUUrDFRFTOziRYYGBgYGBgYGBgYGBiYj4yfoiNmhksUcr0mEdFT4bIkpjtFacxoogkGBgYGBgYGBgYGBgbmB6bdRZ7pNW8Oq3ex+r2t+QAAAABJRU5ErkJggg==)","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAL4AAABBCAMAAABYbu5jAAAAMFBMVEX///+1wv+jqv9siv/p6//W3f8zZv9gb//19v9NK/8zAP999//S//8z//8zzP+z6P/0gInFAAABg0lEQVR4XtXXy1ICURAD0H7c96D+/9/KQqkhlEKD0iTrWZzKYtJXbou2s+jvn1Q55f2mfAMOb6Ec5D6+c/ObcvOdm98qN9+5+a1w842b3wo33/6Dv2H22g3zCL+PKF/uSKDsGL8pN9+5+U25+c7Nb5Wb74R8h+ki41eYLja+Qf1k/AL1k/HF4XIg4ytMFxl/X7/z8aF+Ov6A6bqR//FTnswXa2B96LmyPZtfoH4yvsDlwMaHy4GLj/Xz8RXqJ+PD5UDGh+ni448O08XEh+lSrtUVnC6qm+ey/krGx+li4+N0sfHh7Cfj43Sx8bF+Mj5OFxkf67c8frF+jJUovzRIBr/4+kovMb5YPr/OdcrUGL9k8FG/Tw3xxbP55/o1R4hfk/m6IBbii+fyJ/JnjK+5/HWRGuJLfzG+xvh6lX89f8m3GH90ar7Ya/FrkF8y+XNhRpAvlsi3+H8fUxP5A+svYb54Hl8Uy4/zNZEvCvo4XzyRLzrhXg7zNZMvw/o6ptsQpvDnE+wJyVGQ5SG7AAAAAElFTkSuQmCC)","url(data:image/jpeg;base64,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)","D","url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALwAAAByCAAAAADMwOSzAAACe0lEQVR4Xu3csY7kMAgG4Lz/86Wkp6ZAokDy6RTfodVsTDSaxPy7/uux9a0LZpkEb20YNzNVEWYmItr/hYiYWcS8Tcw2cKv8DTPtoxCzqFfC+wGXgCchYlGvgDfp9MBd/xNsIj7otL8XHwC8x14Sq04/Yine4tRvwEvP6ypqPXp+dgneY+nbaZPwHscOh7eww+HDjoL/uJ1m4D3scPjYFw8fawDxUWjw8LErFP7TB7/z0/jYFA8fB4+Il1iQh47UwF//fvrfLPV/t0WEj+52Ev5yjWc96y/MNNrdR/EX6yRZuxb3Z/Ge10lu1/MsPm9auZXFS09iL4n3DE+tLD5vQrQsPi+U1ArjJcELAv7Og/eeAT4+cor3r2lbVPk7Sk30ODeEt3R/QcZ7YXxWbKgB47kyPis2goy3ynhP8K00frw9lcbbD8bz3fiFJ0S8jvEyCb/wioy30nhZ+Kz/Mz3CPa8S0h7hI9+AtMeOeIb3cBRswGO7UviFfwO48Au/8Au/8OhfUgu/8EkzUhqvNfELr8h4+cV477EuGvSw0sPnPaz06BHbDOJHp/UrMf6TkYVfD9RagndkvCI/vpfSeAN+9yDbn0rjPdnfEPCC+JpWS/BUGJ8PGWldfH46XBifzy1oXXw+qkOF8dE1wr2Cful4uC7epQdu7OLimBRpRfzlmkDiw1kjNRFmmjehto9DLJZNeT2P1zfG66jKbKAjDzbGCkS8Iw/zxhJAfGyLiI9aj4iPRYg3ToQeEB87EyLepQcLnyzEwIceER8VEwT/6fu0JuKDzwSA/yifWGbhIxb+y2wWm9DDJnc+UtE7HwOfXOTB/KX1o37bppq3efkDT4lpi2pYKzIAAAAASUVORK5CYII=)"]