From cc8b13a00bfe7083ae68755e547a39cd762f2963 Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Tue, 25 Jul 2006 20:40:40 +0000 Subject: [lib] Optimise thread_call by caching pointer to thread history in the thread 2006-07-25 Paul Jakma * thread.h: (struct thread) Add a cache pointer to the struct cpu_thread_history, if it is known - saving hash lookup on each thread_call. * thread.c: (thread_call) Cache the pointer to the cpu_thread_history, so that future thread_calls of same thread can avoid the hash_lookup. --- lib/ChangeLog | 9 +++++++++ lib/thread.c | 39 +++++++++++++++++++++++++-------------- lib/thread.h | 1 + 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index 02148671..7a744393 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,12 @@ +2006-07-25 Paul Jakma + + * thread.h: (struct thread) Add a cache pointer to the struct + cpu_thread_history, if it is known - saving hash lookup on + each thread_call. + * thread.c: (thread_call) Cache the pointer to the + cpu_thread_history, so that future thread_calls of same + thread can avoid the hash_lookup. + 2006-07-10 Andrew J. Schorr * vty.c: (vty_log_out) Do not call vty_close, because this could diff --git a/lib/thread.c b/lib/thread.c index 32fc15ef..8b6a7e2f 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -879,12 +879,23 @@ thread_call (struct thread *thread) { unsigned long realtime, cputime; RUSAGE_T ru; - struct cpu_thread_history tmp, *cpu; - - tmp.func = thread->func; - tmp.funcname = thread->funcname; - cpu = hash_get (cpu_record, &tmp, - (void * (*) (void *))cpu_record_hash_alloc); + + /* Cache a pointer to the relevant cpu history thread, if the thread + * does not have it yet. + * + * Callers submitting 'dummy threads' hence must take care that + * thread->cpu is NULL + */ + if (!thread->hist) + { + struct cpu_thread_history tmp; + + tmp.func = thread->func; + tmp.funcname = thread->funcname; + + thread->hist = hash_get (cpu_record, &tmp, + (void * (*) (void *))cpu_record_hash_alloc); + } GETRUSAGE (&thread->ru); @@ -893,17 +904,17 @@ thread_call (struct thread *thread) GETRUSAGE (&ru); realtime = thread_consumed_time (&ru, &thread->ru, &cputime); - cpu->real.total += realtime; - if (cpu->real.max < realtime) - cpu->real.max = realtime; + thread->hist->real.total += realtime; + if (thread->hist->real.max < realtime) + thread->hist->real.max = realtime; #ifdef HAVE_RUSAGE - cpu->cpu.total += cputime; - if (cpu->cpu.max < cputime) - cpu->cpu.max = cputime; + thread->hist->cpu.total += cputime; + if (thread->hist->cpu.max < cputime) + thread->hist->cpu.max = cputime; #endif - ++cpu->total_calls; - cpu->types |= (1 << thread->add_type); + ++(thread->hist->total_calls); + thread->hist->types |= (1 << thread->add_type); #ifdef CONSUMED_TIME_CHECK if (realtime > CONSUMED_TIME_CHECK) diff --git a/lib/thread.h b/lib/thread.h index f693ff5a..0670a890 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -80,6 +80,7 @@ struct thread struct timeval sands; /* rest of time sands value. */ } u; RUSAGE_T ru; /* Indepth usage info. */ + struct cpu_thread_history *hist; /* cache pointer to cpu_history */ char* funcname; }; -- cgit v1.2.1