当表达式过于复杂时,Swift中存在编译错误:Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
。
有谁知道如何调整此超时(“合理时间”)?很高兴看到这个提示,它非常有用,但我不希望我的程序在某些随机情况下无法编译,例如:在慢速机器上。
任何人都有任何想法如何实现它?或者我应该不再担心吗?
答案 0 :(得分:3)
该诊断实际上并非时间。它是关于记忆的。因此,计算机的速度并不重要。很少需要担心它在不同的机器上的表现会有所不同(见下文)。
来自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,那么你可能只需要几次递归就可以解决它。所以这将是一个非常令人惊讶且不太可能的结果。