Виртуальная машина для C ++ для оптимизации производительности - PullRequest
5 голосов
/ 29 февраля 2012

Аргумент в пользу JIT-языков, таких как C # и Java, заключается в том, что они могут выполнять оптимизацию лучше, поскольку профилирование во время выполнения на виртуальной машине может оптимизировать код лучше, чем статически оптимизированный код C ++.

Однако мне было интересно, можем ли мы также использовать виртуальную машину для оптимизации кода во время выполнения для C ++ или, скорее, любого подобного языка. Например, мы могли бы взять IR, сгенерированный компилятором LLVM, и создать виртуальную машину, которая интерпретирует, JIT и оптимизирует код, так же, как в случае Java и C #.

Конечно, не было бы сборки мусора, но там был бы фактор оптимизации. Кто-нибудь работал над этим. Есть ли какие-нибудь документы, инструменты на это? Насколько хорош этот подход?

Ответы [ 3 ]

7 голосов
/ 01 марта 2012

Это ошибочный аргумент.Да, виртуальные машины имеют больше информации для работы, но они также имеют значительно меньше времени и пространства по сравнению с компиляторами.

Кроме того, да, вы можете сделать это, если действительно хотите.Но никто не делает, так что обычно это не происходит.По крайней мере, не из соображений оптимизации, вы можете сделать это для песочницы.

4 голосов
/ 01 марта 2012

LLVM включает в себя JIT-компилятор, lli, и Clang уже может создавать битовый код из C ++. Я не пробовал, но я предполагаю, что вы можете затем использовать lli для созданных файлов битового кода (вам, возможно, придется указать, где найти файлы C ++ lib для линковки) и JIT C ++ во время выполнения. Вы даже должны иметь возможность собрать libc ++ как битовый код, чтобы он также мог быть JIT-файлом.

У нативного клиента Google есть подпроект Portable Native Client, в котором, я думаю, LLVM IR отправляется клиенту, а не двоичным файлам x86, для подключения к клиенту.

2 голосов
/ 01 марта 2012

Теоретически, да, JIT может быть сделан для C ++. Для агрессивной оптимизации кода могут использоваться некоторые преимущества базовой архитектуры. Это также может привести к тому, что приложение будет загружаться во время выполнения дольше.

Конечно, не было бы сборки мусора и поэтому накладные расходы из-за этого, но фактор оптимизации будет там. имеет кто-нибудь работал над этим. Есть ли какие-нибудь документы, инструменты на это? Как хорошо будет ли такой подход?

Большое заблуждение здесь. Внедрение GC по всем направлениям для каждого определенного пользователем типа является большой накладной нагрузкой Это одна из причин, по которой Android, iOS и Windows Mobile обратились к C / C ++ для высокопроизводительных приложений, несмотря на то, что изначально пытались использовать только управляемые виртуальные машины.

Конечно, дополнительный уровень косвенности означает, что GC может свободно делать такие вещи, как компактная память, но оптимизированная программа C / C ++ уже с самого начала будет работать с уплотненной памятью. Это также означало бы, что память изначально более фрагментирована, что является фактором, снижающим производительность, для высокопроизводительных приложений, в которых хорошо работает C ++ (например, для работы с большими непрерывными буферами, например, такими как обработка видео, трассировка лучей или аудио). обработка).

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

Тем не менее, чтобы понять суть вашего вопроса, конечно, код C ++ может быть построен с использованием JIT, но вы можете обнаружить, что на самом деле нет таких убедительных причин делать это, учитывая такие вещи, как статичность, в которой люди обычно работают с кодом C ++.

...