Оптимизация скорости работы скрипта при помощи Fast Undo

  • Автор темы Автор темы Oleg Butrin
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Oleg Butrin

Топикстартер
20 лет на форуме
Сообщения
1 993
Реакции
1 224
Разница между просто ENTIRE_SCRIPT и FAST_ENTIRE_SCRIPT в целом трудноуловима

Разница есть и она очень существенна!
В режиме FAST_ENTIRE_SCRIPT ради скорости система полностью снимает с себя контроль над процессом выполнения и это может закончится плачевно. Поэтому этот режим называется незащищенным, а ENTIRE_SCRIPT, соответственно, защищенным.

Во время выполнения могут возникать ошибки. В этом случае происходит откат публикации к точке запуска скрипта и выдается сообщение об ошибке. Это все нормально. Но если в вашей функции есть блок try…catch и вы задали режим FAST_ENTIRE_SCRIPT система не заметит, что ошибка произошла в этом блоке, и что вы эту ошибку успешно обработали. Система откатит вашу публикацию к началу прямо посреди выполнения скрипта, а последний будет продолжать работать как ни в чем небывало непонятно с чем.

Поэтому если вы используете блоки try…catch, то режим FAST_ENTIRE_SCRIPT лучше не использовать. Возможно есть и другие ситуации, когда нельзя использовать FAST_ENTIRE_SCRIPT.

Если вы долго не можете понять почему ваш скрипт делает что то не то, попробуйте заменить FAST_ENTIRE_SCRIPT на ENTIRE_SCRIPT. Приведу такой пример. Выполните его двух этих режимах и вы заметите разницу.

Код:
var myFunc = function() {
    var myTextFrame = app.activeDocument.textFrames[0];
    myTextFrame.contents = "Hello world\n";
    try {
        for (var x in myTextFrame) {
            var a = myTextFrame[x];
        }
    }
    catch (e) {
            myTextFrame.contents +=  e + "\n";
    }
}
app.doScript(
    myFunc,
    ScriptLanguage.javascript,
    undefined,
    UndoModes.ENTIRE_SCRIPT, // или FAST_ENTIRE_SCRIPT
    "myFunc"
);
 
  • Спасибо
Реакции: SlavaBuck и Oleg Butrin
to andrew.folio:
Я несколько раз сталкивался с этим и никак не мог понять в чём дело... Теперь всё стало на свои места! Из всего из этого вынес для себя три следствия:
1) Не использовать FAST_ENTIRE_SCRIPT с блоками кода, выполняющими сколь-нибудь сложные операции с документом, в том числе в скриптах, где имеется код с доступом к DOM документа в циклах;
2) Если мне всё-таки припечёт использовать FAST_ENTIRE_SCRIPT - заменить все блоки try…catch в скрипте на явные проверки условий и границ (if ... then; swtich ... и т.п.);
3) Если мне всё-таки припечёт использовать FAST_ENTIRE_SCRIPT - ещё раз подумать, отказаться и вернуться к использованию ENTIRE_SCRIPT :)
 
Последнее редактирование:
Исправил в статье.
 
Можно один режим паковать в другой
 
Или запускать отдельные части скрипта с разными UndoModes в зависимости от.
 
Можно один режим паковать в другой

Это не более чем иллюзия. Все-равно ваша функция будет выполняться без контроля системы (по последнему заданному UndoModes) со всеми вытекающими последствиями.

Добавьте оболочку и проверьте.

Код:
var myFunc = function() {
    var myTextFrame = app.activeDocument.textFrames[0];
    myTextFrame.contents = "Hello world\n";
    try {
        for (var x in myTextFrame) {
            var a = myTextFrame[x];
        }
    }
    catch (e) {
            myTextFrame.contents +=  e + "\n";
    }
}
var myCover = function()
    {
    app.doScript(
        myFunc,
        ScriptLanguage.javascript,
        undefined,
        UndoModes.FAST_ENTIRE_SCRIPT,
        "myFunc");
    };

app.doScript(
    myCover,
    ScriptLanguage.javascript,
    undefined,
    UndoModes.ENTIRE_SCRIPT,
    "myCover"
);
 
Вообще, я проверял. И Марк не просто так это расписал. Но ок, проверю еще раз, когда буду дома. И надо наоборот - entire вложен в fast entire

Перечитал статью - да, проблема с try/catch не решается, но там еще и с undo глюки есть
 
Провел дополнительные тесты на скорость для UndoModes.ENTIRE_SCRIPT и UndoModes.AUTO_UNDO, статью обновил.
На днях, а может даже раньше, напишу о том, как сделать скрипты, безопасные для запуска и удобные для отладки при использовании
UndoModes.FAST_ENTIRE_SCRIPT.
 
Статус
Закрыто для дальнейших ответов.