null+****@clear*****
null+****@clear*****
2011年 12月 8日 (木) 11:11:40 JST
Susumu Yata 2011-12-08 02:11:40 +0000 (Thu, 08 Dec 2011) New Revision: cbebb0d9a8ae27541406739c6087428118cc620c Log: added inline versions to reduce function call overhead. Modified files: lib/db.c Modified: lib/db.c (+76 -41) =================================================================== --- lib/db.c 2011-12-08 00:25:33 +0000 (b2b0285) +++ lib/db.c 2011-12-08 02:11:40 +0000 (f581e70) @@ -59,6 +59,17 @@ GRN_OBJ_FIN(ctx, &inspected);\ } +inline static grn_id +grn_table_add_v_inline(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, + void **value, int *added); +inline static void +grn_table_add_subrec_inline(grn_obj *table, grn_rset_recinfo *ri, int score, + grn_rset_posinfo *pi, int dir); +inline static grn_id +grn_table_cursor_next_inline(grn_ctx *ctx, grn_table_cursor *tc); +inline static int +grn_table_cursor_get_value_inline(grn_ctx *ctx, grn_table_cursor *tc, void **value); + inline static void gen_pathname(const char *path, char *buffer, int fno) { @@ -1190,9 +1201,9 @@ grn_table_at(grn_ctx *ctx, grn_obj *table, grn_id id) GRN_API_RETURN(id); } -grn_id -grn_table_add_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, - void **value, int *added) +inline static grn_id +grn_table_add_v_inline(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, + void **value, int *added) { grn_id id = GRN_ID_NIL; if (!key || !key_size) { return GRN_ID_NIL; } @@ -1224,6 +1235,12 @@ grn_table_add_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, } grn_id +grn_table_add_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, + void **value, int *added) { + return grn_table_add_v_inline(ctx, table, key, key_size, value, added); +} + +grn_id grn_table_get_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size, void **value) { @@ -1762,9 +1779,9 @@ subrecs_replace_min(byte *subrecs, int size, int n_subrecs, int score, void *bod memcpy(v + GRN_RSET_SCORE_SIZE, body, size); } -void -grn_table_add_subrec(grn_obj *table, grn_rset_recinfo *ri, int score, - grn_rset_posinfo *pi, int dir) +inline static void +grn_table_add_subrec_inline(grn_obj *table, grn_rset_recinfo *ri, int score, + grn_rset_posinfo *pi, int dir) { if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) { int limit = DB_OBJ(table)->max_n_subrecs; @@ -1787,6 +1804,12 @@ grn_table_add_subrec(grn_obj *table, grn_rset_recinfo *ri, int score, } } +void +grn_table_add_subrec(grn_obj *table, grn_rset_recinfo *ri, int score, + grn_rset_posinfo *pi, int dir) { + grn_table_add_subrec_inline(table, ri, score, pi, dir); +} + typedef struct { grn_db_obj obj; grn_id curr_rec; @@ -1826,7 +1849,7 @@ grn_view_cursor_open(grn_ctx *ctx, grn_obj *view, min, min_size, max, max_size, 0, offset + limit, flags); if (!c) { break; } VIEW_CURSOR_OFFSET(c) = view_cursor_offset++; - if (!grn_table_cursor_next(ctx, c)) { + if (!grn_table_cursor_next_inline(ctx, c)) { grn_table_cursor_close(ctx, c); continue; } @@ -1979,7 +2002,7 @@ grn_view_cursor_next(grn_ctx *ctx, grn_view_cursor *vc) VIEW_CURSOR_DELAY(vc) = 0; } else { grn_table_cursor *tc = vc->bins[0]; - if (!grn_table_cursor_next(ctx, tc)) { + if (!grn_table_cursor_next_inline(ctx, tc)) { grn_table_cursor_close(ctx, tc); vc->bins[0] = vc->bins[--vc->n_entries]; } @@ -2015,7 +2038,7 @@ grn_view_cursor_next_o(grn_ctx *ctx, grn_view_cursor *vc, grn_obj *id) VIEW_CURSOR_DELAY(vc) = 0; } else { grn_table_cursor *tc = vc->bins[0]; - if (!grn_table_cursor_next(ctx, tc)) { + if (!grn_table_cursor_next_inline(ctx, tc)) { grn_table_cursor_close(ctx, tc); vc->bins[0] = vc->bins[--vc->n_entries]; } @@ -2190,8 +2213,8 @@ grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc) GRN_API_RETURN(rc); } -grn_id -grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc) +inline static grn_id +grn_table_cursor_next_inline(grn_ctx *ctx, grn_table_cursor *tc) { grn_id id = GRN_ID_NIL; GRN_API_ENTER; @@ -2225,13 +2248,19 @@ grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc) GRN_API_RETURN(id); } +grn_id +grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc) +{ + return grn_table_cursor_next_inline(ctx, tc); +} + static grn_rc grn_table_cursor_next_o_(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id) { if (tc->header.type == GRN_CURSOR_TABLE_VIEW) { return grn_view_cursor_next_o(ctx, (grn_view_cursor *)tc, id); } else { - grn_id rid = grn_table_cursor_next(ctx, tc); + grn_id rid = grn_table_cursor_next_inline(ctx, tc); if (rid) { GRN_RECORD_PUT(ctx, id, rid); return ctx->rc; @@ -2274,8 +2303,8 @@ grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key) GRN_API_RETURN(len); } -int -grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value) +inline static int +grn_table_cursor_get_value_inline(grn_ctx *ctx, grn_table_cursor *tc, void **value) { int len = 0; GRN_API_ENTER; @@ -2304,6 +2333,12 @@ grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value) GRN_API_RETURN(len); } +int +grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value) +{ + return grn_table_cursor_get_value_inline(ctx, tc, value); +} + grn_rc grn_table_cursor_set_value(grn_ctx *ctx, grn_table_cursor *tc, void *value, int flags) @@ -2436,7 +2471,7 @@ grn_index_cursor_next(grn_ctx *ctx, grn_obj *c, grn_id *tid) GRN_API_ENTER; if (ic->iic) { ip = grn_ii_cursor_next(ctx, ic->iic); } if (!ip) { - if ((ic->tid = grn_table_cursor_next(ctx, ic->tc))) { + if ((ic->tid = grn_table_cursor_next_inline(ctx, ic->tc))) { grn_ii *ii = (grn_ii *)ic->index; if (ic->iic) { grn_ii_cursor_close(ctx, ic->iic); } if ((ic->iic = grn_ii_cursor_open(ctx, ii, ic->tid, @@ -2681,13 +2716,13 @@ accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res unsigned element_size = (ra)->header->element_size; grn_ra_cache cache; GRN_RA_CACHE_INIT(ra, &cache); - while ((id = grn_table_cursor_next(ctx, tc))) { + while ((id = grn_table_cursor_next_inline(ctx, tc))) { void *v, *value; grn_id *id_; uint32_t key_size; grn_rset_recinfo *ri = NULL; if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) { - grn_table_cursor_get_value(ctx, tc, (void **)&ri); + grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri); } id_ = (grn_id *)_grn_table_key(ctx, table, id, &key_size); v = grn_ra_ref_cache(ctx, ra, *id_, &cache); @@ -2696,8 +2731,8 @@ accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res continue; } if ((!idp || *((grn_id *)v)) && - grn_table_add_v(ctx, res, v, element_size, &value, NULL)) { - grn_table_add_subrec(res, value, ri ? ri->score : 0, NULL, 0); + grn_table_add_v_inline(ctx, res, v, element_size, &value, NULL)) { + grn_table_add_subrec_inline(res, value, ri ? ri->score : 0, NULL, 0); } } GRN_RA_CACHE_FIN(ra, &cache); @@ -2707,7 +2742,7 @@ accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res if (idp) { /* todo : support other type */ grn_id id; grn_ja *ja = (grn_ja *)a->next->obj; - while ((id = grn_table_cursor_next(ctx, tc))) { + while ((id = grn_table_cursor_next_inline(ctx, tc))) { grn_io_win jw; unsigned int len = 0; void *value; @@ -2715,14 +2750,14 @@ accelerated_table_group(grn_ctx *ctx, grn_obj *table, grn_obj *key, grn_obj *res uint32_t key_size; grn_rset_recinfo *ri = NULL; if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) { - grn_table_cursor_get_value(ctx, tc, (void **)&ri); + grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri); } id_ = (grn_id *)_grn_table_key(ctx, table, id, &key_size); if ((v = grn_ja_ref(ctx, ja, *id_, &jw, &len))) { while (len) { if ((*v != GRN_ID_NIL) && - grn_table_add_v(ctx, res, v, sizeof(grn_id), &value, NULL)) { - grn_table_add_subrec(res, value, ri ? ri->score : 0, NULL, 0); + grn_table_add_v_inline(ctx, res, v, sizeof(grn_id), &value, NULL)) { + grn_table_add_subrec_inline(res, value, ri ? ri->score : 0, NULL, 0); } v++; len -= sizeof(grn_id); @@ -2784,12 +2819,12 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, grn_id id; grn_obj *range = grn_ctx_at(ctx, grn_obj_get_range(ctx, keys->key)); int idp = GRN_OBJ_TABLEP(range); - while ((id = grn_table_cursor_next(ctx, tc))) { + while ((id = grn_table_cursor_next_inline(ctx, tc))) { void *value; grn_rset_recinfo *ri = NULL; GRN_BULK_REWIND(&bulk); if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) { - grn_table_cursor_get_value(ctx, tc, (void **)&ri); + grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri); } grn_obj_get_value(ctx, keys->key, id, &bulk); switch (bulk.header.type) { @@ -2800,8 +2835,8 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, grn_id *ve = (grn_id *)GRN_BULK_CURR(&bulk); while (v < ve) { if ((*v != GRN_ID_NIL) && - grn_table_add_v(ctx, results->table, v, sizeof(grn_id), &value, NULL)) { - grn_table_add_subrec(results->table, value, ri ? ri->score : 0, NULL, 0); + grn_table_add_v_inline(ctx, results->table, v, sizeof(grn_id), &value, NULL)) { + grn_table_add_subrec_inline(results->table, value, ri ? ri->score : 0, NULL, 0); } v++; } @@ -2814,9 +2849,9 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, case GRN_BULK : { if ((!idp || *((grn_id *)GRN_BULK_HEAD(&bulk))) && - grn_table_add_v(ctx, results->table, - GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk), &value, NULL)) { - grn_table_add_subrec(results->table, value, ri ? ri->score : 0, NULL, 0); + grn_table_add_v_inline(ctx, results->table, + GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk), &value, NULL)) { + grn_table_add_subrec_inline(results->table, value, ri ? ri->score : 0, NULL, 0); } } break; @@ -2831,11 +2866,11 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, } else { if ((tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; - while ((id = grn_table_cursor_next(ctx, tc))) { + while ((id = grn_table_cursor_next_inline(ctx, tc))) { grn_rset_recinfo *ri = NULL; GRN_BULK_REWIND(&bulk); if (DB_OBJ(table)->header.flags & GRN_OBJ_WITH_SUBREC) { - grn_table_cursor_get_value(ctx, tc, (void **)&ri); + grn_table_cursor_get_value_inline(ctx, tc, (void **)&ri); } for (k = 0, kp = keys; k < n_keys; k++, kp++) { kp->offset = GRN_BULK_VSIZE(&bulk); @@ -2849,8 +2884,8 @@ grn_table_group(grn_ctx *ctx, grn_obj *table, : keys[rp->key_end].offset; key = GRN_BULK_HEAD(&bulk) + begin; // todo : cut off GRN_ID_NIL - if (grn_table_add_v(ctx, rp->table, key, end - begin, &value, NULL)) { - grn_table_add_subrec(rp->table, value, ri ? ri->score : 0, NULL, 0); + if (grn_table_add_v_inline(ctx, rp->table, key, end - begin, &value, NULL)) { + grn_table_add_subrec_inline(rp->table, value, ri ? ri->score : 0, NULL, 0); } } } @@ -2917,7 +2952,7 @@ grn_table_setoperation(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, grn_obj * switch (op) { case GRN_OP_OR : GRN_TABLE_EACH(ctx, table2, 0, 0, id, &key, &key_size, &value2, { - if (grn_table_add_v(ctx, table1, key, key_size, &value1, NULL)) { + if (grn_table_add_v_inline(ctx, table1, key, key_size, &value1, NULL)) { memcpy(value1, value2, value_size); } }); @@ -5523,7 +5558,7 @@ build_index(grn_ctx *ctx, grn_obj *obj) if ((tc = grn_table_cursor_open(ctx, target, NULL, 0, NULL, 0, 0, -1, GRN_CURSOR_BY_ID))) { GRN_TEXT_INIT(&rv, 0); - while ((id = grn_table_cursor_next(ctx, tc)) != GRN_ID_NIL) { + while ((id = grn_table_cursor_next_inline(ctx, tc)) != GRN_ID_NIL) { for (cp = col, i = ncol; i; i--, cp++) { GRN_BULK_REWIND(&rv); if (GRN_OBJ_TABLEP(*cp)) { @@ -6023,7 +6058,7 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj) spath = NULL; } if ((cur = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, 0))) { - while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { grn_obj *tbl = grn_ctx_at(ctx, id); if (tbl) { switch (tbl->header.type) { @@ -7029,7 +7064,7 @@ grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj) grn_table_cursor *cur; if ((cur = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; - while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { grn_obj *tbl = grn_ctx_at(ctx, id); if (tbl) { switch (tbl->header.type) { @@ -7115,7 +7150,7 @@ grn_obj_defrag(grn_ctx *ctx, grn_obj *obj, int threshold) grn_table_cursor *cur; if ((cur = grn_table_cursor_open(ctx, obj, NULL, 0, NULL, 0, 0, -1, 0))) { grn_id id; - while ((id = grn_table_cursor_next(ctx, cur)) != GRN_ID_NIL) { + while ((id = grn_table_cursor_next_inline(ctx, cur)) != GRN_ID_NIL) { grn_obj *ja = grn_ctx_at(ctx, id); if (ja && ja->header.type == GRN_COLUMN_VAR_SIZE) { r += grn_ja_defrag(ctx, (grn_ja *)ja, threshold); @@ -7348,9 +7383,9 @@ pack(grn_ctx *ctx, grn_obj *table, sort_entry *head, sort_entry *tail, sort_entry e, c; grn_table_cursor *tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0); if (!tc) { return NULL; } - if ((c.id = grn_table_cursor_next(ctx, tc))) { + if ((c.id = grn_table_cursor_next_inline(ctx, tc))) { c.value = grn_obj_get_value_(ctx, keys->key, c.id, &c.size); - while ((e.id = grn_table_cursor_next(ctx, tc))) { + while ((e.id = grn_table_cursor_next_inline(ctx, tc))) { e.value = grn_obj_get_value_(ctx, keys->key, e.id, &e.size); if (compare_value(ctx, &c, &e, keys, n_keys)) { *head++ = e;