struct field data type improvement for memory usage.

This commit is contained in:
c9s 2014-05-24 18:45:43 +08:00
parent da47f06bdc
commit ef9962c958
3 changed files with 31 additions and 17 deletions

View file

@ -526,3 +526,14 @@
1400923315,10840939.91,4663256.98,55924.05,2611667.47 1400923315,10840939.91,4663256.98,55924.05,2611667.47
1400923325,11091416.01,4103660.70,59074.70,2817256.97 1400923325,11091416.01,4103660.70,59074.70,2817256.97
1400923335,11435046.07,4356917.52,45100.04,2883103.51 1400923335,11435046.07,4356917.52,45100.04,2883103.51
1400928121,11717285.79,4816672.70,58254.22,2897866.52
1400928131,11343621.37,4759351.32,45100.04,2849262.65
1400928141,11268332.55,4717279.18,55188.21,2871378.81
1400928151,11308055.40,4652350.21,47662.55,2866742.89
1400928225,10802915.60,4687267.34,58254.22,2632936.94
1400928235,10661874.62,4739682.52,62601.55,2740810.88
1400928262,11033784.15,4714416.68,55188.21,2737984.12
1400928272,10649279.69,4567955.12,47662.55,2716598.01
1400928308,9831622.81,4277888.23,45590.26,2421364.56
1400928319,10230059.66,4527332.79,49932.19,2345303.39
1400928329,11085172.21,4647514.08,62601.55,2735715.15

Can't render this file because it has a wrong number of fields in line 447.

View file

@ -35,13 +35,12 @@ struct _node {
// almost less than 255 // almost less than 255
unsigned char edge_len; unsigned char edge_len;
unsigned char edge_cap; unsigned char edge_cap;
unsigned char compare_type; unsigned char compare_type;
unsigned char endpoint; unsigned char endpoint;
unsigned char ov_cnt;
// <-- here comes a char[3] struct padding for alignment since we have 5 char above.
// almost less than 255
unsigned char route_len;
unsigned char route_cap;
/** compile-time variables here.... **/ /** compile-time variables here.... **/
@ -51,6 +50,10 @@ struct _node {
char * combined_pattern; char * combined_pattern;
// almost less than 255
unsigned char route_len;
unsigned char route_cap;
/** /**
* the pointer of route data * the pointer of route data
*/ */
@ -60,9 +63,9 @@ struct _node {
struct _edge { struct _edge {
char * pattern; char * pattern;
node * child; node * child;
unsigned char opcode; unsigned short pattern_len; // 2 byte
unsigned short pattern_len; unsigned char opcode; // 1 byte
bool has_slug:1; unsigned char has_slug; // 1 bit
}; };
typedef struct { typedef struct {

View file

@ -196,6 +196,8 @@ void r3_tree_compile_patterns(node * n) {
int erroffset; int erroffset;
unsigned int option_bits = 0; unsigned int option_bits = 0;
n->ov_cnt = (1 + n->edge_len) * 3;
if (n->pcre_pattern) { if (n->pcre_pattern) {
pcre_free(n->pcre_pattern); pcre_free(n->pcre_pattern);
} }
@ -254,17 +256,12 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
info("try matching: %s\n", path); info("try matching: %s\n", path);
edge *e; edge *e;
char rc;
unsigned short i; unsigned short i;
unsigned short ov_cnt;
unsigned short restlen; unsigned short restlen;
char *pp;
char *pp_end = path + path_len;
char *substring_start = NULL;
int substring_length = 0;
if (n->compare_type == NODE_COMPARE_OPCODE) { if (n->compare_type == NODE_COMPARE_OPCODE) {
char *pp;
char *pp_end = path + path_len;
for (i = 0; i < n->edge_len ; i++ ) { for (i = 0; i < n->edge_len ; i++ ) {
pp = path; pp = path;
e = n->edges[i]; e = n->edges[i];
@ -302,9 +299,12 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
// if the pcre_pattern is found, and the pointer is not NULL, then it's // if the pcre_pattern is found, and the pointer is not NULL, then it's
// pcre pattern node, we use pcre_exec to match the nodes // pcre pattern node, we use pcre_exec to match the nodes
if (n->pcre_pattern) { if (n->pcre_pattern) {
char *substring_start = NULL;
int substring_length = 0;
int ov[ n->ov_cnt ];
char rc;
info("pcre matching %s on %s\n", n->combined_pattern, path); info("pcre matching %s on %s\n", n->combined_pattern, path);
ov_cnt = (1 + n->edge_len) * 3;
int ov[ ov_cnt ];
rc = pcre_exec( rc = pcre_exec(
n->pcre_pattern, /* the compiled pattern */ n->pcre_pattern, /* the compiled pattern */
@ -314,7 +314,7 @@ node * r3_tree_matchl(const node * n, char * path, int path_len, match_entry * e
0, /* start at offset 0 in the subject */ 0, /* start at offset 0 in the subject */
0, /* default options */ 0, /* default options */
ov, /* output vector for substring information */ ov, /* output vector for substring information */
ov_cnt); /* number of elements in the output vector */ n->ov_cnt); /* number of elements in the output vector */
// does not match all edges, return NULL; // does not match all edges, return NULL;
if (rc < 0) { if (rc < 0) {