Медленный перебор клеток - как ускорить?

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

PICC

Участник
Топикстартер
Сообщения
16
Реакции
0
Ответ: Медленный перебор клеток - как ускорить?

Интересно было бы сравнить быстродействие одного и того же алгоритма, реализованного как 1) VBA, 2) JS, 3) плагин C++. Я лично не сомневаюсь в том, что 1) медленнее 2), 2) медленнее 3), но интересно бы это увидеть в цифрах.
 

Strizh

15 лет на форуме
Сообщения
982
Реакции
92
Ответ: Медленный перебор клеток - как ускорить?

Интересно было бы сравнить быстродействие одного и того же алгоритма, реализованного как 1) VBA, 2) JS, 3) плагин C++. Я лично не сомневаюсь в том, что 1) медленнее 2), 2) медленнее 3), но интересно бы это увидеть в цифрах.
А какого алгоритма? Того что до этого использовался?
 

PICC

Участник
Топикстартер
Сообщения
16
Реакции
0
Ответ: Медленный перебор клеток - как ускорить?

Ну, допустим, таблица 5 ячеек на 1000 строк - немало? Вот для нее и применить программу из #5. Я думаю, разница будет заметна на глаз. А чтобы не только "на глаз" - засечь кол-во миллисекунд или лучше даже секунд.
Но вот только стоит ли на это тратить свое время 'hz' ? ..
 

Strizh

15 лет на форуме
Сообщения
982
Реакции
92
Ответ: Медленный перебор клеток - как ускорить?

Но вот только стоит ли на это тратить свое время 'hz' ? ..
Простите, через 5 часов самолет, сейчас не успею, да и нет желания, переписать скрипт из поста #5 в плагин. По возвращению (после 5го августа), займусь этим вопросом.
От Вас жду indd-файл на котором можно будет запустить тест. (Не забудьте указать версию ИД в которой он создан).
 

andrew.folio

Участник
Сообщения
28
Реакции
40
Ответ: Медленный перебор клеток - как ускорить?

Увеличить производительность скрипта можно еще, если запускать его при помощи Application.doScript с указанием UndoModes.ENTIRE_SCRIPT или UndoModes.FAST_ENTIRE_SCRIPT
Например, если в документе мы имеем следующую таблицу
12345
123451234512345123451234512345123451234512345
12345123451234512345123451234512345123451234512345

то скрипт ниже, который (в качестве теста) переставляет по кругу символы в каждой ячейке, возвращая их в исходное положение, запущенный в разных режимах UndoModes, будет давать существенную разницу в производительности.
Код:
var myFunc = function() {
    var myTable = app.activeDocument.selection[0].parentStory.tables.firstItem();
        
    for (var i =0; i<myTable.cells.length; i++) {[INDENT]for (var j = 0; j<5; j++) {
[/INDENT]
[INDENT=2]var ch = myTable.cells[i].characters[0].contents;
myTable.cells[i].characters[0].remove();
myTable.cells[i].contents = myTable.cells[i].contents + ch;
            
[/INDENT]
[INDENT]}
[/INDENT]
   }

}

  
var 
    timer1 = 0,
    timer2 = 0,
    timer3 = 0,
    startTime;
    
startTime = new Date();
app.doScript(myFunc,
                       ScriptLanguage.javascript,
                       undefined,
                       UndoModes.SCRIPT_REQUEST); // пошаговый откат (как при обычной работе)
timer1 += new Date().getTime() - startTime.getTime();
alert(timer1);

startTime = new Date();
app.doScript(myFunc,
                   ScriptLanguage.javascript,
                   undefined,
                   UndoModes.ENTIRE_SCRIPT, // защищенный режим, с откатом к началу выполнения myFunc
                  "myFunc_Entire");
timer2 += new Date().getTime() - startTime.getTime();
alert(timer2);
    
startTime = new Date();
app.doScript(myFunc,
                       ScriptLanguage.javascript,
                       undefined,
                       UndoModes.FAST_ENTIRE_SCRIPT, // незащищенный режим, то же, что и UndoModes.ENTIRE_SCRIPT, но в случае краха скрипта откат будет невозможен
                       "myFastFunc");
timer3 += new Date().getTime() - startTime.getTime();
alert(timer3);
 

svlasov

Администратор
20 лет на форуме
Сообщения
2 228
Реакции
4 933
Ответ: Медленный перебор клеток - как ускорить?


Не по теме:
Такое ощущение, что центр скриптописания под Индизайн плавно переместился из Сибири (Кемерово-Красноярск) в Харьков :).
 

PICC

Участник
Топикстартер
Сообщения
16
Реакции
0
Ответ: Медленный перебор клеток - как ускорить?

Код:
...
app.doScript(myFunc,
                   ScriptLanguage.javascript,
                   undefined,
                   UndoModes.ENTIRE_SCRIPT, // защищенный режим, с откатом к началу выполнения myFunc
                  "myFunc_Entire");
...

У меня на этот код в InDesign CS3 выдается ошибка: "Error mode 2. Error String: UndoModes if undefined" .
В чем загвоздка?

Такое ощущение, что центр скриптописания под Индизайн плавно переместился из Сибири (Кемерово-Красноярск) в Харьков
'pif-paf'
 

Nano

Участник
Сообщения
47
Реакции
100
Ответ: Медленный перебор клеток - как ускорить?

Увеличить производительность скрипта можно еще, если запускать его при помощи Application.doScript с указанием UndoModes.ENTIRE_SCRIPT или UndoModes.FAST_ENTIRE_SCRIPT

Классно, спасибо! Жаль только что первый способ оказался самым быстрым:-

Впрочем, он быстрее простого вызова функции примерно на 10%

Интересно было бы сравнить быстродействие одного и того же алгоритма, реализованного как 1) VBA, 2) JS, 3) плагин C++. Я лично не сомневаюсь в том, что 1) медленнее 2), 2) медленнее 3), но интересно бы это увидеть в цифрах.

Можно примерно судить о скорости по результатам примеров #16 (выполняется около 10 с) #17 (выполняется 1 с). СРР быстрее скриптовых решений примерно в 1000 раз. VBA (движок Windows Script Host) и JS (ExtendScript) покажут примерно одинаковые результаты. Они оба основаны на межпрограмном взаимодействии, которое и является "бутылочным горлышком" в скорости исполнения.
 

Nano

Участник
Сообщения
47
Реакции
100
Ответ: Медленный перебор клеток - как ускорить?

Ой нет, я был неправ. Сейчас сделал таблицу побольше в результате вызов №3 быстрее до 40%
 

PICC

Участник
Топикстартер
Сообщения
16
Реакции
0
Ответ: Медленный перебор клеток - как ускорить?

СРР быстрее скриптовых решений примерно в 1000 раз.
Пунятно... Значит, если я хочу писать качественные скрипты, то забиваем на JS и учимся взаимодействию программы на С++ и InDesign... Вот только программу на JS 1) написать, 2) отладить быстрее, чем оную же на С++ :( ...
 
Статус
Закрыто для дальнейших ответов.