Как измерить время перевода Xtend для каждого входного файла - PullRequest
0 голосов
/ 14 мая 2018

Я создаю приложение DSL в XTend, и мне нужно измерить время, необходимое для перевода каждого документа, который я запускаю через него.

Я использую возможности DSL для перевода одного формата данных (IFC)в другое (TTL).

Я пытался измерить его с помощью System.currentTimeMillis () в методе генератора doGenerate (myDslGenerator.xtend), но, насколько я вижу, это измеряет только времятребуется, чтобы записать выходной файл, а не время, необходимое для разбора входного файла.

Мне не нужно время, необходимое для загрузки приложения Eclipse, только фактическое время (не процессорное время), потраченноепри переводе для каждого файла.

Мой текущий (неправильный) подход дает результаты от 0 до 500 мс для задач, занимающих несколько (до 20) секунд.

doGenerate вызывается из ParallelBuilderParticipantclass (handleChangedContents method) в зависимостях Eclipse, но я не могу отследить его дальше, чтобы найти, откуда это вызывается.Но, может быть, этот метод на самом деле также включает в себя синтаксический анализ (Resource resource = contect.resource)?

Любое понимание было бы здорово - спасибо 101

РЕДАКТИРОВАТЬ: Попытка разместить здесь больше информации - надеюсьэто полезно.

Functional Eclipse code

Измерение времени выполнения метода doGenerate дает мне время, необходимое для написания файла ".ttl", но времячтение файла «.ifc» не является его частью, так как он был проанализирован до вызова метода doGenerate.Метод doGenerate является частью шаблона XTend и происходит от AbstractGenerator.

Выполняя поиск использования в проекте, я вижу, что метод doGenerate вызывается из класса ParallelBuilderParticipant.

Dependency: ParallelBuilderParticipant.handeChangedContents

Смогу ли я найти полное время, необходимое для синтаксического анализа одного файла и записи другого, если вместо этого я буду измерять время этого класса?И если да, то как мне это сделать, поскольку это файл зависимостей .class - Eclipse не позволяет мне его редактировать.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я нашел решение, которое достаточно подходит для того, что мне нужно, и, поскольку я потратил много времени на поиск решения в Интернете и почти столько же времени на его создание, я решил поделиться им.

Возможно, было неясно, что я использую предварительно собранную версию Xtend с Eclipse Oxygen. Чтобы измерить время, необходимое для анализа файла и записи результата, я подключил лексер (InternalIfcBrickLexer.java) в пакете antlr (org.xtext.ifcbrickconvert.parser.antlr.internal). В конструкторе InternalIfcBrickLexer (вход CharStream) я распечатал System.currentTimeMillis () на консоль. Лексер запускается как первый процесс в ряде случаев, в том числе при сохранении.

В генераторе (IfcBrickGenerator.xtend) я переопределяю метод интерфейса void afterGenerate (Ввод ресурсов, ...) и снова печатаю System.currentTimeMillis.

Чтобы избежать вычислений, я сделал статическую переменную в лексере и вычел ее из текущего времени в методе afterGenerate, и теперь у меня есть время, необходимое для того, чтобы lex, разобрать, перевести и записать новый файл в миллисекундах. .

Там может быть небольшая неточность, так как я не знаю, можно ли что-то вызывать перед лексером, но это кажется довольно точным из моих первоначальных тестов, и так как файлы, с которыми я работаю, занимают где-то от 20 - 2000 секунд до В завершение пару сотен миллисекунд не имеют большого значения.

Единственным недостатком этого метода является то, что ему нужно запускать только один файл - после сохранения файла и начала обработки вы не можете изменять какой-либо файл - даже без сохранения - или вы не получите правильный результат. Это, однако, то, что я ожидал / хотел, так что это не проблема для меня.

Спасибо за вклад - надеюсь, кто-то найдет это полезным:)

0 голосов
/ 14 мая 2018

Прежде всего, я предполагаю, что вы имели в виду, что вы создали DSL в Xtext с генератором кода, написанным на Xtend, и вы хотите знать, сколько времени занимает перевод "программы", написанной с использованием вашего DSL, во все, что вы генерируете в .

Я не уверен, что Xtext имеет встроенную поддержку для этого. Поскольку вы уже можете измерить время, используемое для записи выходных файлов, я бы посоветовал измерять с «начальной точки» компиляции. Я предполагаю, что Xtext по умолчанию запускает его автоматически при сохранении, чтобы вы могли попробовать и посмотреть, можете ли вы установить собственный хук рядом с ним.

...