package com.vitco.low.triangulate.tests; import com.vitco.low.triangulate.Grid2TriGreedyOptimal; import com.vitco.low.triangulate.Grid2TriMono; import com.vitco.low.triangulate.Grid2TriNaiveGreedy; import com.vitco.low.triangulate.Grid2TriPolyFast; import com.vitco.low.triangulate.util.Grid2PolyHelper; import org.junit.Test; import org.poly2tri.Poly2Tri; import java.util.ArrayList; import java.util.Random; /** * Compare how the run times of the different algorithms behalf. */ public class RuntimeComparisonTest { private static final Random rand = new Random(); // return a random bit grid for a specific size private static boolean[][] getRandomBitGrid(int size) { boolean[][] data = new boolean[size][size]; // fill half of the entries with ones for (int i = 0, len = (size*size)/2; i < len; i++) { // get a random position int x = rand.nextInt(size); int y = rand.nextInt(size); if (!data[x][y]) { data[x][y] = true; } else { // find another position i--; } } return data; } // print a list for maple input private static void printList(ArrayList<Long> list, String name) { // print final results System.out.print(name + " := ["); boolean first = true; for (int i = 0; i < list.size(); i++) { Long val = list.get(i); System.out.print((first ? "" : ",") + "[" + (i*10+10) + "," + val + "]"); first = false; } System.out.println("];"); } @Test public final void testRuntimes() { Poly2Tri.warmup(); // warmup for (int i = 0; i < 10000; i++) { boolean[][] grid = getRandomBitGrid(10); Grid2TriGreedyOptimal.triangulate(grid); Grid2TriNaiveGreedy.triangulate(grid); Grid2TriMono.triangulate(grid, false); Grid2TriPolyFast.triangulate(Grid2PolyHelper.convert(grid)); } ArrayList<Long> greedyOptList = new ArrayList<Long>(); ArrayList<Long> naiveGreedyList = new ArrayList<Long>(); ArrayList<Long> monoList = new ArrayList<Long>(); ArrayList<Long> polyList = new ArrayList<Long>(); int repeat = 20; for (int i = 10; i <= 700; i += 10) { System.out.println(i); long greedyOpt = 0; long naiveGreedy = 0; long mono = 0; long poly = 0; // repeat each test for (int j = 0; j < repeat; j++) { boolean[][] grid = getRandomBitGrid(i); //test algorithm greedyOpt -= System.currentTimeMillis(); Grid2TriGreedyOptimal.triangulate(grid); greedyOpt += System.currentTimeMillis(); // test algorithm naiveGreedy -= System.currentTimeMillis(); Grid2TriNaiveGreedy.triangulate(grid); naiveGreedy += System.currentTimeMillis(); // test algorithm mono -= System.currentTimeMillis(); Grid2TriMono.triangulate(grid, false); mono += System.currentTimeMillis(); // test algorithm poly -= System.currentTimeMillis(); Grid2TriPolyFast.triangulate(Grid2PolyHelper.convert(grid)); poly += System.currentTimeMillis(); } // normalize greedyOpt /= repeat; naiveGreedy /= repeat; mono /= repeat; poly /= repeat; // fill into arrays greedyOptList.add(greedyOpt); naiveGreedyList.add(naiveGreedy); monoList.add(mono); polyList.add(poly); } printList(greedyOptList, "greedyOpt"); printList(naiveGreedyList, "naiveGreedy"); printList(monoList, "mono"); printList(polyList, "poly"); } }