GNU параллельно
Я делал синтетический тест для компиляции и не мог потрудиться написать Makefile, поэтому я использовал:
sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"
Пояснение:
{.}
принимает входной аргумент и удаляет его расширение
-t
распечатывает команды, которые запускаются, чтобы дать нам представление о прогрессе
--will-cite
удаляет запрос на цитирование программного обеспечения, если вы публикуете результаты, используя его ...
parallel
настолько удобно, что я даже сам могу проверить метку времени:
ls | grep -E '\.c$' | parallel -t --will-cite "\
if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
gcc -c -o '{.}.o' '{}'
fi
"
xargs -P
также может запускать задания параллельно, но немного менее удобно выполнять с ним расширение или запускать несколько команд: Вызов нескольких команд через xargs
Параллельное связывание было задано по адресу: Может ли gcc использовать несколько ядер при связывании?
TODO: Мне кажется, я где-то читал, что компиляция может быть сведена к умножению матриц, поэтому, возможно, можно также ускорить компиляцию одного файла для больших файлов. Но я не могу найти ссылку сейчас.
Протестировано в Ubuntu 18.10.