Có nhiều tính toán hơn tốc độ CPU và số lõi có sẵn: băng thông đĩa và băng thông bộ nhớ rất quan trọng.
Trong trường hợp của bạn, tôi tưởng tượng rằng mỗi CPU HT anh chị em nhận được khoảng 4 quy trình để thực thi. Khi nó bắt đầu một, nó chặn trên đĩa IO và chuyển sang quá trình tiếp theo. Người thứ hai cố gắng mở một tập tin thứ hai, chặn trên đĩa IO, và anh chị em chuyển sang tiến trình tiếp theo. Bắt đầu từ bốn trình biên dịch trước khi đĩa IO đầu tiên sẵn sàng sẽ không làm tôi ngạc nhiên.
Vì vậy, khi người đầu tiên cuối cùng đọc trong nguồn chương trình, trình biên dịch phải bắt đầu tìm kiếm thông qua các thư mục để tìm các tệp #included. Mỗi một yêu cầu một số cuộc gọi mở() được theo sau bởi các cuộc gọi read(), tất cả đều có thể chặn, và tất cả đều sẽ từ bỏ anh chị em cho các tiến trình khác để chạy.
Bây giờ nhân với tám anh chị em - mỗi lõi HT sẽ chạy cho đến khi nó chặn truy cập bộ nhớ, tại thời điểm đó nó sẽ chuyển sang người anh em khác, và chạy một lúc. Khi bộ nhớ của anh chị em đầu tiên đã được tìm nạp vào bộ nhớ cache, có lẽ là thời gian để anh chị em thứ hai đứng yên trong khi đợi bộ nhớ.
Có giới hạn trên về số lần biên dịch của bạn chạy nhanh hơn bằng cách sử dụng make -j
, nhưng hai lần-số-cpus đã là điểm khởi đầu tốt cho tôi trong quá khứ.