Встраивание после разбора параметров для оптимизации скорости алгоритма - PullRequest
0 голосов
/ 01 мая 2018

Допустим, вам нужно реализовать очень быстрый алгоритм для решения какой-то проблемы, он может зависеть от набора параметров, которые вы будете загружать в память из какого-либо источника данных. Допустим, эти параметры будут работать как константы после того, как они были проанализированы (но все еще зависят от проблемы). Если бы эти константы были известны с самого начала и записаны явно в исходном коде, я бы ожидал, что компилятор встроит их, что может дать хорошие улучшения скорости, если к этим параметрам часто обращаются вблизи узкого места. Однако, если они будут проанализированы программой из внешнего источника после ее компиляции, они, как правило, не будут встроены, даже если вы наделите свой объект конечными переменными. Я предполагаю, что хитрость может заключаться в том, чтобы хранить копию эффективного объекта для каждого набора значений, где каждый набор значений записан явно в коде. Тогда можно было бы использовать соответствующий объект. Но это будет дорогостоящей памятью, и код будет расти в геометрической прогрессии. Другая идея может заключаться в динамической компиляции кода после анализа набора параметров.

Мой вопрос: есть ли что-то, что когда-либо было разработано для элегантного решения этой проблемы, более конкретно в Java / C ++.

1 Ответ

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

В Java, используя JDK, вы можете сделать следующее:

  1. Чтение констант
  2. Напишите класс, который содержит ваш код таким образом, чтобы вы печатали набор параметров в виде final static public членов класса. Затем добавьте код для вашего алгоритма (который есть где-то в строке).
  3. Скомпилируйте это с помощью внутреннего JDK-компилятора (возможна компиляция памяти в память)
  4. Загрузите полученный класс и запустите его с использованием некоторого статического метода. Или создайте экземпляр класса и работайте с ним.

Это работает, потому что компилятор Java обрабатывает final static переменные как неизменяемые константы.

Делает ли это ваш код действительно быстрее? Я сомневаюсь. Чтобы этот метод приносил пользу, он должен работать достаточно долго, чтобы компенсировать 2-3 секунды, необходимые для компиляции, загрузки классов и т. Д.

...