Skip to content

Instantly share code, notes, and snippets.

@gkossakowski
Last active December 23, 2015 00:59
Show Gist options
  • Save gkossakowski/6557674 to your computer and use it in GitHub Desktop.
Save gkossakowski/6557674 to your computer and use it in GitHub Desktop.
Benchmarking code for classpath-experiments branch: https://github.com/gkossakowski/scala/tree/classpath-experiments It relies on scalatest checkout.
package test
import scala.tools.nsc.Global
object BenchmarkScalac {
def main(args: Array[String]): Unit = {
val args = assembleCompilerArgs
benchmarkClasspathMemoryConsumption(args)
}
private def assembleCompilerArgs: Array[String] = {
//
val files = Array("/Users/grek/tmp/scalatest/src/main/scala/org/scalatest/FunSuite.scala" , "/Users/grek/tmp/scalatest/src/main/scala/org/scalatest/fixture/FunSpecLike.scala", "/Users/grek/tmp/scalatest/src/main/scala/org/scalatest/Engine.scala", "/Users/grek/tmp/scalatest/src/main/scala/org/scalatest/fixture/FunSpec.scala")
val bootclasspath = "/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/jsfd.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/ui.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/laf.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/sunrsasign.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/jsse.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/jce.jar:/Library/Java/JavaVirtualMachines/1.6.0_39-b04-443.jdk/Contents/Classes/charsets.jar:/Users/grek/scala/scala-master/build/pack/lib/scala-library.jar"
val classpath = "/Users/grek/tmp/scalatest/target/scala-2.11.0-M5/classes:/Users/grek/tmp/scalatest/lib/txtmark.jar:/Users/grek/.ivy2/cache/org.eclipse.jetty.orbit/javax.servlet/orbits/javax.servlet-3.0.0.v201112011016.jar:/Users/grek/.ivy2/cache/org.scala-lang.modules/scala-xml_2.11.0-M5/jars/scala-xml_2.11.0-M5-1.0-RC4.jar:/Users/grek/.ivy2/cache/org.scala-sbt/test-interface/jars/test-interface-1.0.jar:/Users/grek/.ivy2/cache/org.scalacheck/scalacheck_2.11.0-M5/jars/scalacheck_2.11.0-M5-1.10.1.jar:/Users/grek/.ivy2/cache/org.scala-tools.testing/test-interface/jars/test-interface-0.5.jar:/Users/grek/.ivy2/cache/org.scala-lang/scala-actors/jars/scala-actors-2.11.0-M5.jar:/Users/grek/.ivy2/cache/org.scala-lang.modules/scala-parser-combinators_2.11.0-M5/jars/scala-parser-combinators_2.11.0-M5-1.0-RC2.jar:/Users/grek/.ivy2/cache/org.easymock/easymockclassextension/jars/easymockclassextension-3.1.jar:/Users/grek/.ivy2/cache/org.easymock/easymock/jars/easymock-3.1.jar:/Users/grek/.ivy2/cache/cglib/cglib-nodep/jars/cglib-nodep-2.2.2.jar:/Users/grek/.ivy2/cache/org.objenesis/objenesis/jars/objenesis-1.2.jar:/Users/grek/.ivy2/cache/org.jmock/jmock-legacy/jars/jmock-legacy-2.5.1.jar:/Users/grek/.ivy2/cache/org.jmock/jmock/jars/jmock-2.5.1.jar:/Users/grek/.ivy2/cache/org.hamcrest/hamcrest-core/jars/hamcrest-core-1.1.jar:/Users/grek/.ivy2/cache/org.hamcrest/hamcrest-library/jars/hamcrest-library-1.1.jar:/Users/grek/.ivy2/cache/org.mockito/mockito-all/jars/mockito-all-1.9.0.jar:/Users/grek/.ivy2/cache/org.testng/testng/jars/testng-6.3.1.jar:/Users/grek/.ivy2/cache/junit/junit/jars/junit-4.10.jar:/Users/grek/.ivy2/cache/org.beanshell/bsh/jars/bsh-2.0b4.jar:/Users/grek/.ivy2/cache/com.beust/jcommander/jars/jcommander-1.12.jar:/Users/grek/.ivy2/cache/org.yaml/snakeyaml/jars/snakeyaml-1.6.jar:/Users/grek/.ivy2/cache/com.google.inject/guice/jars/guice-3.0.jar:/Users/grek/.ivy2/cache/javax.inject/javax.inject/jars/javax.inject-1.jar:/Users/grek/.ivy2/cache/aopalliance/aopalliance/jars/aopalliance-1.0.jar:/Users/grek/.ivy2/cache/org.sonatype.sisu.inject/cglib/jars/cglib-2.2.1-v20090111.jar:/Users/grek/.ivy2/cache/asm/asm/jars/asm-3.3.1.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-java/jars/selenium-java-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-android-driver/jars/selenium-android-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-remote-driver/jars/selenium-remote-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.json/json/jars/json-20080701.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-api/jars/selenium-api-2.31.0.jar:/Users/grek/.ivy2/cache/com.google.guava/guava/bundles/guava-14.0.jar:/Users/grek/.ivy2/cache/org.apache.httpcomponents/httpclient/jars/httpclient-4.2.1.jar:/Users/grek/.ivy2/cache/org.apache.httpcomponents/httpcore/jars/httpcore-4.2.1.jar:/Users/grek/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.1.jar:/Users/grek/.ivy2/cache/commons-codec/commons-codec/jars/commons-codec-1.6.jar:/Users/grek/.ivy2/cache/org.apache.commons/commons-exec/jars/commons-exec-1.1.jar:/Users/grek/.ivy2/cache/net.java.dev.jna/jna/jars/jna-3.4.0.jar:/Users/grek/.ivy2/cache/net.java.dev.jna/platform/jars/platform-3.4.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-chrome-driver/jars/selenium-chrome-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-htmlunit-driver/jars/selenium-htmlunit-driver-2.31.0.jar:/Users/grek/.ivy2/cache/net.sourceforge.htmlunit/htmlunit/jars/htmlunit-2.11.jar:/Users/grek/.ivy2/cache/xalan/xalan/jars/xalan-2.7.1.jar:/Users/grek/.ivy2/cache/xalan/serializer/jars/serializer-2.7.1.jar:/Users/grek/.ivy2/cache/commons-collections/commons-collections/jars/commons-collections-3.2.1.jar:/Users/grek/.ivy2/cache/org.apache.commons/commons-lang3/jars/commons-lang3-3.1.jar:/Users/grek/.ivy2/cache/org.apache.httpcomponents/httpmime/jars/httpmime-4.2.2.jar:/Users/grek/.ivy2/cache/net.sourceforge.htmlunit/htmlunit-core-js/jars/htmlunit-core-js-2.11.jar:/Users/grek/.ivy2/cache/xerces/xercesImpl/jars/xercesImpl-2.10.0.jar:/Users/grek/.ivy2/cache/xml-apis/xml-apis/jars/xml-apis-1.4.01.jar:/Users/grek/.ivy2/cache/net.sourceforge.nekohtml/nekohtml/jars/nekohtml-1.9.17.jar:/Users/grek/.ivy2/cache/net.sourceforge.cssparser/cssparser/jars/cssparser-0.9.8.jar:/Users/grek/.ivy2/cache/org.w3c.css/sac/jars/sac-1.3.jar:/Users/grek/.ivy2/cache/commons-io/commons-io/jars/commons-io-2.2.jar:/Users/grek/.ivy2/cache/org.eclipse.jetty/jetty-websocket/jars/jetty-websocket-8.1.7.v20120910.jar:/Users/grek/.ivy2/cache/org.eclipse.jetty/jetty-util/jars/jetty-util-8.1.7.v20120910.jar:/Users/grek/.ivy2/cache/org.eclipse.jetty/jetty-io/jars/jetty-io-8.1.7.v20120910.jar:/Users/grek/.ivy2/cache/org.eclipse.jetty/jetty-http/jars/jetty-http-8.1.7.v20120910.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-firefox-driver/jars/selenium-firefox-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-ie-driver/jars/selenium-ie-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-iphone-driver/jars/selenium-iphone-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-safari-driver/jars/selenium-safari-driver-2.31.0.jar:/Users/grek/.ivy2/cache/org.webbitserver/webbit/jars/webbit-0.4.14.jar:/Users/grek/.ivy2/cache/io.netty/netty/bundles/netty-3.5.2.Final.jar:/Users/grek/.ivy2/cache/org.seleniumhq.selenium/selenium-support/jars/selenium-support-2.31.0.jar:/Users/grek/.ivy2/cache/org.apache.ant/ant/jars/ant-1.7.1.jar:/Users/grek/.ivy2/cache/org.apache.ant/ant-launcher/jars/ant-launcher-1.7.1.jar:/Users/grek/.ivy2/cache/org.pegdown/pegdown/jars/pegdown-1.1.0.jar:/Users/grek/.ivy2/cache/org.parboiled/parboiled-core/jars/parboiled-core-1.0.2.jar:/Users/grek/.ivy2/cache/org.parboiled/parboiled-java/jars/parboiled-java-1.0.2.jar:/Users/grek/.ivy2/cache/asm/asm-util/jars/asm-util-3.3.1.jar:/Users/grek/.ivy2/cache/asm/asm-tree/jars/asm-tree-3.3.1.jar:/Users/grek/.ivy2/cache/asm/asm-analysis/jars/asm-analysis-3.3.1.jar"
val target = "/Users/grek/tmp/scalatest/target/scala-2.11.0-M5/classes"
val options = s"-d $target -bootclasspath $bootclasspath -classpath $classpath -YclasspathImpl:recursive".split(' ').toArray
val args: Array[String] = options ++ files
args
}
private def benchmarkClasspathScanningTime(args: Array[String]): Unit = {
var i = 0
val startTime = System.currentTimeMillis()
while (i < 10) {
val scalaMain = scala.tools.nsc.Main
scalaMain.process(args)
i += 1
}
val elapsed = System.currentTimeMillis() - startTime
println("==== It took " + elapsed + " ms")
}
private def benchmarkClasspathMemoryConsumption(args: Array[String]): Unit = {
val allMains = (1 to 10) map (_ => new MainRetainsGlobal)
allMains foreach { main =>
println("Processing...")
main.process(args) }
println("All done, sleeping for 30sec so you can take memory snapshot before allMains variable is released.")
Thread.sleep(30000)
}
class MainRetainsGlobal extends scala.tools.nsc.MainClass {
var retainedGlobal: Global = _
override def doCompile(compiler: Global) {
retainedGlobal = compiler
super.doCompile(compiler)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment