mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-18 02:55:12 +00:00
replace modulo by bitwise AND for hash table lookups
This operation is a lot faster, but depends on the hash table size be a power of 2 (so HTABSIZE - 1 is a row of 1's). Also a define for the magic value cleans things up a bit.
This commit is contained in:
parent
12d7781c7b
commit
4baba32459
15
src/top.c
15
src/top.c
@ -32,6 +32,9 @@
|
|||||||
#include "top.h"
|
#include "top.h"
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
|
|
||||||
|
/* hash table size - always a power of 2 */
|
||||||
|
#define HTABSIZE 256
|
||||||
|
|
||||||
static unsigned long g_time = 0;
|
static unsigned long g_time = 0;
|
||||||
static unsigned long long previous_total = 0;
|
static unsigned long long previous_total = 0;
|
||||||
static struct process *first_process = 0;
|
static struct process *first_process = 0;
|
||||||
@ -41,7 +44,7 @@ struct proc_hash_entry {
|
|||||||
struct proc_hash_entry *next;
|
struct proc_hash_entry *next;
|
||||||
struct process *proc;
|
struct process *proc;
|
||||||
};
|
};
|
||||||
static struct proc_hash_entry proc_hash_table[256];
|
static struct proc_hash_entry proc_hash_table[HTABSIZE];
|
||||||
|
|
||||||
static void hash_process(struct process *p)
|
static void hash_process(struct process *p)
|
||||||
{
|
{
|
||||||
@ -51,12 +54,12 @@ static void hash_process(struct process *p)
|
|||||||
|
|
||||||
/* better make sure all next pointers are zero upon first access */
|
/* better make sure all next pointers are zero upon first access */
|
||||||
if (first_run) {
|
if (first_run) {
|
||||||
memset(proc_hash_table, 0, sizeof(struct proc_hash_entry) * 256);
|
memset(proc_hash_table, 0, sizeof(struct proc_hash_entry) * HTABSIZE);
|
||||||
first_run = 0;
|
first_run = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the bucket index */
|
/* get the bucket index */
|
||||||
bucket = p->pid % 256;
|
bucket = p->pid & (HTABSIZE - 1);
|
||||||
|
|
||||||
/* insert a new element on bucket's top */
|
/* insert a new element on bucket's top */
|
||||||
phe = malloc(sizeof(struct proc_hash_entry));
|
phe = malloc(sizeof(struct proc_hash_entry));
|
||||||
@ -70,7 +73,7 @@ static void unhash_process(struct process *p)
|
|||||||
struct proc_hash_entry *phe, *tmp;
|
struct proc_hash_entry *phe, *tmp;
|
||||||
|
|
||||||
/* get the bucket head */
|
/* get the bucket head */
|
||||||
phe = &proc_hash_table[p->pid % 256];
|
phe = &proc_hash_table[p->pid & (HTABSIZE - 1)];
|
||||||
|
|
||||||
/* find the entry pointing to p and drop it */
|
/* find the entry pointing to p and drop it */
|
||||||
while (phe->next) {
|
while (phe->next) {
|
||||||
@ -95,7 +98,7 @@ static void unhash_all_processes(void)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < HTABSIZE; i++) {
|
||||||
__unhash_all_processes(&proc_hash_table[i]);
|
__unhash_all_processes(&proc_hash_table[i]);
|
||||||
proc_hash_table[i].next = NULL;
|
proc_hash_table[i].next = NULL;
|
||||||
}
|
}
|
||||||
@ -140,7 +143,7 @@ static struct process *find_process(pid_t pid)
|
|||||||
{
|
{
|
||||||
struct proc_hash_entry *phe;
|
struct proc_hash_entry *phe;
|
||||||
|
|
||||||
phe = &proc_hash_table[pid % 256];
|
phe = &proc_hash_table[pid & (HTABSIZE - 1)];
|
||||||
while (phe->next) {
|
while (phe->next) {
|
||||||
if (phe->next->proc->pid == pid)
|
if (phe->next->proc->pid == pid)
|
||||||
return phe->next->proc;
|
return phe->next->proc;
|
||||||
|
Loading…
Reference in New Issue
Block a user