Exceptions, eh? I've always avoided them in high performace code, because everyone knows they're slow. I have never actually bothered testing this though, relying on cleverer and more dedicated people than me doing the grunt work.
Currently, I am writing a high throughput application that performs actions based on a passed in "verb".
Normally, I deal with this by setting up the verbs as an enum
and using Enum.Parse()
to return the verb
and check it is valid at the same time.
I had no idea how quick Enum.Parse()
actually is, so decided to test it.
The testing code uses the handy System.Diagnostics.Stopwatch
class. It uses an enum
containing 3 names, and creates a List<String>
of 500,000
of each of those three values; so 1,500,000 strings in total.
The code the loops through the array and converts the strings to the enum values using either Enum.Parse()
or hardcoded
if
/ else
constructs using String.Compare(String, String, StringComparison)
.
I also tossed a switch
statement in there; usually I avoid them because I find the syntax ugly and opaque, but I read on an MS blog that switches
on strings are converted to a hash comparison, so I though if that was true it may be worth checking for speed against the if
/ else
. The switch
used String.ToUpper()
in the checking loop to provide case-insensitivity.
I then repeated the tests, but this time with every string an invalid enum value. Obviously with the Enum.Parse()
this requires catching an
exception, and with the other two just an extra condition, in all cases just setting a private member bool
flag.
Here are the results:
DoTheEnumThing() Enum.Parse 00:00:08.64 if/else 00:00:03.48 switch 00:00:02.53 DoTheEnumThingWithErrors() Enum.Parse 00:05:15.11 if/else 00:00:05.63 switch 00:00:02.74
I think that pretty conclusively demonstrates that exception handling is slow. You certainly wouldn't want to use it in a high throughput situation where you were
expecting a lot of invalid values to be passed. The switch
is appreciably faster than the
if
/ else
, so this hardcoded solution, though ugly, is definitely the speediest way to go.
No comments:
Post a Comment