Мне нужно несколько легко реализуемых вычислений с одним процессором и памятью, которые я могу написать в java для планировщика тестовых потоков.
Они должны быть немного трудоемкими, но, что более важно, потреблять ресурсы.
Любые идеи?
Мне нужно несколько легко реализуемых вычислений с одним процессором и памятью, которые я могу написать в java для планировщика тестовых потоков.
Они должны быть немного трудоемкими, но, что более важно, потреблять ресурсы.
Любые идеи?
Несколько простых примеров задач, требующих процессора:
Умножьте две матрицы. Матрицы должны быть огромными и сохраняться на диске.
Поиск по строкам. Или, индексируйте огромный документ (обнаруживайте и подсчитывайте каждое слово или строки алфавитов). Например, вы можете индексировать все идентификаторы в исходном коде большого программного проекта.
Вычислить pi.
Поверните двумерную матрицу или изображение.
Сжатие огромных файлов.
...
Тест на выгрузку процессора для PDP-11 был tan(atan(tan(atan(...)))
и т.д. Очень сильно работает FPU, а также стек и регистры.
Хорошо, это не Java, но это основано на Dhrystone найденный алгоритм поиска здесь. Эти реализации алгоритма могут дать вам представление о том, как это делается. Ссылка здесь содержит источники для C/С++ и Assembler для получения эталонных тестов.
Вычислить n-й член ряда фибоначчи, где n больше 70. (время)
Вычислить факториалы больших чисел. (отнимает много времени)
Найти все возможные пути между двумя узлами, на графике. (потребляемая память)
Я смешался с приоритетом Thread в Java и использовал приведенный ниже код. Кажется, что процессор занят настолько, что приоритет потока имеет значение.
@Test
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception {
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i=0; i<1_000_000; i++) {
double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789))))))))));
cbrt(d);
}
LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName());
}
}
final int NUMBER_OF_THREADS = 32;
List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS);
for (int i=1; i<=NUMBER_OF_THREADS; i++) {
Thread t = new Thread(new MyRunnable());
if (i == NUMBER_OF_THREADS) {
// Last thread gets MAX_PRIORITY
t.setPriority(Thread.MAX_PRIORITY);
t.setName("T-" + i + "-MAX_PRIORITY");
} else {
// All other threads get MIN_PRIORITY
t.setPriority(Thread.MIN_PRIORITY);
t.setName("T-" + i);
}
threadList.add(t);
}
threadList.forEach(t->t.start());
for (Thread t : threadList) {
t.join();
}
}