Языки и VMs: Функции, которые трудно оптимизировать и почему

Я делаю обзор функций при подготовке к исследовательскому проекту.

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

Вершина в моем списке трудно для оптимизации функций и моих теорий (некоторые мои теории не тестируются и основаны на мысленных экспериментах):

1) Перегрузка метода во время выполнения (иначе отправка мультиметода или основанная на подписи отправка). Трудно оптимизировать в сочетании с функциями, которые позволяют перекомпиляцию во время выполнения или дополнение метода. Или это просто трудно, так или иначе? Звоните кэширование сайта является общей оптимизацией для многих систем во время выполнения, но мультиметоды добавляют дополнительную сложность, а также создание его менее практичный для встраивания методов.

2) Введите превращение / варианты (иначе основанный на значении ввод в противоположность базирующейся переменной), Традиционная оптимизация просто не может быть применена, когда Вы не знаете, может ли тип чего-то измениться в базисном блоке. Объединенный с мультиметодами, встраивание должно быть сделано тщательно если вообще, и вероятно только для данного порога размера вызываемого. т.е. легко рассмотреть встраивающие простые выборки свойства (методы считывания / методы set), но встраивание сложных методов может привести к чрезмерному увеличению размера кода. Другая проблема, я не могу только присвоить вариант регистру и JIT она к собственным инструкциям, потому что я должен нести вокруг информации о типе, или каждой переменной нужны 2 регистра вместо 1. На IA-32 это неудобно, даже если улучшенный с дополнительными регистрами x64. Это - вероятно, моя любимая функция динамических языков, поскольку она упрощает столько вещей с точки зрения программиста.

3) Продолжения первого класса - существуют несколько способов реализовать их, и я сделал так в обоих из наиболее распространенных подходов, при этом один было копирование стека и другой как реализация времени выполнения для использования стиля передачи продолжения, стопок кактуса, стековых фреймов копии на записи и сборки "мусора". Продолжения первого класса имеют проблемы управления ресурсами, т.е. мы должны сохранить все, в случае, если продолжение возобновляется, и я не знаю, если любая поддержка языков, оставляя продолжение с "намерением" (т.е. "Я не возвращаюсь сюда, таким образом, можно отбросить эту копию мира"). Запрограммировав в модели потоков и contination модели, я знаю и могу выполнить то же самое, но элегантность продолжений налагает значительную сложность на время выполнения и также может влиять на кэш efficienty (местность стека изменяется больше с использованием продолжений и сопрограмм). Другая проблема, они просто не отображаются на аппаратные средства. Оптимизация продолжений оптимизирует для меньшего-количества-общего-падежа, и как мы знаем, общий падеж должен быть быстрым, и меньшее-количество-общие-падежи должно быть корректным.

4) Адресная арифметика с указателями и способность замаскировать указатели (хранящий в целых числах, и т.д.) Должны были добавить это, но я мог на самом деле жить без этого довольно легко.

Мои чувства состоят в том, что многие высокоуровневые функции, особенно на динамических языках просто не отображаются на аппаратные средства. Реализации микропроцессора имеют миллиарды долларов исследования позади оптимизации на микросхеме, все же выбор функции (функций) языка может маргинализовать многие из этих функций (функции как кэширование, исказив вершину стека для регистрации, параллелизм инструкции, буферы обратного адреса, буферы цикла и предсказание ветвлений). Макроприложения микрофункций не обязательно удаются как некоторые разработчики, любят думать, и реализующий много языков в VM заканчивает тем, что отобразил собственную операцию в секунду в вызовы функции (т.е. чем более динамичный язык, тем больше мы должны поиск/кэш во времени выполнения, ничто не может быть принято, таким образом, наша смесь команд составлена из более высокого процента нелокального ветвления, чем традиционный, статически скомпилированный код), и единственная вещь, мы можем действительно, JIT хорошо является вычислением выражения нединамических типов и операциями на постоянных или непосредственных типах. Именно мое инстинктивное чувство виртуальные машины байт-кода и ядра JIT, возможно, не всегда выравнивается по ширине для определенных языков из-за этого.

Я приветствую Ваши ответы.

12
задан codenheim 24 March 2010 в 23:08
поделиться

2 ответа

Пара комментариев:

  • Все языки с динамической диспетчеризацией, даже основанной на одном объекте, кажется, довольно трудно реализовать эффективно. Посмотрите на все усилия, затраченные на оптимизацию времени выполнения Self (или, в последнее время, JavaScript, с SpiderMonkey).

  • Не упускайте из виду разграниченные продолжения. Жюри еще не определилось, но их значительно легче оптимизировать, чем классические неразделенные продолжения. Прочитайте статью Гасбихлера и Спербера.

5
ответ дан 2 December 2019 в 23:19
поделиться

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

Разве IronPython не был написан для доказательства того, что виртуальная машина не может работать так же хорошо, как нативная реализация языка (Python). А затем автор IronPython был шокирован, когда узнал, что IronPython действительно хорошо работает для динамического языка на виртуальной машине с байт-кодом?

Собственная группа разработчиков .Net от Microsoft официально заявляет, что, по их мнению, в конечном итоге JITter превзойдет. «нормальный» компилятор / компоновщик (например, C / C ++).

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

1
ответ дан 2 December 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: