refactor, add comment
add more benchmark