从方法返回大对象在生产环境中运行速度慢100倍

时间:2015-02-07 10:28:45

标签: ruby-on-rails ruby-on-rails-4

我有一个模型,我将一个相当大的序列化对象存储为其属性之一。

将此对象从一个方法传递到另一个i生产环境时,从下面的日志中可以看出,需要花费大量时间(确切地说是100倍)。

奇怪的是,它不会发生在开发环境中,只会生产。它也发生在ajax请求期间,但不确定它是否相关

这是调用方法

的代码段
    now = Time.now
    price_document  = self.applied_price_document
    Rails.logger.info "cp_id: #{self.id} self.try :applied_price_document (2) #{Time.now - now} "

哪个记录1.06秒

然后我尝试记录该方法中的每条指令以找到瓶颈,结果证明没有从日志中可以看到

  def applied_carrier_product
    start = Time.now
    ancestors = CarrierProduct.find_carrier_product_ancestors(carrier_product_id: self.id).includes(:carrier_product_price).references(:carrier_product_price)

    parent    = ancestors.select{ |cp| cp.id == self.carrier_product_id }.first
    until parent.nil? || ancestors.empty?
      is_successful = parent.carrier_product_price.try('successful?')

      if is_successful
        Rails.logger.info "cp_id: #{self.id} end #{Time.now - start} "
        return parent.carrier_product_price
      end

      parent = ancestors.select{ |cp| cp.id == parent.carrier_product_id }.first

    end
  end

在返回结果之前,我记录方法的总运行时间,结果为0.002秒。

这意味着将结果传递给调用方法大约需要1秒钟。鉴于我连续多次调用这种方法30次,这是一个很大的问题

为什么会这样?

0 个答案:

没有答案