2016-03-12 3 views
3

В Swift есть ошибка компиляции, когда выражение слишком сложное: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions.Как настроить быстрое время компиляции выражения?

Кто-нибудь знает, как настроить этот таймаут (что «разумное время»)? Было бы неплохо увидеть этот намек, это очень полезно, но я не хочу, чтобы моя программа не скомпилировалась при некоторых случайных обстоятельствах, например: на медленных машинах.

У кого-нибудь есть идеи, как его реализовать? Или я должен перестать беспокоиться?

+0

см. Http://stackoverflow.com/questions/33794574/swift-expression-was-too-complex-to-be-solved-in-reasonable-time?rq=1 – sschale

+0

Разбить выражение, чтобы ошибка и не беспокойтесь об этом. Я имею в виду на самом деле, его аристократ – FruitAddict

+2

Вопрос действительно один ИМО и отличается от связанного вопроса. Вопрос не в том, как избежать этой диагностики, когда это происходит на * вашей * системе; речь идет о том, чтобы не происходить на * других * системах. Оказывается, на самом деле это не проблема; но разумное прочтение диагностики предполагает, что это может быть. –

ответ

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 переносится в разные архитектуры, возможно (хотя и маловероятно, ИМО), что вы можете получить эту ошибку на некоторых платформах, но не в других. Как правило, это будет работать в другом направлении, чем вы думаете. Например, 32-разрядной системе может быть разрешено идти дальше вниз по кроличьей скважине до того, как эта диагностическая пожар (поскольку 32-разрядные машины часто выделяют меньше памяти для структур данных). Но если вы нажмете 15 Мбайт, пытаясь оценить одно выражение, вы, вероятно, не собираетесь его решать только несколькими рекурсиями. Так что это было бы очень неожиданным и маловероятным результатом.