lib/find_bit_bench.c: Add find_last_zero_bit.
PATCH v2 5/8 lib/find_bit_bench.c: Add find_last_zero_bit.
Add bench test of find_last_zero_bit.
Also, this patch fix the unmatched iterations value with find_next_bit and find_last_bit which happen when
the last bit set or not,
Let suppose, 4096 bitmap size and 4095 bit is set only. In this case former find_next_bit returns iterations count as 0. But find_last_bit returns it as 1.
This unmatched return value makes some confusion.
So we fix it.
Signed-off-by Levi Yun <[email protected]>
--- lib/find_bit_benchmark.c | 51 +++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-)
lib/find_bit_benchmark.c +37 -14
@@ -35,14 +35,14 @@ static DECLARE_BITMAP(bitmap2, BITMAP_LEN) __initdata;*/ static int __init test_find_first_bit (void *bitmap,unsigned long len) { -unsigned long i, cnt; +unsigned long i =0 , cnt =0 ;ktime_t time; time =ktime_get (); -for (cnt = i =0 ; i < len; cnt++) { +do { i =find_first_bit (bitmap, len);__clear_bit (i, bitmap); - } + }while (i++ < len && ++cnt); time =ktime_get () - time;pr_err ("find_first_bit: %18llu ns, %6ld iterations\n" , time, cnt);
@@ -51,12 +51,13 @@ static int __init test_find_first_bit(void *bitmap, unsigned long len)static int __init test_find_next_bit (const void *bitmap,unsigned long len) { -unsigned long i, cnt; +unsigned long i =0 , cnt =0 ;ktime_t time; time =ktime_get (); -for (cnt = i =0 ; i <BITMAP_LEN ; cnt++) - i =find_next_bit (bitmap,BITMAP_LEN , i) +1 ; +do { + i =find_next_bit (bitmap,BITMAP_LEN , i); + }while (i++ <BITMAP_LEN && ++cnt); time =ktime_get () - time;pr_err ("find_next_bit: %18llu ns, %6ld iterations\n" , time, cnt);
@@ -65,12 +66,13 @@ static int __init test_find_next_bit(const void *bitmap, unsigned long len)static int __init test_find_next_zero_bit (const void *bitmap,unsigned long len) { -unsigned long i, cnt; +unsigned long i =0 , cnt =0 ;ktime_t time; time =ktime_get (); -for (cnt = i =0 ; i <BITMAP_LEN ; cnt++) - i =find_next_zero_bit (bitmap, len, i) +1 ; +do { + i =find_next_zero_bit (bitmap, len, i); + }while (i++ <BITMAP_LEN && ++cnt); time =ktime_get () - time;pr_err ("find_next_zero_bit: %18llu ns, %6ld iterations\n" , time, cnt);
@@ -84,27 +86,46 @@ static int __init test_find_last_bit(const void *bitmap, unsigned long len) time =ktime_get ();do { - cnt++; l =find_last_bit (bitmap, len);if (l >= len)break ; len = l; - }while (len); + }while (len >=0 && ++cnt);/**< to find real 0 bit set. */ time =ktime_get () - time;pr_err ("find_last_bit: %18llu ns, %6ld iterations\n" , time, cnt);return 0 ; } +static int __init test_find_last_zero_bit (const void *bitmap,unsigned long len) +{ +unsigned long l, cnt =0 ; +ktime_t time; + + time =ktime_get (); +do { + l =find_last_zero_bit (bitmap, len); +if (l >= len) +break ; + len = l; + }while (len >=0 && ++cnt);/**< to find real 0 bit set. */ + time =ktime_get () - time; +pr_err ("find_last_zero_bit: %18llu ns, %6ld iterations\n" , time, cnt); + +return 0 ; +} + +static int __init test_find_next_and_bit (const void *bitmap,const void *bitmap2,unsigned long len) { -unsigned long i, cnt; +unsigned long i, cnt =0 ;ktime_t time; time =ktime_get (); -for (cnt = i =0 ; i <BITMAP_LEN ; cnt++) - i =find_next_and_bit (bitmap, bitmap2,BITMAP_LEN , i +1 ); +do { + i =find_next_and_bit (bitmap, bitmap2,BITMAP_LEN , i); + }while (i++ <BITMAP_LEN && ++cnt); time =ktime_get () - time;pr_err ("find_next_and_bit: %18llu ns, %6ld iterations\n" , time, cnt);
@@ -123,6 +144,7 @@ static int __init find_bit_test(void)test_find_next_bit (bitmap,BITMAP_LEN );test_find_next_zero_bit (bitmap,BITMAP_LEN );test_find_last_bit (bitmap,BITMAP_LEN ); +test_find_last_zero_bit (bitmap,BITMAP_LEN );/* * test_find_first_bit() may take some time, so
@@ -144,6 +166,7 @@ static int __init find_bit_test(void)test_find_next_bit (bitmap,BITMAP_LEN );test_find_next_zero_bit (bitmap,BITMAP_LEN );test_find_last_bit (bitmap,BITMAP_LEN ); +test_find_last_zero_bit (bitmap,BITMAP_LEN );test_find_first_bit (bitmap,BITMAP_LEN );test_find_next_and_bit (bitmap, bitmap2,BITMAP_LEN );
Signature · 1 line
2.27.0