package com.redhat.ceylon.compiler.java.test.statement; import org.junit.Ignore; import org.junit.Test; import com.redhat.ceylon.compiler.java.test.CompilerError; import com.redhat.ceylon.compiler.java.test.CompilerTests; public class OptimizationTests extends CompilerTests { @Override protected String transformDestDir(String name) { return name + "-optim"; } @Override protected ModuleWithArtifact getDestModuleWithArtifact(String main) { return new ModuleWithArtifact("com.redhat.ceylon.compiler.java.test.statement.loop.optim", "1"); } @Test public void testLopRangeOpIterationOptimization(){ compareWithJavaSource("loop/optim/RangeOpIterationOptimization"); } @Test //@Ignore("https://github.com/ceylon/ceylon-compiler/issues/1647") public void testLopRangeOpIterationOptimizationCorrect(){ compileAndRun("com.redhat.ceylon.compiler.java.test.statement.loop.optim.rangeOpIterationOptimizationCorrect", "loop/optim/RangeOpIterationOptimizationCorrect.ceylon", "loop/optim/ArrayBuilder.ceylon"); } @Test public void testLopOptimSpanIteration() { compareWithJavaSource("loop/optim/SpanIteration"); } @Test public void testLopOptimBug2130_Span() { compareWithJavaSource("loop/optim/Bug2130_Span"); //compile("loop/optim/Bug2130_Span.ceylon"); run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.bug2130Span"); } @Test public void testLopOptimBug2130_Measure() { compareWithJavaSource("loop/optim/Bug2130_Measure"); //compile("loop/optim/Bug2130_Measure.ceylon"); run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.bug2130Measure"); } @Test public void testLopSegmentOpIterationOptimization(){ compareWithJavaSource("loop/optim/SegmentOpIterationOptimization"); } @Test public void testLopSegmentOpIterationOptimizationCorrect(){ compileAndRun("com.redhat.ceylon.compiler.java.test.statement.loop.optim.segmentOpIterationOptimizationCorrect", "loop/optim/SegmentOpIterationOptimizationCorrect.ceylon", "loop/optim/ArrayBuilder.ceylon"); } @Test public void testLopOptimArrayIterationStatic(){ compareWithJavaSource("loop/optim/ArrayIterationStatic"); } @Test public void testLopOptimArrayIterationStaticRequired(){ assertErrors("loop/optim/ArrayIterationStaticRequired", new CompilerError(35, "@requireOptimization[\"ArrayIterationStatic\"] assertion failed: static type of iterable in for statement is not Array"), new CompilerError(39, "@requireOptimization[\"JavaArrayIterationStatic\"] assertion failed: iterable expression wasn't of form javaArray.array")); } @Test public void testLopOptimJavaArrayIterationStatic(){ compareWithJavaSource("loop/optim/JavaArrayIterationStatic"); } @Test @Ignore("For benchmarking only") public void testLopOptimArrayIterationStaticBench(){ compile("loop/optim/ArrayIterationStaticBench.ceylon"); long java = arrayIterationStaticJava(); java = arrayIterationStaticJava(); System.gc(); long unopt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.arrayIterationStaticBenchDis"); unopt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.arrayIterationStaticBenchDis"); System.gc(); long opt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.arrayIterationStaticBench"); opt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.arrayIterationStaticBench"); System.gc(); System.out.println("Optimized took " + opt/1_000_000 + "ms"); System.out.println("Unoptimized took " + unopt/1_000_000 + "ms"); System.out.println("Java took " + java/1_000_000 + "ms"); } private long arrayIterationStaticJava() { int arrayIterationStaticN = 1_000_000; int[] arrayIterationStaticInts = new int[100]; for (int i = 0; i < arrayIterationStaticInts.length; i++) { arrayIterationStaticInts[i] = i; } int i = arrayIterationStaticN; int sum = 0; long t0 = System.nanoTime(); while (i > 0) { sum = 0; for (int ii = 0; ii < arrayIterationStaticInts.length; ii++) { int x = arrayIterationStaticInts[ii]; sum += x; } i--; } long t1 = System.nanoTime(); System.out.println("Java result " + sum); return t1-t0; } @Test @Ignore("For benchmarking only") public void testLopOptimTupleIterationStaticBench(){ compile("loop/optim/TupleIterationStaticBench.ceylon"); long opt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.tupleIterationStaticBench"); opt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.tupleIterationStaticBench"); System.gc(); long unopt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.tupleIterationStaticBenchDis"); unopt = (Long)run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.tupleIterationStaticBenchDis"); System.out.println("Optimized took " + opt/1_000_000 + "ms"); System.out.println("Unoptimized took " + unopt/1_000_000 + "ms"); } @Test public void testLopOptimTupleIterationStatic(){ compareWithJavaSource("loop/optim/TupleIterationStatic"); } @Test public void testLopOptimArrayIterationDynamic(){ compareWithJavaSource("loop/optim/ArrayIterationDynamic"); } @Test public void testLopOptimCorrect(){ compareWithJavaSource("loop/optim/Correct"); //compile("loop/optim/Correct.ceylon"); run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.Correct"); } @Test public void testLopOptimBug1467(){ compareWithJavaSource("loop/optim/Bug1467"); run("com.redhat.ceylon.compiler.java.test.statement.loop.optim.bug1467"); } @Test public void testLopOptimStringIterationStatic() { compareWithJavaSource("loop/optim/StringIterationStatic"); } @Ignore("For benchmarking only") @Test public void testLopOptimDynamicIterationBench() { compileAndRun("com.redhat.ceylon.compiler.java.test.statement.loop.optim.dynamicIterationBench_main", "loop/optim/DynamicIterationBench.ceylon"); } }