I am experimenting with some multithreaded constructs, but for some reason it seems that multithreading is not faster than a single thread. I narrowed it down to a very simple test with a nested loop (1000x1000), in which the system only takes into account.
Below I published the code for both single streaming and multithreading, and how they are executed.
As a result, one thread completes a cycle of approximately 110 ms , while two threads also take about 112 ms .
I don't think the problem is the overhead of multithreading. If I send only one of both Runnables to a ThreadPoolExecutor, it runs in half the time of a single thread, which makes sense. But adding that the second Runnable makes it 10 times slower. Both 3.00 GHz cores operate at 100%.
I think this may be PC specific, as someone from the PC showed double speed results with multithreading. But then, what can I do about it? I have Intel Pentium 4 3.00 GHz (2 processors) and Java jre6.
Test code:
// 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
This code runs in approximately 110 ms .
// 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
This code executes in approximately 112 ms .
Edit: I replaced Runnables with Threads and got rid of ExecutorService (for simplicity of the problem).
Edit: tried some suggestions
java performance multithreading intel multicore
Remix
source share