initial commit

This commit is contained in:
2019-10-28 19:02:45 +00:00
commit 5a644ac6b5
33 changed files with 1769 additions and 0 deletions

15
benchmark/build.sbt Normal file
View File

@@ -0,0 +1,15 @@
organization := (organization in LocalRootProject).value
name := "jwo-benchmark"
version := (version in LocalRootProject).value
resourceDirectory in Compile := (resourceDirectory in(LocalRootProject, Test)).value
skip in publish := true
maintainer := (maintainer in LocalRootProject).value
mainClass := Some("net.woggioni.jwo.benchmark.Main")
fork := true
// libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.6",
// libraryDependencies += "org.tukaani" % "xz" % "1.8",
// libraryDependencies += "com.beust" % "jcommander" % "1.72",
// libraryDependencies += "org.projectlombok" % "lombok" % "1.18.8" % Provided
enablePlugins(JavaAppPackaging)
enablePlugins(UniversalPlugin)

View File

@@ -0,0 +1,34 @@
package net.woggioni.jwo.benchmark;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NaiveTemplateRenderer {
public static String renderTemplateNaive(String template, Map<String, Object> valuesMap){
StringBuffer formatter = new StringBuffer(template);
Object absent = new Object();
Matcher matcher = Pattern.compile("\\$\\{(\\w+)}").matcher(template);
while (matcher.find()) {
String key = matcher.group(1);
String formatKey = String.format("${%s}", key);
int index = formatter.indexOf(formatKey);
// If the key is present:
// - If the value is not null, then replace the variable for the value
// - If the value is null, replace the variable for empty string
// If the key is not present, leave the variable untouched.
if (index != -1) {
Object value = valuesMap.getOrDefault(key, absent);
if(value != absent) {
String valueStr = value != null ? value.toString() : "";
formatter.replace(index, index + formatKey.length(), valueStr);
}
}
}
return formatter.toString();
}
}

View File

@@ -0,0 +1 @@
This is a ${adjective} test made by ${author} on ${date}. It's really ${adjective}!

View File

@@ -0,0 +1,47 @@
package net.woggioni.jwo.benchmark
import java.io.{InputStream, InputStreamReader, Reader}
import net.woggioni.jwo.io.CircularInputStream
import net.woggioni.jwo.{Chronometer, JWO}
import scala.collection.JavaConverters._
object Main {
def withBenchmarkReader(fn : Reader => Unit) = {
val reader = new InputStreamReader(classOf[JWO].getResourceAsStream("/render_template_test.txt"))
val is : InputStream = new CircularInputStream(JWO.readAll(reader).getBytes, 10000)
try {
fn(new InputStreamReader(is))
} finally {
if (reader != null) reader.close()
}
}
def renderTemplateBenchmark() {
val valuesMap = Map[String, Object]("author" -> "John Doe",
"date" -> "2020-03-25 16:22",
"adjective" -> "simple")
withBenchmarkReader(
reader => {
val chronometer = new Chronometer
val result = JWO.renderTemplate(reader, valuesMap.asJava)
printf("Elapsed time: %.3f\n", chronometer.elapsed(Chronometer.UnitOfMeasure.SECONDS))
}
)
withBenchmarkReader(
reader => {
val chronometer = new Chronometer
val result = NaiveTemplateRenderer.renderTemplateNaive(JWO.readAll(reader), valuesMap.asJava)
printf("Elapsed time: %.3f\n", chronometer.elapsed(Chronometer.UnitOfMeasure.SECONDS))
}
)
}
def main(argv : Array[String]) = {
renderTemplateBenchmark()
}
}