Harsha M V
Harsha M V

Reputation: 54949

Optimising Method

I have the following code

def calculate_metrics
    reach_values = {}
    reach_values['reach_change_value'] = 0
    reach_values['reach_change_type'] = 'nochange'

    if find_yesterdays_metrics
      change = (get_influencer_metrics["total_count"]).to_i - find_yesterdays_metrics.reach_count
      reach_values['reach_change_value'] = change.abs

      case
        when change < 0
          reach_values['reach_change_type'] = "down"
        when  change > 0
          reach_values['reach_change_type'] = "up"
      end
    end

    reach_values
  end

def set_metrics_data
    @facebook_metrics = @influencer_metrics.new(
      reach_change_value: calculate_metrics['reach_change_value'],
      reach_change_type: calculate_metrics['reach_change_type'],
      social_account: SocialAccount.friendly.find('facebook')
    )
  end

The calculate_metrics is being called twice right now and being fully processed twice. Is there any suggestions on how i can optimize the same so that i dont have to process the same data twice.

Upvotes: 2

Views: 55

Answers (2)

M. Suurland
M. Suurland

Reputation: 735

In set_metrics_data put the result of calculate_metrics in a tmp variable, lets call it x and then ask of x the type and value. Which will look like:

x = calculate_metrics  
reach_change_value : x['reach_change_value'] 
each_change_type : x['reach_change_type']`

As a result the call to calculate_metrics is only called once (and stored in a tmp variable x).

Upvotes: 1

Thorin
Thorin

Reputation: 2034

You can follow the M. Suurland answer like

x = calculate_metrics  
reach_change_value : x['reach_change_value'] 
each_change_type : x['reach_change_type']`

and for some optimize/syntax change calculate_metrics you can use like this

def calculate_metrics
    reach_values = {'reach_change_value': 0, 'reach_change_type': "nochange"}
    yesterday_mat = find_yesterdays_metrics
    if yesterday_mat
        change = (get_influencer_metrics["total_count"]).to_i - yesterday_mat.reach_count
        reach_values = 
            case change
            when change < 0
              {'reach_change_type': "down", 'reach_change_value': change.abs}
            when  change > 0
              {'reach_change_type': "up", 'reach_change_value': change.abs}
            else
                reach_values
            end
    end
    reach_values
end

Upvotes: 0

Related Questions