8073354: TimSortStackSize2.java: test cleanup: make test run with single argument
Reviewed-by: dholmes
This commit is contained in:
parent
7f950ef63d
commit
ff45a0b5b0
@ -24,63 +24,59 @@
|
|||||||
/*
|
/*
|
||||||
* @test
|
* @test
|
||||||
* @bug 8072909
|
* @bug 8072909
|
||||||
* @run main/othervm -Xmx385m TimSortStackSize2 67108864
|
* @run main/othervm -Xms385m TimSortStackSize2 67108864
|
||||||
* not for regular execution on all platforms:
|
* @summary Test TimSort stack size on big arrays
|
||||||
|
* big tests not for regular execution on all platforms:
|
||||||
* run main/othervm -Xmx8g TimSortStackSize2 1073741824
|
* run main/othervm -Xmx8g TimSortStackSize2 1073741824
|
||||||
* run main/othervm -Xmx16g TimSortStackSize2 2147483644
|
* run main/othervm -Xmx16g TimSortStackSize2 2147483644
|
||||||
* @summary Test TimSort stack size on big arrays
|
|
||||||
*/
|
*/
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class TimSortStackSize2 {
|
public class TimSortStackSize2 {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
int lengthOfTest = Integer.parseInt(args[0]);
|
int lengthOfTest = Integer.parseInt(args[0]);
|
||||||
boolean passed = true;
|
boolean passed = doTest("TimSort", lengthOfTest,
|
||||||
try {
|
(Integer [] a) -> Arrays.sort(a));
|
||||||
Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
|
passed = doTest("ComparableTimSort", lengthOfTest, (Integer [] a) ->
|
||||||
long begin = System.nanoTime();
|
Arrays.sort(a, (Object first, Object second) -> {
|
||||||
Arrays.sort(a, new Comparator<Object>() {
|
return ((Comparable<Object>)first).compareTo(second);
|
||||||
@SuppressWarnings("unchecked")
|
}))
|
||||||
public int compare(Object first, Object second) {
|
&& passed;
|
||||||
return ((Comparable<Object>)first).compareTo(second);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
long end = System.nanoTime();
|
|
||||||
System.out.println("TimSort: " + (end - begin));
|
|
||||||
a = null;
|
|
||||||
} catch (ArrayIndexOutOfBoundsException e){
|
|
||||||
System.out.println("TimSort broken:");
|
|
||||||
e.printStackTrace();
|
|
||||||
passed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Integer [] a = new TimSortStackSize2(lengthOfTest).createArray();
|
|
||||||
long begin = System.nanoTime();
|
|
||||||
Arrays.sort(a);
|
|
||||||
long end = System.nanoTime();
|
|
||||||
System.out.println("ComparableTimSort: " + (end - begin));
|
|
||||||
a = null;
|
|
||||||
} catch (ArrayIndexOutOfBoundsException e){
|
|
||||||
System.out.println("ComparableTimSort broken:");
|
|
||||||
e.printStackTrace();
|
|
||||||
passed = false;
|
|
||||||
}
|
|
||||||
if ( !passed ){
|
if ( !passed ){
|
||||||
throw new RuntimeException();
|
throw new RuntimeException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean doTest(final String msg, final int lengthOfTest,
|
||||||
|
final Consumer<Integer[]> c){
|
||||||
|
Integer [] a = null;
|
||||||
|
try {
|
||||||
|
a = new TimSortStackSize2(lengthOfTest).createArray();
|
||||||
|
long begin = System.nanoTime();
|
||||||
|
c.accept(a);
|
||||||
|
long end = System.nanoTime();
|
||||||
|
System.out.println(msg + " OK. Time: " + (end - begin) + "ns");
|
||||||
|
} catch (ArrayIndexOutOfBoundsException e){
|
||||||
|
System.out.println(msg + " broken:");
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
a = null;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private static final int MIN_MERGE = 32;
|
private static final int MIN_MERGE = 32;
|
||||||
private final int minRun;
|
private final int minRun;
|
||||||
private final int length;
|
private final int length;
|
||||||
private final List<Long> runs = new ArrayList<Long>();
|
private final List<Long> runs = new ArrayList<Long>();
|
||||||
|
|
||||||
public TimSortStackSize2(int len) {
|
public TimSortStackSize2(final int len) {
|
||||||
this.length = len;
|
this.length = len;
|
||||||
minRun = minRunLength(len);
|
minRun = minRunLength(len);
|
||||||
fillRunsJDKWorstCase();
|
fillRunsJDKWorstCase();
|
||||||
@ -106,24 +102,24 @@ public class TimSortStackSize2 {
|
|||||||
* @param X The sum of the sequence that should be added to runs.
|
* @param X The sum of the sequence that should be added to runs.
|
||||||
*/
|
*/
|
||||||
private void generateJDKWrongElem(long X) {
|
private void generateJDKWrongElem(long X) {
|
||||||
for(long newTotal; X >= 2*minRun+1; X = newTotal) {
|
for(long newTotal; X >= 2 * minRun + 1; X = newTotal) {
|
||||||
//Default strategy
|
//Default strategy
|
||||||
newTotal = X/2 + 1;
|
newTotal = X / 2 + 1;
|
||||||
//Specialized strategies
|
//Specialized strategies
|
||||||
if(3*minRun+3 <= X && X <= 4*minRun+1) {
|
if(3 * minRun + 3 <= X && X <= 4*minRun+1) {
|
||||||
// add x_1=MIN+1, x_2=MIN, x_3=X-newTotal to runs
|
// add x_1=MIN+1, x_2=MIN, x_3=X-newTotal to runs
|
||||||
newTotal = 2*minRun+1;
|
newTotal = 2 * minRun + 1;
|
||||||
} else if(5*minRun+5 <= X && X <= 6*minRun+5) {
|
} else if (5 * minRun + 5 <= X && X <= 6 * minRun + 5) {
|
||||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=X-newTotal to runs
|
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=X-newTotal to runs
|
||||||
newTotal = 3*minRun+3;
|
newTotal = 3 * minRun + 3;
|
||||||
} else if(8*minRun+9 <= X && X <= 10*minRun+9) {
|
} else if (8 * minRun + 9 <= X && X <= 10 * minRun + 9) {
|
||||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=X-newTotal to runs
|
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=X-newTotal to runs
|
||||||
newTotal = 5*minRun+5;
|
newTotal = 5 * minRun + 5;
|
||||||
} else if(13*minRun+15 <= X && X <= 16*minRun+17) {
|
} else if (13 * minRun + 15 <= X && X <= 16 * minRun + 17) {
|
||||||
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=3MIN+4, x_6=X-newTotal to runs
|
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=3MIN+4, x_6=X-newTotal to runs
|
||||||
newTotal = 8*minRun+9;
|
newTotal = 8 * minRun + 9;
|
||||||
}
|
}
|
||||||
runs.add(0, X-newTotal);
|
runs.add(0, X - newTotal);
|
||||||
}
|
}
|
||||||
runs.add(0, X);
|
runs.add(0, X);
|
||||||
}
|
}
|
||||||
@ -144,10 +140,10 @@ public class TimSortStackSize2 {
|
|||||||
long Y = minRun + 4;
|
long Y = minRun + 4;
|
||||||
long X = minRun;
|
long X = minRun;
|
||||||
|
|
||||||
while(runningTotal+Y+X <= length) {
|
while (runningTotal + Y + X <= length) {
|
||||||
runningTotal += X + Y;
|
runningTotal += X + Y;
|
||||||
generateJDKWrongElem(X);
|
generateJDKWrongElem(X);
|
||||||
runs.add(0,Y);
|
runs.add(0, Y);
|
||||||
|
|
||||||
// X_{i+1} = Y_i + x_{i,1} + 1, since runs.get(1) = x_{i,1}
|
// X_{i+1} = Y_i + x_{i,1} + 1, since runs.get(1) = x_{i,1}
|
||||||
X = Y + runs.get(1) + 1;
|
X = Y + runs.get(1) + 1;
|
||||||
@ -156,21 +152,22 @@ public class TimSortStackSize2 {
|
|||||||
Y += X + 1;
|
Y += X + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(runningTotal + X <= length) {
|
if (runningTotal + X <= length) {
|
||||||
runningTotal += X;
|
runningTotal += X;
|
||||||
generateJDKWrongElem(X);
|
generateJDKWrongElem(X);
|
||||||
}
|
}
|
||||||
|
|
||||||
runs.add(length-runningTotal);
|
runs.add(length - runningTotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer[] createArray() {
|
private Integer [] createArray() {
|
||||||
Integer[] a = new Integer[length];
|
Integer [] a = new Integer[length];
|
||||||
Arrays.fill(a, 0);
|
Arrays.fill(a, 0);
|
||||||
int endRun = -1;
|
int endRun = -1;
|
||||||
for(long len : runs)
|
for (long len : runs) {
|
||||||
a[endRun+=len] = 1;
|
a[endRun += len] = 1;
|
||||||
a[length-1]=0;
|
}
|
||||||
|
a[length - 1] = 0;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user