docs: def timeit(argument):
      """
      检测函数运行时间的装饰器
      支持不传参数的写法：
          @timeit
          def func(): pass
      或者传入一个logger：
          @timeit(logger)
          def func(): pass
      空参情况下将会打印运行时间到控制台，传入logger则会通过logger处理。
      """
      if hasattr(argument, 'info'):
          def decorator(function):
              @wraps(function)
              def wrapper(*args, **kwargs):
                  start_time = time.time()
                  argument.info('function [%s] start at [%s]' % (function.__name__, now(obj=False, precise=True)))
                  rst = function(*args, **kwargs)
                  argument.info('function [%s] exit  at [%s]' % (function.__name__, now(obj=False, precise=True)))
                  argument.info('function [%s] coast [%sms]' % (function.__name__, (time.time() - start_time) * 1000))
                  return rst
  
              return wrapper
  
          return decorator
      if callable(argument):
          @wraps(argument)
          def wrapper(*args, **kwargs):
              start_time = time.time()
              print 'function [%s] start at [%s]' % (argument.__name__, now(obj=False, precise=True))
              rst = argument(*args, **kwargs)
              print 'function [%s] exit  at [%s]' % (argument.__name__, now(obj=False, precise=True))
              print 'function [%s] coast [%sms]' % (argument.__name__, (time.time() - start_time) * 1000)
              return rst
  
          return wrapper
      raise ValueError('argument error.')