如何调整快速表达式编译超时



当表达式太复杂时,Swift 中存在编译错误:Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

有谁知道如何调整此超时("合理时间")?很高兴看到这个提示,它非常有用,但我不希望我的程序在某些随机情况下无法编译,例如:在慢速机器上。

有人有任何想法如何实现它吗?还是我应该停止担心?

这种诊断实际上与时间无关。这是关于记忆的。因此,计算机的速度有多快并不重要。几乎不用担心它在不同的机器上会有不同的行为(尽管见下文)。

CSSolver.cpp

  // If the solver has allocated an excessive amount of memory when solving for
  // this expression, short-circuit the binding operation and mark the parent
  // expression as "too complex".
  if (cs.TC.Context.getSolverMemory() >
        cs.TC.Context.LangOpts.SolverMemoryThreshold) {
    cs.setExpressionTooComplex(true);
    return true;
  }

setExpressionTooComplex是该诊断的起源)

当前SolverMemoryThreshold为 ~15MB。

由于 Swift 被移植到不同的架构,因此您有可能(尽管 IMO 极不可能)在某些平台上收到此错误,但在其他平台上则不会。一般来说,这将在与你想象的另一个方向上起作用。例如,在触发此诊断之前,实际上可能允许 32 位系统进一步深入兔子洞(因为 32 位计算机通常为数据结构分配较少的内存)。但是,如果你在尝试计算单个表达式时达到 15 MB,你可能不会再用几次递归来解决它。所以这将是一个非常令人惊讶和不太可能的结果。

最新更新