Я написал код Java, чтобы узнать больше о структуре Executor.Почему этот код не видит значительного прироста производительности при использовании нескольких потоков на четырехъядерном компьютере?
В частности, я написал код для проверки Collatz Hypothesis - это говорит, что если вы итерационно применить следующую функцию в любое целое число, вы получаете 1 в конце концов:
п (п) = ((п% 2) = = 0)? n/2: 3 * n + 1
CH еще не доказан, и я подумал, что это будет хороший способ узнать об Исполнителе. Каждому потоку присваивается диапазон [l, u] целых чисел для проверки.
В частности, моя программа принимает 3 аргумента - N (номер, на который я хочу проверить CH), RANGESIZE (длина интервала, который должен обрабатывать поток) и NTHREAD, размер потока.
Мой код работает нормально, но я видел гораздо меньше ускорения, которое я ожидал, - порядка 30% при переходе от 1 до 4 потоков.
Моя логика заключалась в том, что вычисление полностью связано с ЦП, и каждая подзадача (проверка CH для диапазона фиксированного размера) занимает примерно одно и то же время.
У кого-нибудь есть идеи относительно того, почему я не вижу увеличения скорости на 3 - 4 раза?
Если вы можете сообщить о времени выполнения, поскольку увеличиваете количество потоков (вместе с машиной, JVM и ОС), что также было бы замечательно.
Особенности
Runtimes:
Java -d64 -server -cp. Collatz 10000000 1000000 4 => 4 потока, занимает 28412 миллисекунд
java -d64 -server -cp. Коллатца 10000000 1000000 1 => 1 нить, занимает 38286 миллисекунды
Процессор:
Quadcore Intel Q6600 на частоте 2,4 ГГц, 4 Гб. Машина выгружена.
Java:
ява версия "1.6.0_15" Java (TM) SE Runtime Environment (сборка 1.6.0_15-B03) Java HotSpot (TM) 64-разрядного сервера VM (сборка 14.1-B02, смешанный режим)
OS:
Linux quad0 2.6.26-2-amd64 # 1 SMP Вт мар 9 22:29:32 UTC 2010 x86_64 GNU/Linux
Код: (Я не могу получить код для публикации, я думаю, что слишком долго для требований SO, источник доступно на Google Docs
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class MyRunnable implements Runnable {
public int lower;
public int upper;
MyRunnable(int lower, int upper) {
this.lower = lower;
this.upper = upper;
}
@Override
public void run() {
for (int i = lower ; i <= upper; i++) {
Collatz.check(i);
}
System.out.println("(" + lower + "," + upper + ")");
}
}
public class Collatz {
public static boolean check(BigInteger X) {
if (X.equals(BigInteger.ONE)) {
return true;
} else if (X.getLowestSetBit() == 1) {
// odd
BigInteger Y = (new BigInteger("3")).multiply(X).add(BigInteger.ONE);
return check(Y);
} else {
BigInteger Z = X.shiftRight(1); // fast divide by 2
return check(Z);
}
}
public static boolean check(int x) {
BigInteger X = new BigInteger(new Integer(x).toString());
return check(X);
}
static int N = 10000000;
static int RANGESIZE = 1000000;
static int NTHREADS = 4;
static void parseArgs(String [] args) {
if (args.length >= 1) {
N = Integer.parseInt(args[0]);
}
if (args.length >= 2) {
RANGESIZE = Integer.parseInt(args[1]);
}
if (args.length >= 3) {
NTHREADS = Integer.parseInt(args[2]);
}
}
public static void maintest(String [] args) {
System.out.println("check(1): " + check(1));
System.out.println("check(3): " + check(3));
System.out.println("check(8): " + check(8));
parseArgs(args);
}
public static void main(String [] args) {
long lDateTime = new Date().getTime();
parseArgs(args);
List<Thread> threads = new ArrayList<Thread>();
ExecutorService executor = Executors.newFixedThreadPool(NTHREADS);
for(int i = 0 ; i < (N/RANGESIZE); i++) {
Runnable worker = new MyRunnable(i*RANGESIZE+1, (i+1)*RANGESIZE);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println("Finished all threads");
long fDateTime = new Date().getTime();
System.out.println("time in milliseconds for checking to " + N + " is " +
(fDateTime - lDateTime) +
" (" + N/(fDateTime - lDateTime) + " per ms)");
}
}
Ваша кодовая ссылка не удалась для меня. – 2010-11-24 20:48:54
Я думаю, вам нужно изменить настройки в своем документе google. Я получаю «Документы Google - Страница недоступна». – 2010-11-24 20:49:24
Мне удалось получить код. Я добавил его до конца вопроса. – 2010-11-24 21:03:22