X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=tests%2Forg.simantics.scl.compiler.tests%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftests%2FMemoryLeakExperiment.java;fp=tests%2Forg.simantics.scl.compiler.tests%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftests%2FMemoryLeakExperiment.java;h=76cd51e900923c88917cd61d2ac1dde235f72646;hb=1a70d6085093907f2120e5319554420b1ada614a;hp=0000000000000000000000000000000000000000;hpb=3d5ad70adb8c0276e6bc8a611addb885d17f3e22;p=simantics%2Fplatform.git diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/MemoryLeakExperiment.java b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/MemoryLeakExperiment.java new file mode 100644 index 000000000..76cd51e90 --- /dev/null +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/MemoryLeakExperiment.java @@ -0,0 +1,74 @@ +package org.simantics.scl.compiler.tests; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification; +import org.simantics.scl.compiler.errors.CompilationErrorFormatter; +import org.simantics.scl.compiler.module.repository.ImportFailure; +import org.simantics.scl.compiler.module.repository.ImportFailureException; +import org.simantics.scl.compiler.module.repository.ModuleRepository; +import org.simantics.scl.compiler.runtime.RuntimeEnvironment; +import org.simantics.scl.compiler.top.ExpressionEvaluator; +import org.simantics.scl.compiler.top.SCLExpressionCompilationException; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.compiler.types.Types; + +public class MemoryLeakExperiment { + ModuleRepository moduleRepository; + + EnvironmentSpecification environmentSpecification; + + @Before + public void initialize() throws Exception { + moduleRepository = InitialRepository.getInitialRepository(); + + // Environment for compiling expressions + environmentSpecification = new EnvironmentSpecification(); + environmentSpecification.importModule("Builtin", ""); + environmentSpecification.importModule("Prelude", ""); + } + + private void testExpression0(String expressionText, + Object expectedValue, + Type expectedType) throws Exception { + + RuntimeEnvironment runtimeEnvironment; + try { + runtimeEnvironment = moduleRepository.createRuntimeEnvironment(environmentSpecification, + getClass().getClassLoader()); + } catch(ImportFailureException e) { + for(ImportFailure failure : e.failures) + System.err.println("Failed to import " + failure.moduleName); + throw e; + } + + // Compiling and running expression + try { + Object result = new ExpressionEvaluator(runtimeEnvironment, expressionText) + .expectedType(expectedType) + .interpretIfPossible(false) + .eval(); + if(expectedValue != null) + Assert.assertEquals(expectedValue, result); + } catch(SCLExpressionCompilationException e) { + System.out.println(CompilationErrorFormatter.toString(expressionText, e.getErrors())); + throw e; + } + } + + @Test + public void testIt() throws Exception { + for(int i=0;i<1000000;++i) { + testExpression0("fst (\"a\", \"b\")", "a", Types.STRING); + if(i % 10000 == 0 && i > 0) { + System.gc(); + System.runFinalization(); + System.gc(); + Thread.sleep(100L); + double used = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()); + System.out.println(i + " " + used*1e-6 + " Mb, " + (used / i) + " b / expression"); + } + } + } +}