Feature #10187

minor iseq memory reductions

Added by Eric Wong 8 months ago. Updated 8 months ago.

[ruby-core:64665]
Status:Open
Priority:Low
Assignee:Eric Wong

Description

Pretty trivial and low impact, but I figure we might as well reduce
memory footprint a few kilobytes where we can and let the reductions
accumulate. Feature #10185 has much bigger impact.

  • [PATCH 1/2] iseq_inline_storage_entry: 24=>16 bytes on x86-64

We may tag the running_thread pointer to avoid making the "once" struct
bigger than "struct iseq_inline_cache_entry".

This only saves a small amount with "valgrind ruby -e exit"
before:
total heap usage: 48,122 allocs, 19,248 frees, 8,110,149 bytes allocated
after:
total heap usage: 48,122 allocs, 19,253 frees, 8,099,197 bytes allocated

  • [PATCH 2/2] rb_call_info_t: 104=>96 bytes on x86-64

This keeps ci->flag and ci->aux.index consistent across 32-bit
and 64-bit platforms.

ci->flag: VM_CALL_* flags only use 9 bits, currently
ci->aux.index: 2 billion ivars per class should be enough for anybody

This saves around 50K allocations on "valgrind ruby -e exit"
before:
total heap usage: 48,122 allocs, 19,253 frees, 8,099,197 bytes allocated
after:
total heap usage: 48,069 allocs, 19,214 frees, 8,047,266 bytes allocated

inline_storage-16.patch Magnifier (2.45 KB) Eric Wong, 08/30/2014 01:42 AM

call_info-96.patch Magnifier (8.24 KB) Eric Wong, 08/30/2014 01:43 AM

call_info-96-v2.patch Magnifier (8.01 KB) Eric Wong, 09/09/2014 08:32 AM

History

#1 Updated by Eric Wong 8 months ago

Missed patch 2/2

#2 Updated by Eric Wong 8 months ago

updated 2/2 patch to adjust for r47456 (redundant SYM2ID <=> ID2SYM removal)

#3 Updated by Koichi Sasada 8 months ago

Subject: [PATCH] iseq_inline_storage_entry: 24=>16 bytes on x86-64

+#define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1))

How about to define macro such as

#define ONCE_FINISHED(once) ((once)->running_thread == 0x01)

and use as

if (ONCE_FINIHSED(&is->once)) { ... }

Subject: [PATCHv2] rb_call_info_t: shrink to 96 bytes from 104 bytes on 64-bit

OK.

#4 Updated by Koichi Sasada 8 months ago

+                if (newsize > INT_MAX) rb_memerror();

memerror?

#5 Updated by Eric Wong 8 months ago

ko1@atdot.net wrote:

Subject: [PATCH] iseq_inline_storage_entry: 24=>16 bytes on x86-64

+#define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1))

How about to define macro such as

#define ONCE_FINISHED(once) ((once)->running_thread == 0x01)

and use as

if (ONCE_FINIHSED(&is->once)) { ... }

I would need another macro for setting 0x1:

+   is->once.running_thread = RUNNING_THREAD_ONCE_DONE; /* success */

I prefer to only introduce one new macro.

#6 Updated by Eric Wong 8 months ago

ko1@atdot.net wrote:

  • if (newsize > INT_MAX) rb_memerror();

memerror?

I took the hint from compile_data_alloc:

    if (size >= INT_MAX) rb_memerror();
    if (storage->pos + size > storage->size) {
    unsigned int alloc_size = storage->size;

    while (alloc_size < size) {
        if (alloc_size >= INT_MAX / 2) rb_memerror();
        alloc_size *= 2;

Nobody hits the limit, so reusing rb_memerror keeps code size down.

#7 Updated by Koichi Sasada 8 months ago

Eric Wong wrote:

Nobody hits the limit, so reusing rb_memerror keeps code size down.

how about to use rb_fatal() to declare give up?

#8 Updated by Eric Wong 8 months ago

ko1@atdot.net wrote:

Eric Wong wrote:

Nobody hits the limit, so reusing rb_memerror keeps code size down.

how about to use rb_fatal() to declare give up?

Actually, nobody hits that check anymore, I removed it.
Correct check is in r47512, thanks nobu!

Also available in: Atom PDF