overallImpact(audit, metricAudits) {
    if (!audit.result.metricSavings) {
      return {overallImpact: 0, overallLinearImpact: 0};
    }

    let overallImpact = 0;
    let overallLinearImpact = 0;
    for (const [k, savings] of Object.entries(audit.result.metricSavings)) {
      // Get metric savings for individual audit.
      if (savings === undefined) continue;

      // Get the metric data.
      const mAudit = metricAudits.find(audit => audit.acronym === k);
      if (!mAudit) continue;
      if (mAudit.result.score === null) continue;

      const mValue = mAudit.result.numericValue;
      if (!mValue) continue;

      const linearImpact = savings / mValue * mAudit.weight;
      overallLinearImpact += linearImpact;

      const scoringOptions = mAudit.result.scoringOptions;
      if (!scoringOptions) continue;

      const newMetricScore = Util.computeLogNormalScore(scoringOptions, mValue - savings);

      const weightedMetricImpact = (newMetricScore - mAudit.result.score) * mAudit.weight;
      overallImpact += weightedMetricImpact;
    }
    return {overallImpact, overallLinearImpact};
  }
Returns overallImpact and linearImpact for an audit.
The overallImpact is determined by the audit saving's effect on the overall performance score.
We use linearImpact to compare audits where their overallImpact is rounded down to 0.

@param {LH.ReportResult.AuditRef} audit
@param {LH.ReportResult.AuditRef[]} metricAudits
@return {{overallImpact: number, overallLinearImpact: number}}