[#62297] Re: [ruby-cvs:52906] nari:r45760 (trunk): * gc.c (gc_after_sweep): suppress unnecessary expanding heap. — Eric Wong <normalperson@...>
nari@ruby-lang.org wrote:
7 messages
2014/05/02
[#62307] Re: [ruby-cvs:52906] nari:r45760 (trunk): * gc.c (gc_after_sweep): suppress unnecessary expanding heap.
— SASADA Koichi <ko1@...>
2014/05/03
(2014/05/03 4:41), Eric Wong wrote:
[#62402] Re: [ruby-cvs:52906] nari:r45760 (trunk): * gc.c (gc_after_sweep): suppress unnecessary expanding heap.
— Eric Wong <normalperson@...>
2014/05/05
SASADA Koichi <ko1@atdot.net> wrote:
[#62523] [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan — ko1@...
Issue #9632 has been updated by Koichi Sasada.
3 messages
2014/05/11
[#62556] doxygen (Re: Re: [ruby-trunk - Feature #9632] [PATCH 0/2] speedup IO#close with linked-list from ccan) — Tanaka Akira <akr@...>
2014-05-11 8:50 GMT+09:00 Eric Wong <normalperson@yhbt.net>:
3 messages
2014/05/13
[#62727] [RFC] vm_method.c (rb_method_entry_make): avoid freed me in m_tbl — Eric Wong <normalperson@...>
rb_unlink_method_entry may cause old_me to be swept before the new
7 messages
2014/05/24
[#63039] Re: [RFC] vm_method.c (rb_method_entry_make): avoid freed me in m_tbl
— SASADA Koichi <ko1@...>
2014/06/10
Hi,
[#63077] Re: [RFC] vm_method.c (rb_method_entry_make): avoid freed me in m_tbl
— Eric Wong <normalperson@...>
2014/06/10
SASADA Koichi <ko1@atdot.net> wrote:
[#63086] Re: [RFC] vm_method.c (rb_method_entry_make): avoid freed me in m_tbl
— SASADA Koichi <ko1@...>
2014/06/11
(2014/06/11 4:47), Eric Wong wrote:
[#63087] Re: [RFC] vm_method.c (rb_method_entry_make): avoid freed me in m_tbl
— Eric Wong <normalperson@...>
2014/06/11
SASADA Koichi <ko1@atdot.net> wrote:
[#62862] [RFC] README.EXT: document rb_gc_register_mark_object — Eric Wong <normalperson@...>
Any comment on officially supporting this as part of the C API?
5 messages
2014/05/30
[ruby-core:62577] Re: [ruby-trunk - Feature #9614] [Open] ordering of non-Hash items which use st_ internally
From:
Eric Wong <normalperson@...>
Date:
2014-05-14 06:49:42 UTC
List:
ruby-core #62577
Hi, thank you for the comments!
ko1: adding flag for ordering might complicate the st code even more.
I think st should only be for implementing Hash.
My primary goals for ihash are to reduce pointer chasing and malloc use.
ihash uses container_of, like ccan/list:
st (unpacked entries):
st_table -> st_table->bins -> st_table_entry -> data structure
st (packed entries):
st_table -> st_table->packed.entries -> data structure
ihash:
rb_ihash_table -> data structure (via container_of)
Removing ordering requirment allows us to avoid writing/maintaining more
(new) code and also save two pointers (fore/prev).
nobu: reduction depends on what is stored
Best case so far are method table and symbol table:
For each method entry, we save:
sizeof(st_table_entry) - sizeof(rb_ihash_node) + malloc_overhead
On 64-bit with glibc malloc: 48 - 8 + 16 = 56 bytes saved.
AFAIK, jemalloc has less overhead for small allocations, but even
without malloc overhead, saving 40 bytes per method entry is great.
Symbol table is a big win, too, one single struct has membership
in both sym_id and id_str tables:
struct rb_idsym {
struct rb_ihash_node id_str_node; /* sizeof(void *) */
ID id;
struct rb_ihash_node sym_id_node;
VALUE symstr;
st_index_t hashval;
};
On 64-bit:
Before: 48 + 48 = 96 (+ 32 bytes on glibc malloc)
After: 40 (+ 16 bytes on glibc malloc)
If we add ordering to Symbol.all_symbols, we only need one pair
of list pointers and not two. But I prefer to not need any :)
Worst case is only saving two pointers (ivar table); but I may look at
funny-falcon's sparse array for the ivar table. I have not looked at
the local variable table, but it may be in the same class as ivar
tables and be better with a sparse array.
P.S.: I am also considering truncating rb_idsym.hashval to use as ID.
This will:
a) reduce per-symbol overhead by sizeof(st_index_t)
b) (hopefully) improve distribution for global method cach
Measuring the effect of b) may be hard, though.