Рассмотрим следующую оболочку script:
gzip -dc in.gz | sed -e 's/@/_at_/g' | gzip -c > out.gz
Это три процесса, которые работают параллельно, чтобы распаковать поток, изменить его и повторно сжать. Запуск time
Я вижу, что мое пользовательское время примерно в два раза больше моего реального времени, что указывает на то, что программа эффективно работает параллельно.
Я попытался создать ту же самую программу на Java, поставив каждую задачу в ее собственный поток. К сожалению, многопоточная Java-программа только на 30% быстрее, чем однопоточная для вышеуказанного образца. Я пробовал использовать Exchanger и ConcurrentLinkedQueue. Связанная с ConcurrentLinkedQueue очередь вызывает много конфликтов, хотя все три потока, как правило, остаются занятыми. Обменник имеет более низкую конкуренцию, но более сложный, и, похоже, он не удерживает самого медленного рабочего в 100% случаев.
Я пытаюсь разобраться в чистом решении Java для этой проблемы, не глядя на одну из фреймворков с байтовым кодом или на MPI на основе JNI.
Большинство исследований и API concurrency относятся к алгоритмам divide-and-conquer, предоставляя каждой работе node, которая является ортогональной и не зависит от предыдущих вычислений. Другим подходом к concurrency является подход к трубопроводу, где каждый работник выполняет некоторую работу и передает данные следующему работнику.
Я не пытаюсь найти наиболее эффективный способ sed gzip'd файла, но я смотрю, как эффективно разрушать задачи в конвейере, чтобы сократить время выполнения до самого медленного задача.
Текущие тайминги для файла линии 10 м следующие:
Testing via shell
real 0m31.848s
user 0m58.946s
sys 0m1.694s
Testing SerialTest
real 0m59.997s
user 0m59.263s
sys 0m1.121s
Testing ParallelExchangerTest
real 0m41.573s
user 1m3.436s
sys 0m1.830s
Testing ConcurrentQueueTest
real 0m44.626s
user 1m24.231s
sys 0m10.856s
Я предлагаю щедрость для 10% -ного улучшения Java, измеряемого в реальном времени в четырехъядерной системе с 10-метровыми рядами тестовых данных. Текущие источники доступны на Bitbucket.