Алгоритм параллельного Диксона в Java - PullRequest
0 голосов
/ 31 октября 2011

Я пытался одновременно реализовать алгоритм Диксона с плохими результатами. Для небольших чисел <~ 40 бит он работает примерно вдвое быстрее, чем другие реализации в моем классе, и после примерно 40 бит занимает гораздо больше времени. </p>

Я сделал все, что мог, но боюсь, у него есть какая-то фатальная проблема, которую я не могу найти.

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

1 Ответ

0 голосов
/ 31 октября 2011

Почему вы думаете, что это будет быстрее? Раскручивание потока и добавление синхронизированных вызовов - ОГРОМНАЯ синхронизация времени. Если вы не можете избежать синхронизированного ключевого слова, я настоятельно рекомендую однопоточное решение.

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

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

  • Статические методы не помогали над реальными экземплярами классов.
  • Разбиение кода на более мелкие классы и методы на самом деле ПОВЫШЕННОЙ скоростью.
  • Финальные методы помогли больше, чем я думал, что они будут
  • Однажды я заметил, что добавление вызова метода помогло ускорить процесс
  • Не акцентируйте внимание на одноразовом распределении классов или распределении данных, но избегайте выделения объектов в циклах (это очевидно, но я думаю, что это наиболее важно)

Что мне удалось понять, так это то, что компилятор чрезвычайно умен в оптимизации и настроен на оптимизацию «идеального» Java-кода. Статические методы далеко не идеальны - они являются своего рода контр-паттерном .. одним из самых.

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

...