Можно ли ускорить работу скрипта?

Статус
Закрыто для дальнейших ответов.

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Скрипт "бежит" (CS3-VBA) по всем абзацам публикации и расставляет отбивки, шрифты и пр. оформление. При этом определяется текущий абзац и 2 смежных, в зависимости от которых оформление текущего абзаца может немного отличаться. Когда это происходит на странице 30-й и дальше, тормоза становятся настолько заметны, что возникают сомнения в продуктивности такой автоматизации (в Пейдже все летает независимо от размера дока, видимо, потому что более примитивная среда скриптинга).
Насколько я понял, торможение происходит в момент обращения к смежным абзацам, т.к. они вычисляются от начала story, а их уже набирается много к 30 и тем более к 100-й странице. Можно ли что-то посоветовать? Или как-то по иному вычислять текущий и смежные абзацы? Или может быть просто двигать курсор и работать с выделением? (есть ли такие команды в VB или JS? Типа paradown, paraup и т.п.). Сдается, что работа с выдeлением может оказаться даже быстрее.

Спасибо.
 

AirGraph

Участник
Сообщения
244
Реакции
21
Ответ: Можно ли ускорить работу скрипта?

Мысли вслух, что касается JS

1. Отказаться от конструкций типа with app{ activeDocument = ...}, а применять app.activeDocument = ... Проверено, работает быстрее.

2. Я попробовал бы в отдельном цикле по параграфам вытащить все их в свой массив объектов, типа myParArray.push(paragraph); параллельно прибив их все в store. Далее работал бы с одномерным массивом, где ссылки на объекты по индексам, возможно, работают в разы быстрее. По мере обработки запихивал бы объекты в store. Я не уверен, что это проканает с текстом, я этого никогда не делал, но при работе с картинками я обычно делал именно так.

AirGraph.
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Можно ли ускорить работу скрипта?

Какими операторами происходит обращение к смежным абзацам?
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Ответ: Можно ли ускорить работу скрипта?

boriskasmoscow сказал(а):
Какими операторами происходит обращение к смежным абзацам?

Обращение такое:
Код:
Set mPara0 = myInd.Selection.Item(1).Paragraphs.Item(1) 'para under  cursor
Set mPara2 = mPara0.InsertionPoints(-1).Paragraphs(1)
Set mPara3 = mPara2.InsertionPoints(-1).Paragraphs(1)
Время обращения - 1 сек.

А если так:
Код:
Set mPara2 = mPara0.ParentStory.Paragraphs.NextItem(mPara0)
Set mPara3 = mPara2.ParentStory.Paragraphs.NextItem(mPara2)
то работает на порядок быстрее.
Т.е. обращение через parentstory оказалось намного дольше, чем через InsertionPoint (спасибо вашему наводящему вопросу).
А тогда вопросик.
Нельзя ли обратиться к предыщущему абзацу через InsertionPoint?
Пока приходится делать опять же через Parentstory:
Код:
Para01 = mPara0.ParentStory.Paragraphs.PreviousItem(mPara0)

Т.е. задача избежать ParentStory.
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Можно ли ускорить работу скрипта?

//Начало
firstPara = myText.paragraphs[0]; // находим 1-й параграф
secondPara = firstPara.insertionPoints[-1].paragraphs[0]; // второй
thirdPara = secondPara.insertionPoints[-1].paragraphs[0]; // третий
// три абзаца есть, оформляем второй в зависимости от смежных
//отбивки, шрифты и пр. оформление
....
// как бы сдвигаем тройку абзацев на один абзац вниз.
firstPara = secondPara; // новый первый
secondPara = thirdPara; // новый второй
thirdPara = secondPara.insertionPoints[-1].paragraphs[0];
// Теперь у нас есть новый второй абзац, и два смежных, оформляем его.
........
//снова тройку абзацев сдвигаем на одну позицию вниз, ..и т.д.
// делать всё это в цикле
Так не пойдет?
 

Steve

Участник
Сообщения
227
Реакции
0
Ответ: Можно ли ускорить работу скрипта?

тормоза начинаются т.к. все эти действия пишутся в undo. и если объем для замен/модификаций большой, то это очень неоптимальный метод, который особо и не ускорить.
лучше делать экспорт в tagged-text, там расставить стили и прочее, а потом импорт. а совсем хорошо, сразу генерить нормальные файлы для импорта.
 

hulk1776

Топикстартер
15 лет на форуме
Сообщения
735
Реакции
21
Ответ: Можно ли ускорить работу скрипта?

boriskasmoscow сказал(а):
//Начало
...
//снова тройку абзацев сдвигаем на одну позицию вниз, ..и т.д.
// делать всё это в цикле
Так не пойдет?

Наверное, да. К тому же надо заменить обращение к предыдущему абзацу на обращение к следующему. Т.е. проверять стиль абзаца заранее, а не "задним числом".

to Steve:
про undo надо будет подумать. А стили приходится анализировать уже в самой верстке, т.к. некоторые верстаются в отдельных текст блоках, выносятся на поля, под них подкладывается фон. Т.е. одними тегами не оформить.

to AirGraph
Про "with app" - интересно, надо будет иметь в виду (правда я в VBA "сижу", но там аналогичная конструкция). И по индексам надо будет тоже попробовать пообращаться к параграфам. По логике должно быть быстрее.

Всем большое спасибо за мысли и подсказки.
 

iv-mi

15 лет на форуме
Сообщения
565
Реакции
381
Ответ: Можно ли ускорить работу скрипта?

В известной книге М. Борисова по скриптам на страницах 69 и 211 есть интересная информация о повышении быстродействия программ, написанных на JavaScript: при работе с диапазоном объектов метод itemByRange() обеспечивает на порядок большее быстродействие, нежели обычный цикл.
 
Статус
Закрыто для дальнейших ответов.