Thursday, April 17, 2008

Improve performance of legacy code using Java 5 language features

Practical Advice for practical programmers

As a senior engineer, you sometimes are thrown into a situation, where you have to come up with some ways to improve the performance of your server side java multithreaded application.
The code was written over a span of 6-7 years and you have only a vague idea of what it does and does not do. More importantly it uses java language features that are old. What do you do?

Before kicking up a profiler and doing memory/CPU profiling - there is something very easy you can do which does not involve all that, provided you can move to Java 5.

There are a number of new classes and frameworks in Java 5 which should improve the performance and reduce the boilerplate code you need to write for a multithreaded application.
Here are some of them.

  1. Replace synchronized collections from your old code with new concurrent collections.i.e. of you have a synchronized HashMap - replace it with ConcurrentHashMap. The Concurrent classes in Java 5 perform fine grained locking and hence provide better scalability.
  2. Identify places where you use Java list class with Queue semantics and replace it with the Java Queue class , introduced in version 5 or 6. Java Queue class is much more efficient than the List class, whose interface supports random access.
  3. Use Blocking Queue (or Bounded Blocking queue), whenever possible.
  4. A common pattern in multithreaded Java applications, is the thread pool along with a work queue. See if you can use Java 5 Executor Task Execution framework.
These are some of the ideas I got so far from reading Java 5 concurrency book by Brian Goetz.
I will keep posting some more patterns to emulate as I come across more of them.


Anonymous said...

nice post..thanq

Yelena said...

Interesting to know.

Inventory Management Software said...

Thanks for sharing your post and it was superb .I would like to hear more from you in future too.