Я читал, например, в Java Concurrency in Practice, что «программа с одним потоком может работать не более одного процессора за раз».Один поток java использует оба ядра на Mac?
Однако, если я запускаю однопоточный Java-класс на своем Intel Core 2 Duo Macbook Pro с частотой 2,5 ГГц, я могу видеть (в Activity Monitor), что использование ЦП увеличивается с 0 до 60% на ядрах BOTH ,
Является ли Mac OS каким-то образом переключает поток от одного ядра к другому, и если да, то почему?
Спасибо! Вот код ..
public class PrimeCalculator {
public static void findPrimes (int start, int end){
int countPrimes = 0;
for (int i=start; i<end; i++){
if (i % 1000000 == 0){
System.out.println("Did a million..");
}
boolean found = true;
for (int check = 2; check <= Math.sqrt(i); check++){
if (i % check == 0){
found = false;
break;
}
}
if (found == true){
//System.out.println(i);
countPrimes++;
}
}
System.out.println("I counted "+countPrimes+" primes");
}
public static void main(String[] args){
findPrimes(0,100000000);
}
}
Я бы оптимизировал 'Math.sqrt (i)', чтобы сохранить его на каждой итерации. Скорее всего, что нить переключается между ядрами (используя 50% или каждый), и есть немного дополнительной работы на машине, доведя ее до 60%. –
Спасибо за ваш комментарий, Питер. Мой вопрос более простой, чем ваш комментарий. Я просто спрашиваю, почему Mac не запускает этот поток на одном ядре? (Программа - это просто демоверсия, показывающая, что она становится разделенной на две части). Если она действительно способна распределить нагрузку на две части, то почему в книгах с параллелизмом говорится, что вам нужно несколько потоков для распространения нагрузки на обработку? – Bruce
Он работает на 100% на одном ядре, а затем 100% на другом ядре, составляющем в среднем 50% на каждом. (60% с некоторыми накладными расходами) Чтобы использовать оба ядра одновременно, а не только со временем, вам нужно несколько потоков. –