faster. but the result seems not very good. the previous commit is also not very good