Lazycoder

16Dec/09Off

Herding Code 66: Brad Wilson and Scott Densmore on iPhone Development

What do Brad Wilson and Scott Densmore have in common?  They’re expert .NET developers, a couple of Mac fanboys, and they’re both joining the guys on this week’s episode of Herding Code.  Listen in while Brad and, yet another, Scott talk about the Mac, Windows, and the ins and outs of iPhone development: In case [...]

12Dec/09Off

Herding Code 65: Scott Hanselman on His Secret Ninja Squad and Jon’s new job (bonus: netbook operating system install clinic!)

In this episode, we talk to Scott Hanselman about Jon’s new job with Microsoft, how (if at all) that affects this podcast, and running Ubuntu on a Dell Mini 9. Scott H talks about how, other than the obvious request to get Scott Koon removed from the show, there’s no need to fear any changes [...]

10Dec/098

Benchmarking a simple DOM based cloning template

Sara Chipps recently posted a simple DOM based clone template method she uses in one of her apps. "Easy HTML Templating with JQuery"

My template looks like this:

CODE:
  1. <script id="ItemTemplate" type="text/html"
  2.         <li class="item" value="|rowNumber|">
  3.               <input type=”text” id=”input|rowNumber|” />
  4.         </li>
  5.     </script>


Now within my code I need to put a place holder where I want my HTML to go. I have my unordered list called url_list.

CODE:
  1. <ul id="url_list"></ul>

Now, you see that most of my items look like this “|rowNumber|” I have a variable in my code called nextUniqueItemID (I believe in extremely descriptive variable names). Here is my “addItem” function.

JAVASCRIPT:
  1. function addItem() {
  2.         var list = $('#url_list'),
  3.                       items = list.find('li');
  4.         list.append($('#ItemTemplate’)
  5.                                     .html().replace(/\|rowNumber\|/gi, nextUniqueItemID++))
  6.     }

The use of global variables aside (cough,cough),I looked at it and, having used something like this myself, thought that it would work find for data sets containing a very small number of items. The problem is these kinds of clone based templates are VERY slow compared to the templating engines that are available for various JavaScript libraries.

I happened to read a post by Brian Landau called "Benchmarking Javascript Templating Libraries" this morning and wondered just HOW MUCH slower is the naive template method than a good template library?

I grabbed the benchmarking code and modified it to run the new clone based template method.

JAVASCRIPT:
  1. var nextUniqueItemID = 0;
  2.     function addItem() {
  3.         var list = $('#url_list'),
  4.         items = list.find('li');
  5.         list.append($('#ItemTemplate').html().replace(/\|rowNumber\|/gi, nextUniqueItemID++));
  6.     };
  7.    
  8.     $(document).ready(function(){
  9.         var output = $('#output');
  10.         $.benchmarks = {};
  11.    
  12.       $.benchmarks.test_simple = function(){
  13.         addItem();
  14.       };
  15.      
  16.       $.benchmarks.loop_test = function(){
  17.         for (var i=0; i <5; i++){
  18.           addItem();
  19.         }
  20.       };
  21.  
  22.       // use these lines to run the benchmark tests in your browsers JS console
  23.       // $.benchmark(1000, '#simple_test', $.benchmarks.test_simple);
  24.       // $.benchmark(1000, '#loop_test', $.benchmarks.loop_test);
  25.     });

Since the template Sara provided contains an input tag you get a different benchmark if you run the simple_test and the loop_test separately after refreshing your browser. You can run the tests for yourself here, the loop test *may* cause your browser to give you a "script is running slow" message, hit continue as the loop will eventually end. You may also get different numbers if you run the tests in IE, Chrome, and Safari.

results: using FF 3.5.5
Simple Test: 1.71s
Loop test: 31.534s

When you consider that the slowest loop test using a template library was just around 4.5s, you get a better idea of just how slow this method is when you have an input in your template.

So that's fine, but it's known that dynamically adding text inputs is slow in just about every browser and the original tests don't use inputs at all, just divs. So let's modify the template and see what the results are.

CODE:
  1. <script id="ItemTemplate" type="text/html">
  2. <div class="test"><h2>This is a test of |name|</h2><p>The homepage is <a href="|url|">|url|</a>.</p><p>The sources is: |source|</p></div>
  3. </script>

I modified the addItem function to account for the new data. n.b. The data I'm using is static, if you wanted to use a data source you would just modify this method to take in your data parameters.

JAVASCRIPT:
  1. function addItem() {
  2.         var list = $('#url_list'),
  3.         items = list.find('li');
  4.         list.append($('#ItemTemplate').html()
  5.             .replace(/\|name\|/gi, "Clone template method")
  6.             .replace(/\|source\|/gi, "http://girldeveloper.com/waxing-dev/easy-html-templating-with-jquery/")
  7.             .replace(/\|url\|/gi, "http://girldeveloper.com/waxing-dev/easy-html-templating-with-jquery/"));
  8.     };

results using FF 3.5.5 - refresh between each test
simple test: 1.285s
loop test: 3.771

results using ff 3.5.5 with no refresh between tests
simple test: 1.434
loop test: 4.227

So that's looking a little bit better. Not too much slower than the template libraries.

So what do the template libraries give you? Well the replace method works find provides your data is escaped properly. But say instead of a url in the "source" replacement, you use a file path like "file:\\foodrive\source.txt". Well it still gets replaced, but the text looks like this "file:\foodrivesource.txt". So in addition to the replacement, you have to make sure your data is properly escaped. A lot of template libraries will do this for you. Also notice that the addItem method has to do a DOM lookup on every iteration of the loop to get the template. If you have a large DOM, this could impact the performance.

2Dec/093

Can a language be abused?

K. Scott Allen has a great post showing an "abuse" of the lambda syntax in C#.

But I'm wondering, can any use of programming language really be called abuse? The language designers and creators put the ability to create the hack described above into the language. If they didn't want you to do things like that, why put the ability in there at all? Using undocumented calls within the language to do strange things is one thing, but simply using calls within the language itself?

What are some of the best "abuses" you've seen of a language?

Filed under: Languages 3 Comments
2Dec/099

Announcing Planet ASP.NET MVC

I’ve created a “Planet” type site that aggregates posts from different sources about the ASP.NET MVC Framework. Feel free to suggest new feeds you’d like to see on here. Content owners, I’ve made every effort to ensure proper attribution (e.g. the link here and the link in the feed point to the source of the post, author names are retained). However if you want your content removed from this feed, feel free to contact me with no hard feelings.

Mainly, it's for my personal benefit. I wanted to have a single source for my ASP.NET MVC news but Google searches pulled in a bunch of "why MVC isn't for me" type of posts, which I don't really care about. Those people are just wrong. ;)

You can find it here. It may eventually get it's own domain and a nifty theme.

Planet ASP.NET MVC

Filed under: MVC 9 Comments