Обсуждение: [PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

Поиск
Список
Период
Сортировка

[PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

От
Andres Freund
Дата:
Hi,

While playing around with writing a newer allocator last week (using a 
somewhat slab allocator alike architecture) I found 
eval_const_expressions_mutator to be surprisingly high in profiles.

For unknown reasons the function used non chained ifs for every handled
nodeType.

Replacing the if chain with if; else if; ... resulted in a small
speedup. Replacing it with a switch() in a bigger one.

When testing with a statement containing a longer VALUES statement:
pgbench -M prepared -f stmt -T 10:
orig: 10015.28
if: 10075.48
switch: 10246.52

Thats a 2.3% increase over several runs. Other statements yielded smaller but 
all positive results.

As far as I can see there currently is no point for writing the function as it 
is right now. Am I missing something?

Andres


Re: [PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

От
Tom Lane
Дата:
Andres Freund <andres@anarazel.de> writes:
> For unknown reasons the function used non chained ifs for every handled
> nodeType.
> Replacing the if chain with if; else if; ... resulted in a small
> speedup. Replacing it with a switch() in a bigger one.

Cool, but this patch is impossible to validate by eye.  Could you
resubmit a version that doesn't reindent unchanged code?  Leave it
for pgindent to clean that up later.
        regards, tom lane


Re: [PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

От
Andres Freund
Дата:
On Friday, November 18, 2011 10:14:22 PM Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > For unknown reasons the function used non chained ifs for every handled
> > nodeType.
> > Replacing the if chain with if; else if; ... resulted in a small
> > speedup. Replacing it with a switch() in a bigger one.
> 
> Cool, but this patch is impossible to validate by eye.  Could you
> resubmit a version that doesn't reindent unchanged code?  Leave it
> for pgindent to clean that up later.
Sure. It was just to confusing reading the code without reindenting.

Btw, I found git diff/show/blame -w very useful to view reindent code.

Actually git show -w seems to produce an applyable patch which doesn't 
reindent...

Andres

Re: [PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

От
Tom Lane
Дата:
Andres Freund <andres@anarazel.de> writes:
> On Friday, November 18, 2011 10:14:22 PM Tom Lane wrote:
>> Andres Freund <andres@anarazel.de> writes:
>>> Replacing the if chain with if; else if; ... resulted in a small
>>> speedup. Replacing it with a switch() in a bigger one.

>> Cool, but this patch is impossible to validate by eye.  Could you
>> resubmit a version that doesn't reindent unchanged code?  Leave it
>> for pgindent to clean that up later.

> Sure. It was just to confusing reading the code without reindenting.
> Btw, I found git diff/show/blame -w very useful to view reindent code.

Applied, thanks.  Bruce, would you mind running pgindent on
just src/backend/optimizer/util/clauses.c ?  That seems safer than
reindenting manually.
        regards, tom lane


Re: [PATCH] Replace a long chain of if's in eval_const_expressions_mutator by a switch()

От
Bruce Momjian
Дата:
Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > On Friday, November 18, 2011 10:14:22 PM Tom Lane wrote:
> >> Andres Freund <andres@anarazel.de> writes:
> >>> Replacing the if chain with if; else if; ... resulted in a small
> >>> speedup. Replacing it with a switch() in a bigger one.
> 
> >> Cool, but this patch is impossible to validate by eye.  Could you
> >> resubmit a version that doesn't reindent unchanged code?  Leave it
> >> for pgindent to clean that up later.
> 
> > Sure. It was just to confusing reading the code without reindenting.
> > Btw, I found git diff/show/blame -w very useful to view reindent code.
> 
> Applied, thanks.  Bruce, would you mind running pgindent on
> just src/backend/optimizer/util/clauses.c ?  That seems safer than
> reindenting manually.

Done.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +