int __init pool_benchmark(void) { long i, j, t0, t1; ngx_pool_t *np; TfwPool *tp; printk(KERN_ERR "object sizes: Small - %lu, Big - %lu Huge - %lu\n", sizeof(Small), sizeof(Big), sizeof(Huge)); t0 = jiffies; for (i = 0; i < N_ALLOC; ++i) { p_arr[i] = (void *)__get_free_pages(GFP_KERNEL, 0); touch_obj(p_arr[i]); } for (i = 0; i < N_ALLOC; ++i) free_pages((unsigned long)p_arr[i], 0); t1 = jiffies; printk(KERN_ERR "alloc & free: %ldms\n", t1 - t0); /*****************************************************************/ np = ngx_create_pool(PAGE_SIZE); BUG_ON(!np); t0 = jiffies; for (i = 0; i < N; ++i) { Small *o = (Small *)ngx_palloc(np, sizeof(Small)); touch_obj(o); } t1 = jiffies; ngx_destroy_pool(np); /* HZ = 1000 for my kernel. */ printk(KERN_ERR "ngx_pool (Small): %ldms\n", t1 - t0); np = ngx_create_pool(PAGE_SIZE); BUG_ON(!np); t0 = jiffies; for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) { Big *o = (Big *)ngx_palloc(np, sizeof(Big)); touch_obj(o); } t1 = jiffies; ngx_destroy_pool(np); printk(KERN_ERR "ngx_pool (Big): %ldms\n", t1 - t0); np = ngx_create_pool(PAGE_SIZE); BUG_ON(!np); t0 = jiffies; for (i = 0; i < N; ++i) { if (unlikely(!(i & 0xfff))) { Huge *o = (Huge *)ngx_palloc(np, sizeof(*o)); touch_obj(o); if (!(i & 1)) ngx_pfree(np, o); } else if (unlikely(!(i & 3))) { Big *o = (Big *)ngx_palloc(np, sizeof(*o)); touch_obj(o); } else { Small *o = (Small *)ngx_palloc(np, sizeof(*o)); touch_obj(o); } } t1 = jiffies; ngx_destroy_pool(np); printk(KERN_ERR "ngx_pool w/ free (Mix): %ldms\n", t1 - t0); t0 = jiffies; for (i = 0; i < N / 100; ++i) { np = ngx_create_pool(PAGE_SIZE); for (j = 0; j < 100; ++j) { if (unlikely(!(i & 3))) { Big *o = (Big *)ngx_palloc(np, sizeof(*o)); touch_obj(o); } else { Small *o; o = (Small *)ngx_palloc(np, sizeof(*o)); touch_obj(o); } } ngx_destroy_pool(np); } t1 = jiffies; printk(KERN_ERR "ngx_pool cr. & destr.: %ldms\n", t1 - t0); /*****************************************************************/ tp = __tfw_pool_new(0); BUG_ON(!tp); t0 = jiffies; for (i = 0; i < N; ++i) { Small *o = (Small *)tfw_pool_alloc(tp, sizeof(Small)); touch_obj(o); } t1 = jiffies; tfw_pool_destroy(tp); printk(KERN_ERR "tfw_pool (Small): %ldms\n", t1 - t0); tp = __tfw_pool_new(0); BUG_ON(!tp); t0 = jiffies; for (i = 0; i < N; ++i) { Small *o = (Small *)tfw_pool_alloc(tp, sizeof(Small)); touch_obj(o); if (unlikely(!(i & 3))) tfw_pool_free(tp, o, sizeof(Small)); } t1 = jiffies; tfw_pool_destroy(tp); printk(KERN_ERR "tfw_pool w/ free (Small): %ldms\n", t1 - t0); tp = __tfw_pool_new(0); BUG_ON(!tp); t0 = jiffies; for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) { Big *o = (Big *)tfw_pool_alloc(tp, sizeof(Big)); touch_obj(o); } t1 = jiffies; tfw_pool_destroy(tp); printk(KERN_ERR "tfw_pool (Big): %ldms\n", t1 - t0); tp = __tfw_pool_new(0); BUG_ON(!tp); t0 = jiffies; for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) { Big *o = (Big *)tfw_pool_alloc(tp, sizeof(Big)); touch_obj(o); if (unlikely(!(i & 3))) tfw_pool_free(tp, o, sizeof(Big)); } t1 = jiffies; tfw_pool_destroy(tp); printk(KERN_ERR "tfw_pool w/ free (Big): %ldms\n", t1 - t0); tp = __tfw_pool_new(0); BUG_ON(!tp); t0 = jiffies; for (i = 0; i < N; ++i) { if (unlikely(!(i & 0xfff))) { Huge *o = (Huge *)tfw_pool_alloc(tp, sizeof(*o)); touch_obj(o); if (!(i & 1)) tfw_pool_free(tp, o, sizeof(*o)); } else if (unlikely(!(i & 3))) { Big *o = (Big *)tfw_pool_alloc(tp, sizeof(*o)); touch_obj(o); if (!(i & 1)) tfw_pool_free(tp, o, sizeof(*o)); } else { Small *o = (Small *)tfw_pool_alloc(tp, sizeof(*o)); touch_obj(o); } } t1 = jiffies; tfw_pool_destroy(tp); printk(KERN_ERR "tfw_pool w/ free (Mix): %ldms\n", t1 - t0); t0 = jiffies; for (i = 0; i < N / 100; ++i) { tp = __tfw_pool_new(0); for (j = 0; j < 100; ++j) { if (unlikely(!(i & 3))) { Big *o = (Big *)tfw_pool_alloc(tp, sizeof(*o)); touch_obj(o); } else { Small *o; o = (Small *)tfw_pool_alloc(tp, sizeof(*o)); touch_obj(o); } } tfw_pool_destroy(tp); } t1 = jiffies; printk(KERN_ERR "tfw_pool cr. & destr.: %ldms\n", t1 - t0); return 0; }
void free_all_str(void) { tfw_pool_destroy(str_pool); str_pool = NULL; }