Friday 22 June 2012

Performance of selectcase

I have a colleague who doesn't really like to use the selectcase construct, despite it being very useful.  It can be used to do a different action based on the value of a variable or field, something like this...


  temp = "5"

  selectcase ( temp )
    case "1"
      temp = ""
    case "2", "3"
      temp = ""
    case "4"
      temp = ""
    case "5"
      temp = ""
    elsecase
      temp = ""
  endselectcase



This sort of conditionality can of course be replicated using a series of if statements, or nested if and elseif statements, which is what he prefers, like this...


  temp = "5"
  if ( temp = "1" )
    temp = ""
  elseif ( temp = "2" | temp = "3" )
    temp = ""
  elseif ( temp = "4" )
    temp = ""
  elseif ( temp = "5" )
    temp = ""
  else
    temp = ""
  endif



What I've been trying to tell him is that a selectcase is more readable, because it's easy to see that the condition is always the same but with a different value, although of course it doesn't need to be, but is in this situation.  


I also think it performs better, the reason being that the condition is only checked once and then the correct branch of code is used, rather than having to check each nested condition until it finds one that matches.  This is certainly true of the javascript equivalent (switch), so I thought I should test it out.  I did so over 5,000,000 iterations...



  • if/elseif/endif = 00:31.21, 00:29.60, 00:28.73 (around 30 seconds)
  • selectcase/endselectcase = 00:25.73, 00:23.53, 00:24.22 (around 25 seconds)

As you can see, it does perform better.  Admittedly, not by as much as I would have hoped, but it's still quicker!

Additionally, both of these constructs all you to have a "catch all" case which will run if none of the other values match (elsecase for selectcase and simply else for if).  

Summary: It is better to use a selectcase when appropriate, over a number of nested if statements, in order to provide a conditional statement that involves the same field with multiple values.

No comments:

Post a Comment