当表达式太复杂时,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,你可能不会再用几次递归来解决它。所以这将是一个非常令人惊讶和不太可能的结果。