Clojure (или JCE, или JVM, или…? )автоматически ввести параллелизм?

. Я запускаю код Clojure с интенсивным использованием процессора -из Intellij Idea (Я не думаю, что это важно -кажется, что он просто порождает процесс ). По данным htop и top, он использует все 4 ядра (ну, 2 + гиперпоточность )на моем ноутбуке. И это несмотря на то, что у меня нет явного параллелизма в коде.

Немного подробнее :top показывает один процесс с ~380% использованием ЦП, в то время как htop показывает «родительский» процесс, а затем 4 «дочерних», каждый с 1/4 времени и ~100% ЦП.

Это нормально? Или это означает, что я где-то что-то очень неправильно? Код включает множество ленивых последовательностей, но по своей сути модифицирует изменяемую структуру данных (изменяемую -не Clojure структуру данных -хеш, который накапливает результаты ). Я не использую никакого явного параллелизма.

Вероятно, значительное количество времени (я не профилировал )провел в JCA/JCE (криптографической библиотеке)-Я использую несколько шифров AES в режиме CTR, каждый из которых представляет собой поток безопасных случайных байтов (. код здесь), реализованный как ленивые последовательности. Может, это распараллелено?

Больше случайных идей :Может ли это быть связано с IO? Я работаю на зашифрованном SSD, и эта программа обрабатывает данные с диска, поэтому много читает. Но htop показывает системное время красным, а это зеленым.

Извините за такой расплывчатый вопрос. Я могу опубликовать больше информации, если требуется. Это Clojure 1.4 на 64-битном Linux (JDK 1.7.0 _05 ). Выполняемый код здесь , но он довольно беспорядочный (дополнительные извинения )и разбросан по разным файлам (большая часть процессорного времени тратится в nearest-in-dumpв коде там ). Примечание -, пожалуйста, не тратьте время на попытки запустить код для воспроизведения, так как он ожидает, что предварительный -дамп существующих данных -будет на диске (, которого нет в git ).

отладчик Запуск в отладчике (спасибо, А -М )показывает четыре потока (, если я правильно понимаю отладчик ), но только один выполняет программу. Они помечены как финализатор, основная (, программа ), обработчик ссылок и диспетчер сигналов. Обработчик Finalizer + ref находится в состоянии ожидания; диспетчер сигналов не имеет доступных кадров. Я предварительно думаю, что это означает, что параллелизм находится на более низком уровне, возможно, в криптографической реализации?

Ага Думаю, это параллельный сборщик мусора (В Java теперь есть параллельный сборщик ). В начале загрузка ЦП резко возрастает, когда фактический процесс приостанавливается (, он печатает обычный тик ). А так как он перерабатывает большое количество данных, он генерирует множество короткоживущих -объектов (, что подтверждается использованием -XX :+UseSerialGC, что снижает использование ЦП до 100%)

5
задан andrew cooke 7 July 2012 в 14:22
поделиться