mirror of
https://github.com/lucaspalomodevelop/txtmark.git
synced 2026-03-12 23:37:22 +00:00
Added basic benchmark, run with 'mvn -Dtest=Benchmark test'.
This commit is contained in:
parent
c73396f48d
commit
4a83662310
362
src/test/java/com/github/rjeschke/txtmark/Benchmark.java
Normal file
362
src/test/java/com/github/rjeschke/txtmark/Benchmark.java
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011-2015 René Jeschke <rene_jeschke@yahoo.de>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.github.rjeschke.txtmark;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class Benchmark
|
||||||
|
{
|
||||||
|
// random seed to use for text generation, >= 0 sets seed, < 0 uses random
|
||||||
|
private static final long SEED = 0;
|
||||||
|
// number of runs
|
||||||
|
private static final int RUNS = 8;
|
||||||
|
// perform an additional (hidden) warm-up run
|
||||||
|
private static final boolean WARMUP_RUN = true;
|
||||||
|
private static final int MIN_WORD_LENGTH = 3;
|
||||||
|
private static final int MAX_WORD_LENGTH = 10;
|
||||||
|
private static final int MAX_LINE_LENGTH = 80;
|
||||||
|
private static final int LINES_PER_PARAGRAPH = 20;
|
||||||
|
// number of paragraphs to create
|
||||||
|
private static final int NUM_PARAGRAPHS = 30;
|
||||||
|
|
||||||
|
// scratch area
|
||||||
|
private static int REF_COUNTER = 0;
|
||||||
|
|
||||||
|
private static String createWord(final Random rnd, final int minLength, final int maxLength)
|
||||||
|
{
|
||||||
|
final int len = rnd.nextInt(maxLength - minLength) + minLength;
|
||||||
|
final char[] ret = new char[len];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
ret[i] = (char)('a' + rnd.nextInt(26));
|
||||||
|
}
|
||||||
|
return new String(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface WLDecorator
|
||||||
|
{
|
||||||
|
public String decorate(String word);
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface ParagraphDecorator
|
||||||
|
{
|
||||||
|
public void startParagraph(StringBuilder out);
|
||||||
|
|
||||||
|
public void endParagraph(StringBuilder out);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static String createText(
|
||||||
|
final WLDecorator wordDecorator,
|
||||||
|
final WLDecorator lineDecorator,
|
||||||
|
final ParagraphDecorator paragraphDecorator)
|
||||||
|
{
|
||||||
|
final Random rnd = new Random();
|
||||||
|
if (SEED >= 0)
|
||||||
|
{
|
||||||
|
rnd.setSeed(SEED);
|
||||||
|
}
|
||||||
|
|
||||||
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
final StringBuilder line = new StringBuilder();
|
||||||
|
|
||||||
|
boolean initParagraph = true;
|
||||||
|
|
||||||
|
for (int lineLength = 0, lineCount = 0, paraCount = 0; paraCount < NUM_PARAGRAPHS;)
|
||||||
|
{
|
||||||
|
if (initParagraph)
|
||||||
|
{
|
||||||
|
if (paragraphDecorator != null)
|
||||||
|
{
|
||||||
|
paragraphDecorator.startParagraph(sb);
|
||||||
|
}
|
||||||
|
initParagraph = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String word = createWord(rnd, MIN_WORD_LENGTH, MAX_WORD_LENGTH);
|
||||||
|
final String decorated = wordDecorator != null ? wordDecorator.decorate(word) : word;
|
||||||
|
|
||||||
|
lineLength += word.length();
|
||||||
|
line.append(decorated);
|
||||||
|
|
||||||
|
if (lineLength < MAX_LINE_LENGTH)
|
||||||
|
{
|
||||||
|
lineLength++;
|
||||||
|
line.append(' ');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (lineDecorator != null)
|
||||||
|
{
|
||||||
|
sb.append(lineDecorator.decorate(line.toString()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.append(line);
|
||||||
|
}
|
||||||
|
sb.append('\n');
|
||||||
|
lineCount++;
|
||||||
|
lineLength = 0;
|
||||||
|
line.setLength(0);
|
||||||
|
|
||||||
|
if (lineCount >= LINES_PER_PARAGRAPH)
|
||||||
|
{
|
||||||
|
lineCount = 0;
|
||||||
|
sb.append('\n');
|
||||||
|
paraCount++;
|
||||||
|
if (paragraphDecorator != null)
|
||||||
|
{
|
||||||
|
paragraphDecorator.endParagraph(sb);
|
||||||
|
}
|
||||||
|
initParagraph = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static WLDecorator EMPHASIS = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "*" + word + "*";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator STRONG = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "**" + word + "**";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator EMPHASIS_STRONG = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "***" + word + "***";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator INLINE_CODE = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "`" + word + "`";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator LINKS = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "[" + word + "](http://www.example.com/" + word + ")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator REF_LINKS = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
final int id = REF_COUNTER++;
|
||||||
|
return "[" + word + "][id" + id + "]";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static ParagraphDecorator REF_LINKS_PARA = new ParagraphDecorator()
|
||||||
|
{
|
||||||
|
private int startId = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startParagraph(final StringBuilder out)
|
||||||
|
{
|
||||||
|
this.startId = REF_COUNTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endParagraph(final StringBuilder out)
|
||||||
|
{
|
||||||
|
for (int i = this.startId; i < REF_COUNTER; i++)
|
||||||
|
{
|
||||||
|
out.append("[id");
|
||||||
|
out.append(i);
|
||||||
|
out.append("]: http://www.example.com/");
|
||||||
|
out.append(i);
|
||||||
|
out.append('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator HTML_WRAP = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "<span>" + word + "</span>";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator MANUAL_LINE_BREAKS = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return word + " ";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator CODE_LINES = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return " " + word;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final static WLDecorator BLOCK_QUOTE = new WLDecorator()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public String decorate(final String word)
|
||||||
|
{
|
||||||
|
return "> " + word;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static class Settings
|
||||||
|
{
|
||||||
|
private final WLDecorator wordDecorator;
|
||||||
|
private final WLDecorator lineDecorator;
|
||||||
|
private final ParagraphDecorator paragraphDecorator;
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
private Settings(final String name)
|
||||||
|
{
|
||||||
|
this(name, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Settings(final String name, final WLDecorator wordDecorator)
|
||||||
|
{
|
||||||
|
this(name, wordDecorator, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Settings(final String name, final WLDecorator wordDecorator, final WLDecorator lineDecorator)
|
||||||
|
{
|
||||||
|
this(name, wordDecorator, lineDecorator, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Settings(final String name, final WLDecorator wordDecorator, final WLDecorator lineDecorator,
|
||||||
|
final ParagraphDecorator paragraphDecorator)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.wordDecorator = wordDecorator;
|
||||||
|
this.lineDecorator = lineDecorator;
|
||||||
|
this.paragraphDecorator = paragraphDecorator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final static Settings[] SETTINGS =
|
||||||
|
{
|
||||||
|
new Settings("default"),
|
||||||
|
new Settings("manual linebreaks", null, MANUAL_LINE_BREAKS),
|
||||||
|
new Settings("emphasis", EMPHASIS),
|
||||||
|
new Settings("strong", STRONG),
|
||||||
|
new Settings("emphasis+strong", EMPHASIS_STRONG),
|
||||||
|
new Settings("inline code", INLINE_CODE),
|
||||||
|
new Settings("full links", LINKS),
|
||||||
|
new Settings("<span> wrap", HTML_WRAP),
|
||||||
|
new Settings("code blocks", null, CODE_LINES),
|
||||||
|
new Settings("blockquote", null, BLOCK_QUOTE),
|
||||||
|
new Settings("ref links", REF_LINKS, null, REF_LINKS_PARA),
|
||||||
|
};
|
||||||
|
|
||||||
|
private static long timedProcess(final String text)
|
||||||
|
{
|
||||||
|
final long t0 = System.nanoTime();
|
||||||
|
Processor.process(text);
|
||||||
|
final long t1 = System.nanoTime();
|
||||||
|
return t1 - t0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void runTest(final Settings settings, final int runs)
|
||||||
|
{
|
||||||
|
final String testText = createText(settings.wordDecorator, settings.lineDecorator, settings.paragraphDecorator);
|
||||||
|
|
||||||
|
if (WARMUP_RUN)
|
||||||
|
{
|
||||||
|
System.gc();
|
||||||
|
timedProcess(testText);
|
||||||
|
}
|
||||||
|
|
||||||
|
final long[] times = new long[runs];
|
||||||
|
for (int i = 0; i < runs; i++)
|
||||||
|
{
|
||||||
|
System.gc();
|
||||||
|
times[i] = timedProcess(testText);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.printf("%20s |", settings.name);
|
||||||
|
long sum = 0;
|
||||||
|
for (int i = 0; i < runs; i++)
|
||||||
|
{
|
||||||
|
System.out.printf(" %8d |", times[i] / 1000);
|
||||||
|
sum += times[i];
|
||||||
|
}
|
||||||
|
System.out.printf(" %8d |", sum / (runs * 1000));
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void benchmark()
|
||||||
|
{
|
||||||
|
System.out.printf("%20s |", "Performance test");
|
||||||
|
for (int i = 0; i < RUNS; i++)
|
||||||
|
{
|
||||||
|
System.out.printf(" %8s |", "run #" + (i + 1));
|
||||||
|
}
|
||||||
|
System.out.printf(" %8s |", "average");
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
System.out.print("---------------------|");
|
||||||
|
for (int i = 0; i < RUNS + 1; i++)
|
||||||
|
{
|
||||||
|
System.out.print("----------|");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
|
||||||
|
for (final Settings s : SETTINGS)
|
||||||
|
{
|
||||||
|
runTest(s, RUNS);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.print("---------------------|");
|
||||||
|
for (int i = 0; i < RUNS + 1; i++)
|
||||||
|
{
|
||||||
|
System.out.print("----------|");
|
||||||
|
}
|
||||||
|
System.out.println();
|
||||||
|
System.out.println("All times are given in milliseconds");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user