Object Comparisons
Finding Prime Numbers
C++ & Java
ADAM FELDSCHER
I699 PERFORMANCE DESIGN PATTERNS II
10/16/2019
Modifications
 All tests are done for primes up to 10k, with 40 iterations
 1k had too much noise
 Java and C++
 Java Primitives vs Wrappers
 PrimeFinder Class Invoction
 New instance per each iteration
 Bring SQRT into for loop comparison
 Adding is_prime method
Algorithm (Java)
for (int iter = 0; iter < max_iter; iter++) {
// insert delays
long start_time = System.nanoTime();
for (int n = 2; n <= max_prime; n++) {// 2 - 10k
int max_divisor = (int) sqrt(n);
boolean is_prime = true;
for (int i = 2; i <= max_divisor; i++) {// check for divisors
if (n % i == 0) {
is_prime = false;
break;
}
}
if (is_prime) {
num_primes_found++; // count primes
}
}
long end_time = System.nanoTime();
// print things
num_primes_found = 0;
}
Java Consistency Check
0
1000000
2000000
3000000
4000000
5000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 10k, normal consistency
Run 1 Run 2
Java Primitives vs Wrappers
Java Primitives vs Wrappers
(Integer)
0
5000000
10000000
15000000
20000000
25000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 10k, Integer
Primative Integer
Java PrimeFinder Class
public class PrimeFinder {
private Integer max_prime;
public PrimeFinder(Integer max_prime) {
this.max_prime = max_prime;
}
public Integer find_primes() {
Integer num_primes_found = 0;
for (Integer n = 2; n <= max_prime; n++) {
Integer max_divisor = (int) sqrt(n);
Boolean is_prime = true;
for (Integer i = 2; i <= max_divisor; i++) {
if (n % i == 0) {
is_prime = false;
break;
}
}
if (is_prime) {
num_primes_found++;
}
}
return num_primes_found;
}
}
public static void main(String[] args) {
for (Integer iter = 0; iter < max_iter; iter++) {
//Start Timer
PrimeFinder primeFinder = new PrimeFinder(iter, max_prime);
num_primes_found = primeFinder.find_primes();
//End timer & Print
}
Java PrimeFinder Class
0
5000000
10000000
15000000
20000000
25000000
30000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 10k, Primefinder
Primative Class PrimeFinder
C++ PrimeFinder Class
class PrimeFinder
{
private:
int _max_prime;
public:
PrimeFinder(int max_prime);
int find_primes();
};
PrimeFinder::PrimeFinder(int max_prime) {
_max_prime = max_prime;
}
int PrimeFinder::find_primes() {
int num_primes_found = 0;
int n;
for (n = 2; n <= _max_prime; n++) {
int max_divisor = (int) sqrt(n);
bool is_prime = true;
int i;
for (i = 2; i <= max_divisor; i++) {
if (n % i == 0) {
is_prime = false;
break;
}
}
if (is_prime) {
num_primes_found++;
}
}
return num_primes_found;
}
C++ PrimeFinder Class
0
200000
400000
600000
800000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
C++ PrimeFinder
C++ Primative C++ PrimeFinder
Java Prime Finder + SQRT
Java Prime Finder + SQRT
0
5000000
10000000
15000000
20000000
25000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 10k, Primefinder
Primative Class PrimeFinder SQRT
C++ PrimeFinder + SQRT
0
200000
400000
600000
800000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
C++ PrimeFinder SQRT
C++ PrimeFinder C++ PrimeFinder SQRT
Java IsPrime Method
public class PrimeFinder {
private Boolean is_prime(Integer n) {
Integer max_divisor = (int) sqrt(n);
for (Integer i = 2; i <= max_divisor; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
public Integer find_primes() {
Integer num_primes_found = 0;
for (Integer n = 2; n <= max_prime; n++) {
if (is_prime(n)) {
num_primes_found++;
}
}
return num_primes_found;
}
}
Java IsPrime Method
0
5000000
10000000
15000000
20000000
25000000
30000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 10k, Integer, PrimeFinder, IsPrime
Primative Class PrimeFinder PrimeFinder IsPrime
C++ IsPrime Method
bool PrimeFinder::is_prime(int n) {
int max_divisor = (int) sqrt(n);
for (int i = 2; i <= max_divisor; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int PrimeFinder::find_primes() {
int num_primes_found = 0;
int n;
for (n = 2; n <= _max_prime; n++) {
if (is_prime(n)) {
num_primes_found++;
}
}
return num_primes_found;
}
C++ IsPrime Method
0
200000
400000
600000
800000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
C++ PrimeFinder isPrime
C++ PrimeFinder C++ PrimeFinder isprime
Java 1K tests
0
1000000
2000000
3000000
4000000
5000000
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
Nanoseconds
Iteration
Java 10, 1k, Integer Primefinder
Integer Class PrimeFinder

C++ & Java JIT Optimizations: Finding Prime Numbers

  • 1.
    Object Comparisons Finding PrimeNumbers C++ & Java ADAM FELDSCHER I699 PERFORMANCE DESIGN PATTERNS II 10/16/2019
  • 2.
    Modifications  All testsare done for primes up to 10k, with 40 iterations  1k had too much noise  Java and C++  Java Primitives vs Wrappers  PrimeFinder Class Invoction  New instance per each iteration  Bring SQRT into for loop comparison  Adding is_prime method
  • 3.
    Algorithm (Java) for (intiter = 0; iter < max_iter; iter++) { // insert delays long start_time = System.nanoTime(); for (int n = 2; n <= max_prime; n++) {// 2 - 10k int max_divisor = (int) sqrt(n); boolean is_prime = true; for (int i = 2; i <= max_divisor; i++) {// check for divisors if (n % i == 0) { is_prime = false; break; } } if (is_prime) { num_primes_found++; // count primes } } long end_time = System.nanoTime(); // print things num_primes_found = 0; }
  • 4.
    Java Consistency Check 0 1000000 2000000 3000000 4000000 5000000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 10k, normal consistency Run 1 Run 2
  • 5.
  • 6.
    Java Primitives vsWrappers (Integer) 0 5000000 10000000 15000000 20000000 25000000 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 10k, Integer Primative Integer
  • 7.
    Java PrimeFinder Class publicclass PrimeFinder { private Integer max_prime; public PrimeFinder(Integer max_prime) { this.max_prime = max_prime; } public Integer find_primes() { Integer num_primes_found = 0; for (Integer n = 2; n <= max_prime; n++) { Integer max_divisor = (int) sqrt(n); Boolean is_prime = true; for (Integer i = 2; i <= max_divisor; i++) { if (n % i == 0) { is_prime = false; break; } } if (is_prime) { num_primes_found++; } } return num_primes_found; } } public static void main(String[] args) { for (Integer iter = 0; iter < max_iter; iter++) { //Start Timer PrimeFinder primeFinder = new PrimeFinder(iter, max_prime); num_primes_found = primeFinder.find_primes(); //End timer & Print }
  • 8.
    Java PrimeFinder Class 0 5000000 10000000 15000000 20000000 25000000 30000000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 10k, Primefinder Primative Class PrimeFinder
  • 9.
    C++ PrimeFinder Class classPrimeFinder { private: int _max_prime; public: PrimeFinder(int max_prime); int find_primes(); }; PrimeFinder::PrimeFinder(int max_prime) { _max_prime = max_prime; } int PrimeFinder::find_primes() { int num_primes_found = 0; int n; for (n = 2; n <= _max_prime; n++) { int max_divisor = (int) sqrt(n); bool is_prime = true; int i; for (i = 2; i <= max_divisor; i++) { if (n % i == 0) { is_prime = false; break; } } if (is_prime) { num_primes_found++; } } return num_primes_found; }
  • 10.
    C++ PrimeFinder Class 0 200000 400000 600000 800000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration C++ PrimeFinder C++ Primative C++ PrimeFinder
  • 11.
  • 12.
    Java Prime Finder+ SQRT 0 5000000 10000000 15000000 20000000 25000000 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 10k, Primefinder Primative Class PrimeFinder SQRT
  • 13.
    C++ PrimeFinder +SQRT 0 200000 400000 600000 800000 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration C++ PrimeFinder SQRT C++ PrimeFinder C++ PrimeFinder SQRT
  • 14.
    Java IsPrime Method publicclass PrimeFinder { private Boolean is_prime(Integer n) { Integer max_divisor = (int) sqrt(n); for (Integer i = 2; i <= max_divisor; i++) { if (n % i == 0) { return false; } } return true; } public Integer find_primes() { Integer num_primes_found = 0; for (Integer n = 2; n <= max_prime; n++) { if (is_prime(n)) { num_primes_found++; } } return num_primes_found; } }
  • 15.
    Java IsPrime Method 0 5000000 10000000 15000000 20000000 25000000 30000000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 10k, Integer, PrimeFinder, IsPrime Primative Class PrimeFinder PrimeFinder IsPrime
  • 16.
    C++ IsPrime Method boolPrimeFinder::is_prime(int n) { int max_divisor = (int) sqrt(n); for (int i = 2; i <= max_divisor; i++) { if (n % i == 0) { return false; } } return true; } int PrimeFinder::find_primes() { int num_primes_found = 0; int n; for (n = 2; n <= _max_prime; n++) { if (is_prime(n)) { num_primes_found++; } } return num_primes_found; }
  • 17.
    C++ IsPrime Method 0 200000 400000 600000 800000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration C++ PrimeFinder isPrime C++ PrimeFinder C++ PrimeFinder isprime
  • 18.
    Java 1K tests 0 1000000 2000000 3000000 4000000 5000000 13 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 Nanoseconds Iteration Java 10, 1k, Integer Primefinder Integer Class PrimeFinder

Editor's Notes

  • #5 Retest in linux….
  • #7 Significant! Scale difference from last
  • #9 Surprising that there’s not more change
  • #11 Gets entirely optimized out
  • #13 Almost no impact
  • #16 Some weirdness, not sure if it jits faster because there are smaller units, or if its just noise. JIT LOG
  • #18 No change
  • #19 1k has more details but also more noise. Linux