Mercurial > hg > index.cgi
comparison lwlib/lw_expr.h @ 337:3b5a45c6ab92
Speed improvement to lw_expr
Instead of using a singly linked list and doing the slow append algorithm
when adding an operand to an expression (scan from the start to find the
end), now maintain a tail pointer. Also maintain a previous pointer in each
entry. Benchmarking suggests this yields a rougly 30% improvement in
runtime.
Also refactor some of the code in lw_expr.c to make it somewhat clearer to
understand. For some values of clearer and understand.
author | William Astle <lost@l-w.ca> |
---|---|
date | Sat, 02 Aug 2014 10:08:01 -0600 |
parents | 1f1a28b797e1 |
children | 6138e304ab9a |
comparison
equal
deleted
inserted
replaced
336:30b2bad9b5eb | 337:3b5a45c6ab92 |
---|---|
56 | 56 |
57 struct lw_expr_opers | 57 struct lw_expr_opers |
58 { | 58 { |
59 lw_expr_t p; | 59 lw_expr_t p; |
60 struct lw_expr_opers *next; | 60 struct lw_expr_opers *next; |
61 struct lw_expr_opers *prev; | |
61 }; | 62 }; |
62 | 63 |
63 struct lw_expr_priv | 64 struct lw_expr_priv |
64 { | 65 { |
65 int type; // type of term | 66 int type; // type of term |
66 int value; // integer value | 67 int value; // integer value |
67 void *value2; // misc pointer value | 68 void *value2; // misc pointer value |
68 struct lw_expr_opers *operands; // ptr to list of operands (for operators) | 69 struct lw_expr_opers *operands; // ptr to list of operands (for operators) |
70 struct lw_expr_opers *operand_tail; // ptr to last operand | |
69 }; | 71 }; |
70 | 72 |
71 typedef lw_expr_t lw_expr_fn_t(int t, void *ptr, void *priv); | 73 typedef lw_expr_t lw_expr_fn_t(int t, void *ptr, void *priv); |
72 typedef lw_expr_t lw_expr_fn2_t(char *var, void *priv); | 74 typedef lw_expr_t lw_expr_fn2_t(char *var, void *priv); |
73 typedef lw_expr_t lw_expr_fn3_t(char **p, void *priv); | 75 typedef lw_expr_t lw_expr_fn3_t(char **p, void *priv); |