views:

385

answers:

10

Hi all,

Like most of us, I am a big fan of improving efficiency of code. So much so that I would rather choose fast-executing dirty code over something which might be more elegant or clean, but slower.

Fortunately for all of us, in most cases, the faster and more efficient solutions are also the cleaner and the most elegant ones. I used to be just a dabbler in programming but I am into full-time development now, and just started with C# and web development. I have been reading some good books on these subjects but sadly, books rarely cover the finer aspects. Like say, which one of two codes which do the same thing will run faster. This kind of knowledge comes mostly through experience only. I request all fellow programmers to share any such knowledge here.

Here, I'll start off with these two blog posts I came across. This is exactly the kind of stuff I am looking for in this post:

P.S: Do let me know if this kind of thing already exists somewhere on this site. I searched but couldn't find, surprisingly. Also please post any book you know of that covers such things.

P.P.S: If you got to know of something from some blog post or some online source to which we all have access, then it would be better to post the link itself imo.

+11  A: 

There are some things you should do like use generics instead of objects to avoid boxing/unboxing and also improve the code safety, but the best way to optimize your code is to use a profiler to determine which parts of your code are slow. There are many great profilers for .NET code available and they can help determine the bottlenecks in your programs.

Generally you shouldn't concern yourself with small ways to improve code efficiency, but instead when you are done coding, then profile it to find the bottlenecks.

A good profiler will tell you stats like how many times a function was executed, what the average running time was for a function, what the peak running time was for a function, what the total running time was for a function, etc. Some profilers will even draw graphs for you so you can visually see which parts of the program are the biggest bottleneck and you can drill down into the sub function calls.

Without profiling you will most likely be wrong about which part of your program is slow.

An example of a great and free profiler for .NET is the EQATEC Profiler.

Brian R. Bondy
+1 for mentioning boxing/unboxing.
kirk.burleson
Programmers are notoriously bad at guessing where code hotspots are. Don't bother trying to optimze before you measure. More often than not it will be time wasted. Concentrate on good architecture.
spender
@spender: yes as bad a carpenter is at hammering in a nail without a hammer.
Brian R. Bondy
+1  A: 

IMO it's the same for all programming platforms / languages, you have to use profiler and see whitch part of the code are slow, and then do optimization on that parts.

While these links that you provided are valuable insig don't do such things in advance, measure first and then optimize.

edit:

http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html

http://stackoverflow.com/questions/529999/when-to-use-stringbuilder

http://stackoverflow.com/questions/550702/at-what-point-does-using-a-stringbuilder-become-insignificant-or-an-overhead

Antonio Bakula
+6  A: 

The single most important thing regarding this question is: Don't optimize prematurely!

There is only one good time to optimize and that is when there are performance constraints that your current working implementation cannot fulfill. Then you should get out a profiler and check which parts of your code are slow and how you can fix them.

Thinking about optimization while coding the first version is mostly wasted time and effort.

chrischu
On the contrary, most substantial optimizations happen during the design phase.
peterchen
"Thinking about optimization while coding the first version is mostly wasted time and effort." Yes and no. If what you mean is piddling stuff like `++i` vs. `i++` then I agree. On the other hand, if you do much optimizing, you learn to avoid the patterns that lead to poor performance in the first place, namely, overblown data structure design, over-reliance on notifications, excessive abstraction, leading to broccoli-type call trees.
Mike Dunlavey
+3  A: 

One good resource for .net related performance info is Rico Mariani's Blog

DanP
Has some stuff pretty close to what I was looking for.. thanks!
Raze2dust
+3  A: 

"I would rather choose fast-executing dirty code over something which might be more elegant or clean, but slower."

If I were writing a pixel renderer for a game, perhaps I'd consider doing this - however, when responding to a user's click on a button, for example, I'd always favour the slower, elegant approach over quick-and-dirty (unless slow > a few seconds, when I might reconsider).

I have to agree with the other posts - profile to determine where your slow points are and then deal with those. Writing optimal code from the outset is more trouble than its worth, you'll usually find that what you think will be slow will be just fine and the real slow areas will surprise you.

Will A
A: 

If you've profiled your code, and found it to be lacking swiftness, then there are some micro-optimizations you can sometimes use. Here's a short list.

Micro-optimize judiciously - it's like the mirror from Harry Potter: if you're not careful you'll spend all your time there and get nothing else done without getting a lot in return.

The StringBuilder and exception throwing examples are good ones - those are mistakes I used to make which sometimes added seconds to a function execution. When profiling, I find I personally use up a lot of cycles simply finding things. In that case, I cache frequently accessed objects using a hashtable (or a dictionary).

Charlie Salts
"Micro-optimize judiciously - it's like the mirror from Harry Potter" -- wow, I think I'm now officially too old to be a programmer. :-)
Ken
A: 

I think you'll find more of what you're looking for in C# best practices. That's where you'll find those little tidbits of info like when to use StringBuilder instead of String concatenation. Keep Googling!

kirk.burleson
A: 

Good program architecture give you a lot better optimization, than optimized function.
The most optimization is to avoiding all if else in runtime code, put them all at initialize time.
Overall, optimization is bad idea, because the most valuable is readable program, not a fast program.

Avram
+1  A: 

There are lots of tricks, but if that's what you're thinking you need, you need to start over. The secret of performance in any language is not in coding techniques, it is in finding what to optimize.

To make an analogy, if you're a police detective, and you want to put robbers in jail, the heart of your business is not about different kinds of jails. It is about finding the robbers.

I rely on a purely manual method of profiling. This is an example of finding a series of points to optimize, resulting in a speedup multiple of 43 times.

If you do this on an existing application, you are likely to discover that the main cause of slow performance is overblown data structure design, resulting in an excess of notification-style consistency maintenance, characterized by an excessively bushy call tree. You need to find the calls in the call tree that cost a lot and that you can prune.

Having done that, you may realize that a way of designing software that uses the bare minimum of data structure and abstractions will run faster to begin with.

Mike Dunlavey
A: 

http://www.techgalaxy.net/Docs/Dev/5ways.htm has some very good points... just came across it today.

Raze2dust