Java масштабируется намного хуже, чем C# на многих ядрах?

Я тестирую создание множества потоков, выполняющих одну и ту же функцию на 32-ядерном сервере для Java и C#. . Я запускаю приложение с 1000 итераций функции, которая распределяется по 1, 2, 4, 8, 16 или 32 потокам с использованием пула потоков.

При 1, 2, 4, 8 и 16 параллельных потоках Java как минимум в два раза быстрее, чем C#. Однако по мере увеличения количества потоков разрыв сокращается, и к 32 потокам C# имеет почти такое же среднее время выполнения, но Java иногда занимает 2000 мс (тогда как оба языка обычно работают около 400 мс). Java начинает ухудшаться из-за огромных всплесков времени, затрачиваемого на итерацию потока.

РЕДАКТИРОВАТЬ Это Windows Server 2008

РЕДАКТИРОВАТЬ 2 Я изменил приведенный ниже код, чтобы показать использование пула потоков службы исполнителя. Я также установил Java 7.

Я установил следующие оптимизации в виртуальной машине точки доступа:

-XX:+UseConcMarkSweepGC -Xmx 6000

, но это все равно не улучшило ситуацию. Единственная разница между кодом заключается в том, что я использую приведенный ниже пул потоков, а для версии C# мы используем:

http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

Есть ли способ сделать Java более оптимизированным? Может быть, вы могли бы объяснить, почему я вижу такое резкое снижение производительности?

Существует ли более эффективный пул потоков Java?

(Обратите внимание, я не имею в виду изменение тестовой функции)

import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class PoolDemo {

    static long FastestMemory = 2000000;
    static long SlowestMemory = 0;
    static long TotalTime;
    static int[] FileArray;
    static DataOutputStream outs;
    static FileOutputStream fout;
    static Byte myByte = 0;

  public static void main(String[] args) throws InterruptedException, FileNotFoundException {

        int Iterations = Integer.parseInt(args[0]);
        int ThreadSize = Integer.parseInt(args[1]);

        FileArray = new int[Iterations];
        fout = new FileOutputStream("server_testing.csv");

        // fixed pool, unlimited queue
        ExecutorService service = Executors.newFixedThreadPool(ThreadSize);
        ThreadPoolExecutor executor = (ThreadPoolExecutor) service;

        for(int i = 0; i SlowestMemory)
        {
            SlowestMemory = Duration;
        }
    }
  }
}

16
задан mezamorphic 4 April 2012 в 14:04
поделиться