сравните, пожалуйста, скорость работы

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

hulk1776

Топикстартер
15 лет на форуме
Сообщения
738
Реакции
21
Если у кого есть время, сравните пожалуйста скорость работы скриптика-теста (VBS/JS) по закрашиванию таблицы.
Я измерял на таблице 20х20 ячеек (Indi CS3). Если комп медленный, можно 10х10.
Для проверки: в любом документе текстовым курсором нарисуйте рамку.
Меню Table-Insert Table и указать размерность.
Вот текст скриптов:
VBS
Код:
'курсор в тело таблицы
myStartTime = Time()
MyTime1 = Time
Set MyInd = CreateObject("InDesign.Application.CS3")
Set myDoc = MyInd.ActiveDocument
Set myTable = MyInd.Selection.Item(1).Parent.Parent 'узнали таблицу по месту курсора вставки
CC = myTable.Cells.Count ''кол-во колонок
Tt = 100 / CC
For i = 1 To CC
myTable.Cells.Item(i).FillColor = "Red"
myTable.Cells.Item(i).FillTint = 100 - Tt * i
Next 

MyTime2 = Time
'myt = "  " & Format(MyTime2 - MyTime1, "ss") & " сек."
'''на этой строке ругается, поэтому время измерить удалось только по часикам с секундами в трее :((
Msg = "Готово!": Style = vbOKOnly: Title = myt

JS
Код:
// курсор в тело таблицы

var myStartTime = new Date();  

var myDoc = app.activeDocument; 
// some text is selected in the table 
var myTable = app.selection[0].parent.parent; 
var CC = myTable.cells.length; 
var Tt = 100/CC 
for ( i = 0; i < CC; i++ ) {  
   myTable.cells[i].fillColor = "Black"; 
   myTable.cells[i].fillTint = 100 - Tt * i; 
} 

var myEndTime = new Date();  
var myDuration = (myEndTime - myStartTime)/10000;  
alert ("Duration - " + myDuration);
У меня JS работал 5 сек, VBS - 50 сек!!!
Но заметил такую вещь, если в момент работы скрипта Инди не виден (или даже просто окно отладчика перекрывает закрашиваемую таблицу), то скорость одинаковая (вроде бы).
Т.е. почему-то перерисовка экрана для VBS критична, а для JS нет.
Если не трудно, проверьте у себя и скажите, похожая ли картина.
И заодно вопрос. Можно ли как-то отключить перерисовку экрана на время работы скрипта?
У меня на строке MyInd.ScriptPreference.EnableRedraw = True (или False) пишет "метод не поддерживается".

Всем спасибо.
 
Ответ: сравните, пожалуйста, скорость работы

Перерисовка отключается в меню Scripts в индизайне!
Алгоритм представленных скриптов, мягко говоря, сильно неоптимален...
 
Ответ: сравните, пожалуйста, скорость работы

JS, таблица 40х40, Duration колеблется от 5 до 7,5 в разных запусках скрипта неизвестно почему.
Прикрываем фрейм с таблицей наполовину, загоняя 20 строк в overset -
Duration=1,7125
Прикрываем фрейм с таблицей почти полностью, оставляя 1 строку, остальное в оverset - Duration = 0,87.
-------
Заметил, что ячейка красится дважды, сначала черным, а потом оттенком. А нельзя ли так извернуться, чтобы сначала, перед циклом, сразу всю таблицу покрасить черным, а потом в цикле красить оттенками? Или если всю таблицу сразу покрасить нельзя, то хотя пройтись по строкам, сделав их черными, а потом по ячейкам, задавая оттенки. Это бы, думаю, сократило бы время работы.
 
Ответ: сравните, пожалуйста, скорость работы

sakhar сказал(а):
Перерисовка отключается в меню Scripts в индизайне!
Алгоритм представленных скриптов, мягко говоря, сильно неоптимален...

Да, нашел где отключить. Спасибо. Хотя раз эта функция присутствует, то хорошо бы ее вкл/откл. в каждом скрипте индивидуально. Потому что для каких-то не до конца отлаженных процедур надо визуально контролировать процесс. Но все равно уже лучше.
Спасибо.

Насчет алгоритма не могу ничего изменить, т.к. не специалист по алгоритмии. Я только учусь. А на данном этапе важно хоть что-то прописать в скрипте. А оптимизацией можно заняться, когда дойдут руки (если вообще дойдут - т.к. оптимизация может потребовать больше втременных затрат, чем первичный этап. Вот мне машину на работе поменяли, и потребовалось вставлять в код "цикл-тормоз", чтобы успеть хоть что-то проконтролировать. А после отладки и перерисовку отключаю, чтобы не мелькало).
Хотя оптимизровать всегда полезно, т.к. время можно сокращать до бесконечности. В идеале - щелкнул мышкой... и пошел домой 'dans))' '

boriskasmoscow сказал(а):
Прикрываем фрейм с таблицей почти полностью, оставляя 1 строку, остальное в оverset - Duration = 0,87.
Вот это интересно. Можно будет использовать как фоновую работу. А то и вообще сворачивать все приложение и пусть оно там крутится (в перспективе...)

Спасибо.
 
Ответ: сравните, пожалуйста, скорость работы

boriskasmoscow сказал(а):
нельзя ли так извернуться, чтобы сначала, перед циклом, сразу всю таблицу покрасить черным, а потом в цикле красить оттенками?

Вот как у меня закрашиваются все ячейки сразу:
Код:
myTable.Cells.ItemByRange(myTable.Cells.Item(1), myTable.Cells.Item(-1)).Item(-1).FillColor = "Red"
myTable.Cells.ItemByRange(myTable.Cells.Item(1), myTable.Cells.Item(-1)).Item(-1).FillTint = 100
'''а тут начинаем красить каждую ячейку последовательно
Tt = 100 / CC 'шаг приращения насыщенности
.
и т.д. (см. раньше).

Но скорости это, ессно, не добавляет.
Хотя может быть есть и более короткий способ как обработать цветом "всю таблицу сразу", или шрифтом, или начертанием. Но, наверное, этого можно добиться через присвоение стиля всей таблице. Но тогда его надо снач. создать - опять же время. А может быть создать и присвоить стиль быстрее, чем красить. Надо проверять и измерять.
 
Ответ: сравните, пожалуйста, скорость работы

"У меня на строке
Код:
MyInd.ScriptPreference.EnableRedraw = True (или False)
пишет "метод не поддерживается".

Надо добавить буковку "S":
Код:
MyInd.ScriptPreference[B][COLOR=DarkRed]S[/COLOR][/B].EnableRedraw = True (или False)
 
Статус
Закрыто для дальнейших ответов.