В свободное время я недавно создал каркас для многопоточных математических операций, и для его тестирования я вычислил первую последовательность тысяч простых чисел.
Но мне нужно было, чтобы это заняло больше времени, поэтому я вставил этот код в простое вычисление:
for (int i = 0; i < 1000000; i++)
{
// Nothing.
}
В течение долгого времени я писал и компилировал код на 64-битной машине и тестировал его на ряде 32-битных машин.
Затем я запустил его на 64-битной машине и заметил огромную разницу в производительности.
С тем же кодом для полностью аналогичной 64 машины требуется <100 мс, что для 32 машины ~ 52000 мс (2 виртуальные машины на одном хосте). </p>
Я тестировал на Windows и Ubuntu на разных компьютерах, и, используя один и тот же файл .class, я все еще получаю эту огромную разницу между 32 и 64 битами.
Вот быстрый код, который вы можете использовать, чтобы повторить разницу в производительности.
import java.util.ArrayList;
import java.util.Collection;
public class Test {
public static void main(String[] args)
{
long start = System.currentTimeMillis();
int j = 2;
ArrayList<Integer> res = new ArrayList<Integer>();
for (int k = 0; k < 50000; k++)
{
Collection<Integer> partres = work(k);
if (partres != null)
res.addAll(work(k));
}
long end = System.currentTimeMillis();
System.out.println("Done in " + (end-start) + " ms.");
}
public static Collection<Integer> work(Integer j) {
for (int i = 0; i < 1000000; i++)
{
// Nothing.
}
if (isPrime(j))
{
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(j);
return res;
}
else
return null;
}
static boolean isPrime(int n) {
if (n == 2) return true;
if (n%2==0) return false;
for(int i = 3; i * i <= n; i += 2)
if(n%i==0)
return false;
return true;
}
}
И вот файл .class, в который я скомпилировал его.
Теперь мой вопрос.
Я знаю, что при использовании 64-битной машины повышается производительность, но это не объясняет эту огромную разницу. Так кто-нибудь знает, почему это происходит?