Сейчас на форуме: jinoweb (+6 невидимых) |
eXeL@B —› Программирование —› Сериализация вывода Pre-Jit в .NET сбоках с управляемым кодом |
Посл.ответ | Сообщение |
|
Создано: 07 декабря 2017 10:22 · Личное сообщение · #1 |
|
Создано: 07 декабря 2017 10:35 · Личное сообщение · #2 |
|
Создано: 07 декабря 2017 10:50 · Личное сообщение · #3 plutos пишет: Посмотри здесь Это описание работы Ngen. А мне интересно, как можно реализовать такую программу: Допустим есть сборка на управляемом коде. Я загружаю ее в утилитку, которая показывает мне список методов в сборке, я отмечаю галками нужные мне, и утилита компилирует их в нативный код, и помещает скомпилированный нативный код в эту же самую сборку. В результате получается, что часть методов в сборке на управляемом коде, а часть на неуправляемом. |
|
Создано: 07 декабря 2017 11:14 · Поправил: Gideon Vi · Личное сообщение · #4 Бегло пробежался, вроде оно Это если автоматом. Делать компиляцию и вручную вставлять/вызывать... ну, такое. |
|
Создано: 07 декабря 2017 11:31 · Поправил: jangle · Личное сообщение · #5 Gideon Vi пишет: вроде оно Нет, там JIT компиляция при старте приложения. А я хочу от нее вообще избавится. По нескольким причинам. JIT-компиляция отнимает время при "холодном старте", JIT-компилятор плохо оптимизирует код, JIT-не использует многие SSE инструкции и т.п. Чтобы можно было взять какой-то метод (допустим считающий FFT на непрерывно идущем потоке звуковых данных) . Получить его IL код из сборки, оттранслировать его в x86 ассемблерные инструкции (используя IL2CPU или подобный компилятор), и встроить полученный бинарник x86 обратно в управляемую сборку. И чтобы JIT больше не заходил в этот метод. |
|
Создано: 07 декабря 2017 11:42 · Личное сообщение · #6 поправьте, если не прав, .net не поддерживает asm-вставки. jangle пишет: встроить полученный бинарник x86 полученный чем? Я правильно понимаю, ты хочешь декомпилировать отдельные функции на .net, скомпилировать их и вставить обратно? Но если в итоге у тебя есть нативный код (ведь ты же собираешься компилировать декомпилированную функцию?), зачем его обратно корячить в .net? Декомпиляй тогда и остальные функции и компилируй все в native. |
|
Создано: 07 декабря 2017 11:45 · Поправил: jangle · Личное сообщение · #7 Gideon Vi пишет: полученный чем? Компилятор типа IL2CPU Я правильно понимаю, ты хочешь декомпилировать отдельные функции на .net, скомпилировать их и вставить обратно? да Декомпиляй тогда и остальные функции и компилируй все в native. К сожалению вроде нет полноценных компиляторов IL в native, которые могут скомпилировать всю сборку. Добавлено спустя 4 минуты Gideon Vi пишет: поправьте, если не прав, .net не поддерживает asm-вставки. В книге Голдштейн С., Зурбалев Д., Флатов. "Оптимизация приложений на платформе .NET." есть вот такое описание: Простейший способ выполнить произвольный машинный код в управляемом приложении (с применением легковесной программной прослойки) заключается в том, чтобы динамически сгенерировать машинный код и затем вызвать его. Ключевым здесь является метод Marshal.GetDelegateForFunctionPointer, ВОЗВращаЮЩИЙ управляемого делегата, указывающего на местоположение в неуправляемой памяти, где может храниться произвольный код. Следующий пример выделяет виртуальную память с флагом защиты execute_readwrite, позволяющим скопировать байты кода в память и затем выполнить их. Как результат, на процессоре Intel i7-860 скорость выполнения увеличивается более чем в два раза! |
|
Создано: 07 декабря 2017 11:53 · Личное сообщение · #8 |
|
Создано: 07 декабря 2017 11:57 · Поправил: jangle · Личное сообщение · #9 Gideon Vi пишет: так а пример? Code:
Добавлено спустя 38 минут Собственно вопрос как встроить неуправляемый код в управляемую сборку. Допустим у меня в проекте есть такой класс: Code:
В скомпилированной сборке мой класс становится вот таким Code:
У меня уже заготовлен байтовый массив, где находятся ассемблерные инструкции x86 для сложения двух чисел. Как мне теперь пропатчить готовую сборку и вставить в нее нативный код, чтобы она не утратила работоспособность? |
eXeL@B —› Программирование —› Сериализация вывода Pre-Jit в .NET сбоках с управляемым кодом |