initial commit
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
1
benchmark/src/main/resources/render_template_test.txt
Normal file
1
benchmark/src/main/resources/render_template_test.txt
Normal file
@@ -0,0 +1 @@
|
||||
This is a ${adjective} test made by ${author} on ${date}. It's really ${adjective}!
|
@@ -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()
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user