Проблема, с которой вы столкнулись, заключается в том, что отображение на экране очень дорого, особенно если у вас графическая среда windows / X-windows (а не просто текстовый терминал). Просто рендерить одну цифру в шрифте намного дороже, чемрасчеты, которые вы делаете.Когда вы отправляете данные на экран быстрее, чем он может их отобразить, они буферизуют данные и быстро блокируют.Даже запись в файл значительна по сравнению с вычислениями, но она в 10–100 раз быстрее, чем отображение на экране.
Кстати: math.sqrt () очень дорогой, а использование цикла намного медленнее, чем использованиемодуль т.е.%, чтобы определить, является ли число кратным.BitSet может быть в 8 раз эффективнее, чем логическое значение []
Если я выгружаю вывод в файл, он быстрый, но запись в консоль медленная, и если я записываю в консоль данные, которые были записаны вфайл занимает примерно столько же времени.
Took 289 ms to examine 10,000,000 numbers.
Took 149 ms to toString primes up to 10,000,000.
Took 306 ms to write to a file primes up to 10,000,000.
Took 61,082 ms to write to a System.out primes up to 10,000,000.
time cat primes.txt
real 1m24.916s
user 0m3.619s
sys 0m12.058s
Код
int upTo = 10*1000*1000;
long start = System.nanoTime();
BitSet nonprimes = new BitSet(upTo);
for (int t = 2; t * t < upTo; t++) {
if (nonprimes.get(t)) continue;
for (int i = 2 * t; i <= upTo; i += t)
nonprimes.set(i);
}
PrintWriter report = new PrintWriter("report.txt");
long time = System.nanoTime() - start;
report.printf("Took %,d ms to examine %,d numbers.%n", time / 1000 / 1000, upTo);
long start2 = System.nanoTime();
for (int i = 2; i < upTo; i++) {
if (!nonprimes.get(i))
Integer.toString(i);
}
long time2 = System.nanoTime() - start2;
report.printf("Took %,d ms to toString primes up to %,d.%n", time2 / 1000 / 1000, upTo);
long start3 = System.nanoTime();
PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream("primes.txt"), 64*1024));
for (int i = 2; i < upTo; i++) {
if (!nonprimes.get(i))
pw.println(i);
}
pw.close();
long time3 = System.nanoTime() - start3;
report.printf("Took %,d ms to write to a file primes up to %,d.%n", time3 / 1000 / 1000, upTo);
long start4 = System.nanoTime();
for (int i = 2; i < upTo; i++) {
if (!nonprimes.get(i))
System.out.println(i);
}
long time4 = System.nanoTime() - start4;
report.printf("Took %,d ms to write to a System.out primes up to %,d.%n", time4 / 1000 / 1000, upTo);
report.close();