Я экспериментирую с некоторыми многопоточными конструкциями, но почему-то кажется, что многопоточность не быстрее, чем один поток. Я сузил его до очень простого теста с вложенным циклом (1000x1000), в котором система только считает.
Ниже я опубликовал код как для однопоточной, так и для многопоточности, и как они выполняются.
В результате один поток завершает цикл примерно за 110 мс , тогда как два потока также занимают около 112 мс .
Я не думаю, что проблема заключается в многопоточности. Если я отправляю только один из обоих Runnables в ThreadPoolExecutor, он выполняется за половину времени одного потока, что имеет смысл. Но добавление второго Runnable делает его в 10 раз медленнее. Оба ядра 3,00 ГГц работают на 100%.
Я думаю, что это может быть характерно для ПК, поскольку чей-то компьютер показал результаты с двойной скоростью на многопоточности. Но что я могу с этим сделать? У меня Intel Pentium 4 3,00 ГГц (2 процессора) и Java JRE6.
Тестовый код:
// Single thread:
long start = System.nanoTime(); // Start timer
final int[] i = new int[1]; // This is to keep the test fair (see below)
int i = 0;
for(int x=0; x<10000; x++)
{
for(int y=0; y<10000; y++)
{
i++; // Just counting...
}
}
int i0[0] = i;
long end = System.nanoTime(); // Stop timer
Этот код выполняется примерно за 110 мс .
// Two threads:
start = System.nanoTime(); // Start timer
// Two of the same kind of variables to count with as in the single thread.
final int[] i1 = new int [1];
final int[] i2 = new int [1];
// First partial task (0-5000)
Thread t1 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=0; x<5000; x++)
for(int y=0; y<10000; y++)
i++;
i1[0] = i;
}
};
// Second partial task (5000-10000)
Thread t2 = new Thread() {
@Override
public void run()
{
int i = 0;
for(int x=5000; x<10000; x++)
for(int y=0; y<10000; y++)
i++;
int i2[0] = i;
}
};
// Start threads
t1.start();
t2.start();
// Wait for completion
try{
t1.join();
t2.join();
}catch(Exception e){
e.printStackTrace();
}
end = System.nanoTime(); // Stop timer
Этот код выполняется примерно за 112 мс .
Редактировать: я изменил Runnables на Threads и избавился от ExecutorService (для простоты проблемы).
Редактировать: пробовал некоторые предложения