Переглянути джерело

sequential is now really fast

master
mortie 7 роки тому
джерело
коміт
5de0de5d31
3 змінених файлів з 42 додано та 20 видалено
  1. 17
    3
      inf2440/hw2/Main.java
  2. 20
    17
      inf2440/hw2/Sequential.java
  3. 5
    0
      inf2440/hw2/Timer.java

+ 17
- 3
inf2440/hw2/Main.java Переглянути файл

t.start(); t.start();
long n = maxNum * maxNum; long n = maxNum * maxNum;
for (long j = n; j >= n - 100; --j) { for (long j = n; j >= n - 100; --j) {

Timer t2 = new Timer().start();
long[] factors = s.factor(sieve, j); long[] factors = s.factor(sieve, j);
System.out.println(
t2.end().prettyTime()+": "+
Util.factors(j, factors));


/*
if (j > (n - 5) || j < (n - 95)) { if (j > (n - 5) || j < (n - 95)) {
if (j == n - 96) if (j == n - 96)
System.out.println("............."); System.out.println(".............");
System.out.println( System.out.println(
Util.factors(j, factors)); Util.factors(j, factors));
} }
*/
} }
t.end(); t.end();
} }
Sequential sseq = new Sequential(); Sequential sseq = new Sequential();
Parallel spar = new Parallel(); Parallel spar = new Parallel();


boolean findPrimes = true;
//boolean findPrimes = true;
boolean findPrimes = false;
boolean factor = true; boolean factor = true;


int maxNum = Integer.parseInt(args[0]); int maxNum = Integer.parseInt(args[0]);


System.out.println("\nFactoring sequentially..."); System.out.println("\nFactoring sequentially...");
Timer seq = testFactor(sseq, maxNum, sieve); Timer seq = testFactor(sseq, maxNum, sieve);
System.out.println("Sequential: "+seq.prettyTime());
Timer seqAvg = new Timer(seq.time / 100);
System.out.println(
"Sequential: "+seq.prettyTime()+
" ("+seqAvg.prettyTime()+" per factor)");


System.out.println("\nFactoring in parallel..."); System.out.println("\nFactoring in parallel...");
Timer par = testFactor(spar, maxNum, sieve); Timer par = testFactor(spar, maxNum, sieve);
System.out.println("Parallel: "+par.prettySpeedup(seq));
Timer parAvg = new Timer(par.time / 100);
System.out.println(
"Parallel: "+par.prettySpeedup(seq)+
" ("+parAvg.prettyTime()+" per factor)");
} }


spar.stopThreads(); spar.stopThreads();

+ 20
- 17
inf2440/hw2/Sequential.java Переглянути файл



ArrayList<Long> arr = new ArrayList<>(); ArrayList<Long> arr = new ArrayList<>();


while (true) {
long prime;
for (prime = 2; prime <= sqrt; ++prime) {
if (num % prime == 0) {
arr.add(new Long(prime));
num /= prime;
break;
}
}
// Easier to assume all primes are odd
while (num % 2 == 0) {
arr.add(new Long(2));
num /= 2;
}


if (prime > sqrt) {
arr.add(new Long(num));
break;
}
// Find factors
long prime;
for (prime = 3; prime <= sqrt; prime += 2) {
if (!sieve.isPrime((int)prime))
continue;


if (num <= sqrt && sieve.isPrime((int)num)) {
if (num != 1)
arr.add(new Long(num));
break;
if (num % prime == 0) {
do {
arr.add(new Long(prime));
num /= prime;
} while (num % prime == 0);
sqrt = (int)Math.sqrt(num);
} }
} }


// Add num if we didn't find all the factors before sqrt(num)
if (num != 1)
arr.add(new Long(num));

long[] a = new long[arr.size()]; long[] a = new long[arr.size()];
for (int i = 0; i < a.length; ++i) { for (int i = 0; i < a.length; ++i) {
a[i] = arr.get(i); a[i] = arr.get(i);

+ 5
- 0
inf2440/hw2/Timer.java Переглянути файл



private long start = 0; private long start = 0;


Timer() {}
Timer(long time) {
this.time = time;
}

public Timer start() { public Timer start() {
start = System.nanoTime(); start = System.nanoTime();
return this; return this;

Завантаження…
Відмінити
Зберегти