Short-circuit evaluation

Share this topic:



Link to this posting

Postby Ursego » 21 Feb 2013, 22:27

Use short-circuit evaluation to improve performance of your program.

Short-circuit evaluation (SCE), also called "minimal", denotes the semantics of Boolean operators in logical expressions in formats "A AND B" and "A OR B" in which the second argument is only executed or evaluated if the first argument does not suffice to determine the value of the expression. In other words, the evaluation of a Boolean expression terminates as soon as the result value, produced by the whole expression, is known, even if not all the components in the expression have been evaluated. Thus, try to build the expression so that the decision is made as soon as possible:

"A AND B" ("A && B"): when A evaluates to false, the whole expression will return false (B will not be evaluated), so make sure that A is more efficient (executed quicker) than B (and if they have a same performance, make sure that A is more likely to produce false than B).

"A OR B" ("A || B"): when A evaluates to true, the whole expression will return true (B will not be evaluated), so make sure that A is more efficient (executed quicker) than B (and if they have a same performance, make sure that A is more likely to produce true than B).

To clarify the idea, let's write a Boolean method which determines if the person is eligible to work in security (to pass the validation, the person must be older than the minimum age, defined by law, AND to have no criminal record). The age checking is simply a quick comparison between instance variables, but to check criminal record, the application needs to send a query to the database via the network (which is much slower operation). Here is the method's code with the correct order of components (PB doesn't have short-circuit evaluation, so we have to imitate it by slightly more complicated code):

PB:
Code: Select all
if this.ii_age < this.ii_min_age then return false
return this.uf_has_clear_criminal_record()

C#:
Code: Select all
return (this.Age >= this.MinAge && this.HasClearCriminalRecord());


So, if the candidate is immature, we will not bother the network and the DB at all.

The short-circuit is not the only possible evaluation, there is also the regular one (also called "eager" or "long-circuit") - when the second part of the Boolean expression is evaluated anyway, even if its result cannot change the already known value, which will be produced by the whole expression. In most programming languages you can utilize both the evaluations using different logical operators, but some languages have only one. Look at this table to clear up a question what happens in your programming language. If it doesn't appear in the table then you can easily check if it supports SCE by assignin a Boolean variable the results of the expressions, having zero divide in the second part (translate them to your language if needed):

BooleanVariable = ((1 = 2) AND (1 = (1 / 0)))
BooleanVariable = ((1 = 1) OR (1 = (1 / 0)))

If you don't get the zero divide error then SCE is supported.
User avatar
Ursego
Site Admin
 
Posts: 111
Joined: 19 Feb 2013, 20:33

Link to this posting

Postby zoeyku » 19 Nov 2013, 01:35

So strange that no PB book provides this pretty basic information...
zoeyku
 
Posts: 2
Joined: 19 Nov 2013, 01:32
Location: usa


Return to Intriguing World of Logic

Who is online

Users browsing this forum: No registered users and 1 guest


Short-circuit evaluation

Share this topic:


If you think that this site is not too bad, please LIKE it in Facebook. Thanks!





free counters

eXTReMe Tracker