Wednesday, October 27, 2010

C#: LINQ and Foreach performance comparison

I'm currently solving performance issues we have programmed within the last milestone. A lot of bugs were already fixed but very interesting issue hasn't.

I have liked and preferred LINQ queries over simple foreach command. Mentioned performance issue was based on the following query.

Entity e = entities.Where(e => e.Id.Equals(id)).FirstOrDefault();

Our list contains few items, for the worst case the only one. It's necessary to make the search because there can be obviously more items. I was surprised by results raised from simple test which is attached at the bottom of current article.

Test simply inserts 1, 50 and finally 100 unique entities to the list. Each entity holds only string identificator (UUID). Each listed algorithm try to find entity placed at the end.

I have tried these approaches:

  1. LINQ query
  2. simple foreach
  3. map having entity id as key

The result is very interesting as attached table and chart show. The map was included only for the confrontation, it obviously doesn't support any querying.

Conclusions: LINQ, foreach or dictionary?



It seems that querying above IList with using LINQ spent significant time to initialize the whole technology. LINQ query can be almost 10x worst than simple foreach for small amount of data. Note that for the described issue, the map is total winner because it has constant search response.



Reject LINQ? No!

The results are not so bad for LINQ as it can be seen. Consider that boundary 7 second is for one million of calls in the case of 50 items within list. So LINQ takes 7 microseconds for one search, foreach six. There is also almost no difference in absolute relations when there is small amount of items within list. LINQ 0.9 microsecond, foreach 0.1 micro. I believe that LINQ can be rejected only for very performance tuned solutions.

Sunday, October 17, 2010

JDownloader: hotfile, rapidshare best downloader

I was used Free download manager to download my favorite TV series (e.g. IT Crowd or new interesting BBC's Sherlock) from well know data storages, like rapidshare or hotfile. I've tried JDownloader and I'm really impressed all those features which the tools provides in comparison with standard lightweight managers.


Interesting features
  • you can only copy links to download into the clipboard at your favorite forum, switch the focus back to JDownloader, it automatically use these links as datasource, add them into link grabber and than check their online status (if they are downloadable)! You can see their availability in a few seconds
  • support the usage of huge amount of paid accounts. You simply add your credentials into system, add links and it works - download files - you need obviously possess these accounts :-) 
  • build in extract support - if you add links to the data spread into more rars, the JDownloader's plugin can unrar them after successful download and even delete them when unrar is finally done
  • using pair and free account together - assume that you add two simultaneous downloads and trying to download another file placed on the same storage. JDownloader tries to use free account, wait until the captcha succeeded and download the last one via free account
  • JDownloader also creates container and directory wrapping each download so all files are not downloaded into one directory but spreads into new one according to the downloanded file names
  • great plugin support, automatic computer shutdown is supported too. JDownloader can be also up-dated by fine online updater, it simply download all new system parts or plugins
Downsides? Are you still waiting even with paid account?

I was about to uninstall JDownloader because it always waits even if I correctly set up the pair rapidshare account! What happen? Although I inserted credentials, I didn't enable this account globally for the whole application so JDownloader tries to download all files through free account. Rear. Described global switch is that small check button at the left down application corner.