[Nemerle] Компилятор, последовательная сборка
От: Алексей П Россия  
Дата: 27.01.07 08:52
Оценка:
Я в целях упрощения и ускорения сборки проекта на N написал небольшую make-подобную утилиту, которая использует API компилятора — не выгружая его сборки, производит последовательную компиляцию нескольких сборок проекта. На маленьких скорость достигает 3 в секунду. Скорее всего, если дать компилятору не выгружать библиотеки между билдами, скорость можно поднять ещё. Но в соответствующем режиме (PersistentLibraries = true) между этими самыми билдами нельзя менять ReferencedLibraries — то есть менять-то можно, но это ничего не дает.

Нельзя ли сделать так, чтобы в этом режиме подгружались ранее не использованные (только что собранные) dll-ки?

В принципе, если интересно, утилитой могу поделиться — она прекрасно прикручивается к SciTE.

P.S. Что-то в последнее время в decl стало много тем про N, не пора ли всё-таки выделить соответствующий форум...

30.01.07 17:51: Перенесено модератором из 'Декларативное программирование' — IT
Re: [Nemerle] Компилятор, последовательная сборка
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 10:35
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Я в целях упрощения и ускорения сборки проекта на N написал небольшую make-подобную утилиту, которая использует API компилятора — не выгружая его сборки, производит последовательную компиляцию нескольких сборок проекта.


Во как? А зачем же так сурово?
Проще было создать измененную версию:
http://nemerle.org/svn/nemerle/trunk/tools/msbuild-task/MSBuildTask.n
так чтобы она не использовал ncc.exe, а пользовалась API компилятора напрямую.

АП> На маленьких скорость достигает 3 в секунду.


Хм. 3 секунды — это очень много. После pre-JIT-а компиляторых сборок у меня где-то до 3 секунд (а то и быстрее) собирается проект Интеграции со судией.

Проблема только в том, что такой подход будет блокировать сборки. Ведь компилятор вынужден подлючать их чтобы считать информацию о типах.

АП> Скорее всего, если дать компилятору не выгружать библиотеки между билдами, скорость можно поднять ещё. Но в соответствующем режиме (PersistentLibraries = true) между этими самыми билдами нельзя менять ReferencedLibraries — то есть менять-то можно, но это ничего не дает.


Да, вроде бы это есть. Мы используем кэширование в Интеграции. Незнаю насклько только это прокатит на несколько проектов.

АП>Нельзя ли сделать так, чтобы в этом режиме подгружались ранее не использованные (только что собранные) dll-ки?


Не понял.

АП>P.S. Что-то в последнее время в decl стало много тем про N, не пора ли всё-таки выделить соответствующий форум...


Посмотрим. Если интерес будет постоянным, или будет возрастать, то перенесем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Nemerle] Компилятор, последовательная сборка
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 27.01.07 11:18
Оценка:
Алексей П,

АП>P.S. Что-то в последнее время в decl стало много тем про N, не пора ли всё-таки выделить соответствующий форум...


Да, да, сообщения связанные с N засоряют весь форум, давайте скорее выделять.

Думаю мы имеем дело просто с локальным всплеском.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: [Nemerle] Компилятор, последовательная сборка
От: raskin Россия  
Дата: 27.01.07 13:23
Оценка: +1
VladD2 wrote:
> АП> На маленьких скорость достигает 3 в секунду.
>
> Хм. 3 секунды — это очень много. После pre-JIT-а компиляторых сборок у
> меня где-то до 3 секунд (а то и быстрее) собирается проект Интеграции со
> судией.


3 шт/с — это не 3 с/шт. Вполне терпимо для начала.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: [Nemerle] Компилятор, последовательная сборка
От: Алексей П Россия  
Дата: 27.01.07 17:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Во как? А зачем же так сурово?

VD>Проще было создать измененную версию:
VD>http://nemerle.org/svn/nemerle/trunk/tools/msbuild-task/MSBuildTask.n
VD>так чтобы она не использовал ncc.exe, а пользовалась API компилятора напрямую.

Да ну его, этот мсбилд. У меня проще получилось.

VD>Проблема только в том, что такой подход будет блокировать сборки. Ведь компилятор вынужден подлючать их чтобы считать информацию о типах.


Чего?

АП>>Нельзя ли сделать так, чтобы в этом режиме подгружались ранее не использованные (только что собранные) dll-ки?


VD>Не понял.


Компилирую одну сборку, пусть с макросами, а потом ее подгружаю и с ее помощью компилирую следующую. Вот чтобы так.
Re[3]: [Nemerle] Компилятор, последовательная сборка
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 18:20
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Да ну его, этот мсбилд. У меня проще получилось.


MSBuild — это стандарт. И он исползоуется в VS 2005. Так что ты сразу бы ускорил компиляцию и внутри VS, и ускорил бы сборку компилятора стандартными бат-никами.

VD>>Проблема только в том, что такой подход будет блокировать сборки. Ведь компилятор вынужден подлючать их чтобы считать информацию о типах.


АП>Чего?


Компилятор грузит сборки стандартным образом. Таким обрзом если ты работаешь с двумя сборками, и вторая использует первую (ссылается на нее), то после компиляции второй сборки ты не сможешь повторно скомпилировать первую, так как сборка будте заблокирована.

АП>Компилирую одну сборку, пусть с макросами, а потом ее подгружаю и с ее помощью компилирую следующую. Вот чтобы так.


А в чем проблема? Это должно работать. Только как я уже сказал будут блокировки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] Компилятор, последовательная сборка
От: Алексей П Россия  
Дата: 27.01.07 19:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>MSBuild — это стандарт. И он исползоуется в VS 2005. Так что ты сразу бы ускорил компиляцию и внутри VS, и ускорил бы сборку компилятора стандартными бат-никами.


Вообще идея. Может и сделаю.

VD>Компилятор грузит сборки стандартным образом. Таким обрзом если ты работаешь с двумя сборками, и вторая использует первую (ссылается на нее), то после компиляции второй сборки ты не сможешь повторно скомпилировать первую, так как сборка будте заблокирована.


Ну это какой-то сложный случай, зачем может понадобиться одну сборку пересобирать два раза за один цикл сборки проекта?

АП>>Компилирую одну сборку, пусть с макросами, а потом ее подгружаю и с ее помощью компилирую следующую. Вот чтобы так.


VD>А в чем проблема? Это должно работать. Только как я уже сказал будут блокировки.


Да нет, не работает. Потому что в ManagerClass.LoadExternalLibraries() написано это:
if (shouldCreate (InternalType.Void)) {
    ... // загрузка всего
}
else // We use LibrariesManager repeatedly.
    LibrariesManager.RemoveInternalExtensionMethods();

То есть при последующих компиляциях состояние LibrariesManager в нужную сторону не меняется.
Re[5]: [Nemerle] Компилятор, последовательная сборка
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 21:01
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Ну это какой-то сложный случай, зачем может понадобиться одну сборку пересобирать два раза за один цикл сборки проекта?


Почему за одни? В той же студии можно делать сколько угодно сборок.

АП>Да нет, не работает. Потому что в ManagerClass.LoadExternalLibraries() написано это:

АП>
АП>if (shouldCreate (InternalType.Void)) {
АП>    ... // загрузка всего
АП>}
АП>else // We use LibrariesManager repeatedly.
АП>    LibrariesManager.RemoveInternalExtensionMethods();
АП>

АП>То есть при последующих компиляциях состояние LibrariesManager в нужную сторону не меняется.

Это как раз код кэширования.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] Компилятор, последовательная сборка
От: Алексей П Россия  
Дата: 27.01.07 21:21
Оценка:
Здравствуйте, VladD2, Вы писали:

АП>>Ну это какой-то сложный случай, зачем может понадобиться одну сборку пересобирать два раза за один цикл сборки проекта?


VD>Почему за одни? В той же студии можно делать сколько угодно сборок.


Ну вот, значит прийдется ловить какое-то событие вроде "начата сборка проекта" и сбрасывать кэш по нему. Я не знаю, есть ли такое событие, но если нет, можно попробовать ловить по истории сборки — например, если пытаемяся второй раз что-то собрать, значит надо сбросить.
У меня в утилите таких проблем просто нет, т.к. она command-line only. Для SciTE — определяет, что пересобрать, по имени файла.

АП>>Да нет, не работает. Потому что в ManagerClass.LoadExternalLibraries() написано это:

АП>>
АП>>if (shouldCreate (InternalType.Void)) {
АП>>    ... // загрузка всего
АП>>}
АП>>else // We use LibrariesManager repeatedly.
АП>>    LibrariesManager.RemoveInternalExtensionMethods();
АП>>

АП>>То есть при последующих компиляциях состояние LibrariesManager в нужную сторону не меняется.

VD>Это как раз код кэширования.


Ага, вот еще бы при этом кэшировании в LibrariesManager добавлять сборки, которых не было в списке при его предыдущем использовании.
Re[7]: [Nemerle] Компилятор, последовательная сборка
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.01.07 10:30
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Ну вот, значит прийдется ловить какое-то событие вроде "начата сборка проекта" и сбрасывать кэш по нему. Я не знаю, есть ли такое событие, но если нет, можно попробовать ловить по истории сборки — например, если пытаемяся второй раз что-то собрать, значит надо сбросить.


Компилятор в нашем распоряжении. Так что событие прикрутим. Это не проблема.
Проблема в блокировках. Прийдется писать код ручной загрузки сборок (через массивы байтов). Это сразу вызовет проблему разрешения типов, так как для загруженных таким образом сборок дотнрет не производит разрешение имен.

Мы еже говорили об всем этом с компиляторщиками, они даже выделели этот код в виртуальные методы.

АП>У меня в утилите таких проблем просто нет, т.к. она command-line only. Для SciTE — определяет, что пересобрать, по имени файла.


Понятно. В МСБилдовском таске тоже пока таких проблем нет, но только потому, что он использует компилятор командной строки. Ну, а это замедляет процесс компиляции.
Причем если обычные проекты замедляются не так сильно, ведь компилятор при этом приджитнут, то компиляция кода компилятора тормозится очень сильно, так как каждый проект вызвает джит-компляцию компилятора. По моим наблюдениям на маленьких проектах время джита составляет 97% от времени работы компилятора. Я вот даже подумываю не сделать ли возможность использовать преджитнутый компилятор для сборки компилятора.

АП>Ага, вот еще бы при этом кэшировании в LibrariesManager добавлять сборки, которых не было в списке при его предыдущем использовании.


Дык, все в наших руках.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.