Skip to content

Instantly share code, notes, and snippets.

@melix
Created February 14, 2014 11:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save melix/8999604 to your computer and use it in GitHub Desktop.
Save melix/8999604 to your computer and use it in GitHub Desktop.
Micro-Benchmarks for the MarkupTemplateEngine in Groovy
@Grab(group='org.gperfutils', module='gbench', version='0.4.2-groovy-2.1')
@Grab('org.freemarker:freemarker:2.3.9')
import groovy.text.markup.MarkupTemplateEngine
import freemarker.template.*
MarkupTemplateEngine engine = new MarkupTemplateEngine()
def mkpTemplate1 = engine.createTemplate '''
html {
body('It works!')
}
'''
def mkpTemplate2 = engine.createTemplate '''
html {
body(text)
}
'''
def mkpTemplate3 = engine.createTemplate '''
html {
body(text.toUpperCase())
}
'''
def mkpTemplate3_typed = engine.createTemplate '''
html {
body(((String)text).toUpperCase())
}
'''
def mkpTemplate4 = engine.createTemplate '''
html {
body {
ul {
persons.each {
li("$text $it")
}
}
}
}
'''
def mkpTemplate4_typed = engine.createTemplate '''
List<String> pList = (List<String>) persons
String txt = text
html {
body {
ul {
for (String p: pList) {
li("$txt $p")
}
}
}
}
'''
def model = [text:'Hello', persons:['Cedric','Guillaume','Jochen','Pascal','Paul']]
def cfg = new Configuration()
def ftlTemplate1 = new Template("name", new StringReader('''<html><body>It works!</body></html>'''), cfg);
def ftlTemplate2 = new Template("name", new StringReader('''<html><body>${text}</body></html>'''), cfg);
def ftlTemplate3 = new Template("name", new StringReader('''<html><body>${text?upper_case}</body></html>'''), cfg);
def ftlTemplate4 = new Template("name", new StringReader('''<html><body><ul><#list persons as person><li>${text} ${person}</#list></ul></body></html>'''), cfg);
def r = benchmark {
'MarkupTemplateEngine (simple, no binding)' { mkpTemplate1.make([:]).writeTo(new StringWriter()) }
'Freemarker (simple, no binding)' { ftlTemplate1.process([:], new StringWriter()) }
'MarkupTemplateEngine (simple binding)' { mkpTemplate2.make(model).writeTo(new StringWriter()) }
'Freemarker (simple binding)' { ftlTemplate2.process(model, new StringWriter()) }
'MarkupTemplateEngine (simple toUpper)' { mkpTemplate3.make(model).writeTo(new StringWriter()) }
'Freemarker (simple toUpper)' { ftlTemplate3.process(model, new StringWriter()) }
'MarkupTemplateEngine (typed toUpper)' { mkpTemplate3_typed.make(model).writeTo(new StringWriter()) }
'MarkupTemplateEngine loop' { mkpTemplate4.make(model).writeTo(new StringWriter()) }
'MarkupTemplateEngine typed for loop' { mkpTemplate4_typed.make(model).writeTo(new StringWriter()) }
'FreeMarker loop' { ftlTemplate4.process(model, new StringWriter()) }
}
r.prettyPrint()
@melix
Copy link
Author

melix commented Feb 14, 2014

Based on the latest sources (melix/groovy-core@524b948), here are the results:

Environment
===========
* Groovy: #ImplementationVersion#
* JVM: Java HotSpot(TM) 64-Bit Server VM (24.0-b48, Oracle Corporation)
    * JRE: 1.7.0_40-ea
    * Total Memory: 504 MB
    * Maximum Memory: 1765.5 MB
* OS: Linux (3.8.0-22-generic, amd64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

                                           user  system   cpu  real

MarkupTemplateEngine (simple, no binding)   644       8   652   660
Freemarker (simple, no binding)             378       6   384   394
MarkupTemplateEngine (simple binding)       921       0   921   922
Freemarker (simple binding)                 753       2   755   763
MarkupTemplateEngine (simple toUpper)       975      12   987   987
Freemarker (simple toUpper)                 884       2   886   905
MarkupTemplateEngine (typed toUpper)        992       4   996   997
MarkupTemplateEngine loop                  3998       7  4005  4007
MarkupTemplateEngine typed for loop        2721      13  2734  2742
FreeMarker loop                            2782       0  2782  2813

@melix
Copy link
Author

melix commented Feb 14, 2014

Even better after small tweaks:

Environment
===========
* Groovy: #ImplementationVersion#
* JVM: Java HotSpot(TM) 64-Bit Server VM (24.0-b48, Oracle Corporation)
    * JRE: 1.7.0_40-ea
    * Total Memory: 274 MB
    * Maximum Memory: 1765.5 MB
* OS: Linux (3.8.0-22-generic, amd64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

                                           user  system   cpu  real

MarkupTemplateEngine (simple, no binding)   609       0   609   615
Freemarker (simple, no binding)             400       0   400   410
MarkupTemplateEngine (simple binding)       628       3   631   631
Freemarker (simple binding)                 864       0   864   877
MarkupTemplateEngine (simple toUpper)       681       0   681   690
Freemarker (simple toUpper)                 972       0   972   986
MarkupTemplateEngine (typed toUpper)        696       3   699   706
MarkupTemplateEngine loop                  2927      12  2939  2949
MarkupTemplateEngine typed for loop        2579       0  2579  2615
FreeMarker loop                            2862       0  2862  2894

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment