Способы сделать D программу быстрее - PullRequest
3 голосов
/ 18 октября 2019

Я работаю над очень требовательным проектом (на самом деле переводчиком), написанным исключительно на D, и мне интересно, какой тип оптимизации вообще рекомендуется. В проекте интенсивно используются GC, классы, ассоциативные массивы и многое другое.

Что касается компиляции, я уже экспериментировал как с флагами DMD и LDC, так и с LDC с -flto=full -O3 -Os -boundscheck=off, похоже, что-то меняет. . 1004(Я уверен, что мне не хватает нескольких вещей).

1 Ответ

3 голосов
/ 18 октября 2019
  • Флаги компилятора: я бы добавил -mcpu=native, если программа будет работать на вашем компьютере. Не уверен, какой эффект -Os имеет в дополнение к -O3.

  • Профилирование было упомянуто в комментариях. Лично в Linux у меня есть скрипт, который выводит трассировку стека процесса, и я делаю это несколько раз, чтобы понять, где он зависает.

  • Не уверен, что вы подразумеваете подGS.

  • Поскольку вы упомянули классы: в D методы по умолчанию являются виртуальными;виртуальные методы добавляют косвенные ссылки и не являются встроенными. Убедитесь, что только те методы, которые должны быть виртуальными. Посмотрите, можете ли вы переписать вашу программу, используя форму полиморфизма, в которой нет косвенных указаний, например, использование шаблонного метапрограммирования.

  • Поскольку вы упомянули ассоциативные массивы: они интенсивно используют GC;чтобы ускорить их, переключитесь на стороннюю библиотеку, которая работает поверх std.allocator, такую ​​как https://github.com/dlang-community/containers

  • Если некоторые части вашего кода распараллеливаются, std.parallelism - это хорошийинструмент для этого.

  • Поскольку вы упомянули, что проект является интерпретатором: существует множество возможностей для их оптимизации, вплоть до JIT / AOT-компиляции. Возможно, вы могли бы связать с существующей библиотекой, такой как LLVM или libjit.

...