C # в два раза медленнее, чем Java при доступе к памяти с помощью циклов?

У меня есть два фрагмента кода, которые идентичны на C # и Java. Но Java идет вдвое быстрее. Я хочу знать почему. Оба работают с одним и тем же принципом использования большой таблицы поиска для повышения производительности.

Почему Java работает на 50% быстрее, чем C #?

Код Java:

    int h1, h2, h3, h4, h5, h6, h7;
    int u0, u1, u2, u3, u4, u5;
    long time = System.nanoTime();
    long sum = 0;
    for (h1 = 1; h1 < 47; h1++) {
        u0 = handRanksj[53 + h1];
        for (h2 = h1 + 1; h2 < 48; h2++) {
            u1 = handRanksj[u0 + h2];
            for (h3 = h2 + 1; h3 < 49; h3++) {
                u2 = handRanksj[u1 + h3];
                for (h4 = h3 + 1; h4 < 50; h4++) {
                    u3 = handRanksj[u2 + h4];
                    for (h5 = h4 + 1; h5 < 51; h5++) {
                        u4 = handRanksj[u3 + h5];
                        for (h6 = h5 + 1; h6 < 52; h6++) {
                            u5 = handRanksj[u4 + h6];
                            for (h7 = h6 + 1; h7 < 53; h7++) {
                                sum += handRanksj[u5 + h7];
    }}}}}}}
    double rtime = (System.nanoTime() - time)/1e9; // time given is start time
    System.out.println(sum);

Он просто перечисляет все возможные 7 комбинаций карт. Версия C # идентична, за исключением того, что в конце используется Console.writeLine.

Lookuptable определяется как:

static int handRanksj[];

Его размер в памяти составляет около 120 мегабайт.

Версия C # имеет тот же тестовый код. Он измеряется с помощью секундомера вместо nanoTime () и использует Console.WriteLine вместо System.out.println ("") , но это занимает как минимум вдвое больше времени.

Java занимает около 400 мс. Для компиляции в java я использую флаг -server. В C # сборка настроена на выпуск без определений отладки или трассировки.

Что отвечает за разницу в скорости?

10
задан Eric Leschinski 17 August 2013 в 20:20
поделиться