У меня есть две части кода, которые идентичны на С# и Java. Но Java идет вдвое быстрее. Я хочу знать, почему. Оба работают с одним и тем же принципом использования большой таблицы поиска для производительности.
Почему Java идет на 50% быстрее, чем С#?
Код 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 комбинаций карт. Версия С# идентична, но в конце она использует Console.writeLine.
Поисковая таблица определяется как:
static int handRanksj[];
Его размер в памяти составляет около 120 мегабайт.
Версия С# имеет тот же тестовый код. Он измеряется с помощью секундомера вместо nanoTime() и использует Console.WriteLine
вместо System.out.println("")
, но требуется как минимум удвоить время.
Java занимает около 400 мс. Для компиляции в java я использую флаг -server. В С# сборка настроена на выпуск без отладки или трассировки.
Что несет ответственность за разницу в скорости?