<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fastjack</id>
	<title>Byte-Welt Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.byte-welt.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fastjack"/>
	<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php/Spezial:Beitr%C3%A4ge/Fastjack"/>
	<updated>2026-07-22T08:13:07Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Voodoo-Kiste&amp;diff=5299</id>
		<title>Voodoo-Kiste</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Voodoo-Kiste&amp;diff=5299"/>
		<updated>2013-08-07T15:57:42Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: Die Seite wurde neu angelegt: „Kategorie:Java == String-Magic Level 1 ==  Der erste Eintrag der lustigen Java-Voodookiste widmet sich ganz einfach mal der wunderbaren Kunst der Stringkonkat…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
== String-Magic Level 1 ==&lt;br /&gt;
&lt;br /&gt;
Der erste Eintrag der lustigen Java-Voodookiste widmet sich ganz einfach mal der wunderbaren Kunst der Stringkonkatenation. Ein wenig Mystery ist auch dabei, ganz bestimmt &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
        System.out.println(&amp;quot;funny concat             : &amp;quot; + 1 + 1); // it&#039;s okay if you first think it&#039;s 2&lt;br /&gt;
        System.out.println(&amp;quot;stupid funny concat      : &amp;quot; + + + + + + 1 + + + + 1); // &amp;lt;- yeah! wth?&lt;br /&gt;
        System.out.println(&amp;quot;stupid funny concat      : &amp;quot; +- + + +- + + -+-1 + + + + -+-1); // &amp;lt;- omg! wtf?!?!?!&lt;br /&gt;
        System.out.println(&amp;quot;so nice :)               : &amp;quot; + - - - - - - + 1 +- - - -1); // &amp;lt;- omfg!!! wtfh?!???!!!&lt;br /&gt;
        //System.out.println(&amp;quot;never ever 1st :(        : &amp;quot; ++ 1); // never ever, you cannot do so, never, believe it :)&lt;br /&gt;
        //System.out.println(&amp;quot;never ever 2nd :(        : &amp;quot; + -- 1); // absolutely no!&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Integer-Magic Level 1 ==&lt;br /&gt;
&lt;br /&gt;
Es folgt ein mächtiger Kniff aus der Java-Voodookiste mit anschließendem Brain**** am Ende:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
        Integer i0 = 5000;&lt;br /&gt;
        Integer i1 = 5000;&lt;br /&gt;
        System.out.println(i0 == i1); // ok, we should know this is false, or not? Look at the end ;)&lt;br /&gt;
        System.out.println(i0.intValue() == i1.intValue()); // yeah, it&#039;s right mister&lt;br /&gt;
        // let&#039;s try smaller values&lt;br /&gt;
        i0 = 127;&lt;br /&gt;
        i1 = 127;&lt;br /&gt;
        System.out.println(i0.intValue() == i1.intValue()); // yeees sir!&lt;br /&gt;
        System.out.println(i0 == i1); // wth?&lt;br /&gt;
        i0 = -128;&lt;br /&gt;
        i1 = -128;&lt;br /&gt;
        System.out.println(i0 == i1); // wtfh?!?!?!&lt;br /&gt;
        // try this: give the VM the following VM-Argument -Djava.lang.Integer.IntegerCache.high=5001&lt;br /&gt;
        // and things becomes very scary ;)&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Byte-Magic Level 1 ==&lt;br /&gt;
&lt;br /&gt;
Zur Abwechslung der Grundkurs Byte-Magic für Level 1 Wizards &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
        byte b = 1; // ok, it&#039;s nice too see&lt;br /&gt;
        //byte b = 128; // we know that&#039;s not compiling ;)&lt;br /&gt;
        //b = b + 127; // hey, we know this too :) it&#039;s absolutely safe, ever!&lt;br /&gt;
        b += 127; // but wth?&lt;br /&gt;
        b ++; // omg!!!&lt;br /&gt;
        b ++; // wtf?!?!?&lt;br /&gt;
        for(int i = 0; i &amp;lt; 169; i ++) {&lt;br /&gt;
            b ++; // yeah!&lt;br /&gt;
        }&lt;br /&gt;
        b --;&lt;br /&gt;
        System.out.println(b); // the solution of the biggest question ever!&lt;br /&gt;
 &lt;br /&gt;
        short s = 1;&lt;br /&gt;
        s = Short.MAX_VALUE;&lt;br /&gt;
        //s = s + 1; // yeah! it&#039;s not compiling mister ;)&lt;br /&gt;
        s += 1; // ok, we like bytes, we like you too!&lt;br /&gt;
        // and so on ... you already know the solution :)&lt;br /&gt;
 &lt;br /&gt;
        int i = 1;&lt;br /&gt;
        i = Integer.MAX_VALUE;&lt;br /&gt;
        i = i + 1; // don&#039;t be panic OO&lt;br /&gt;
        i = i + 10; // we like byte and short more than other numeric types ;)&lt;br /&gt;
        System.out.println(i); // it&#039;s something crazy...&lt;br /&gt;
 &lt;br /&gt;
        char c = 1;&lt;br /&gt;
        c = 65535; // yeah, you know the c64?&lt;br /&gt;
        //c = c + 1; // ok char, we like you too ;) don&#039;t compile this :)&lt;br /&gt;
        c ++;&lt;br /&gt;
        c ++;&lt;br /&gt;
        System.out.println((char) (c - Short.MAX_VALUE)); // because you&#039;re funny as bytes and shorts :)&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Write-through-Magic Level 1 ==&lt;br /&gt;
&lt;br /&gt;
Es folgt ein kleiner Ausflug in die Kunst des Durchschreibenden-Voodoozaubers von Ank-Pheng. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
        // lets create a simple list&lt;br /&gt;
        List&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
        list.add(&amp;quot;a&amp;quot;);&lt;br /&gt;
        list.add(&amp;quot;b&amp;quot;);&lt;br /&gt;
        list.add(&amp;quot;c&amp;quot;);&lt;br /&gt;
        String[] array = list.toArray(new String[0]); // create an array from it&lt;br /&gt;
        System.out.println(&amp;quot;1st list      : &amp;quot; + list); // ok, i know i know!&lt;br /&gt;
        System.out.println(&amp;quot;1st array-size: &amp;quot; + array.length); // yeah, i expected this ;)&lt;br /&gt;
        System.out.println(&amp;quot;set &#039;a&#039; to &#039;z&#039; in list ...&amp;quot;); // ok chummer!&lt;br /&gt;
        list.set(0, &amp;quot;z&amp;quot;);&lt;br /&gt;
        System.out.println(&amp;quot;1st list      : &amp;quot; + list); // where&#039;s the trick here?&lt;br /&gt;
        System.out.println(&amp;quot;1st array[0]  : &amp;quot; + array[0]); // no trick! what you think? We don&#039;t summon demons or cast spells here, ever! ever ever!&lt;br /&gt;
        // let&#039;s create a simple array&lt;br /&gt;
        array = new String[]{&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;};&lt;br /&gt;
        list = Arrays.asList(array); // create a list from it&lt;br /&gt;
        System.out.println(&amp;quot;2nd list      : &amp;quot; + list); // ok, i already know it!&lt;br /&gt;
        System.out.println(&amp;quot;2nd array size: &amp;quot; + array.length); // yessss! what you expect here?&lt;br /&gt;
        System.out.println(&amp;quot;set first element to &#039;z&#039; in array ...&amp;quot;); // try it baby! try!&lt;br /&gt;
        array[0] = &amp;quot;z&amp;quot;;&lt;br /&gt;
        System.out.println(&amp;quot;2nd array[0]  : &amp;quot; + array[0]); // yeah! i know!!!&lt;br /&gt;
        System.out.println(&amp;quot;2nd list      : &amp;quot; + list); // omg!!! wtfh?!?!?! i can&#039;t believe... &lt;br /&gt;
        // believe the power of write-through magic ;)&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Weihnachtsbaum&amp;diff=5298</id>
		<title>Weihnachtsbaum</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Weihnachtsbaum&amp;diff=5298"/>
		<updated>2013-08-07T15:52:42Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
&lt;br /&gt;
Da viele immer mal wieder einen Weihnachtsbaum erstellen möchten, stelle ich mal meinen vor Wem es hilft, der kann sich gerne bedienen.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ChristmasTreeTest.java&lt;br /&gt;
 *&lt;br /&gt;
 * 05.01.2012&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2012 fastjack&lt;br /&gt;
 */&lt;br /&gt;
package blog.tree;&lt;br /&gt;
 &lt;br /&gt;
import org.junit.*;&lt;br /&gt;
 &lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
 &lt;br /&gt;
public class ChristmasTreeTest {&lt;br /&gt;
    private static final String LINE_END = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    @Test(expected=IllegalArgumentException.class)&lt;br /&gt;
    public void failCreateWithNegativeHigh() {&lt;br /&gt;
        new ChristmasTree(-1);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test(expected=IllegalArgumentException.class)&lt;br /&gt;
    public void failCreateWithZeroHigh() {&lt;br /&gt;
        new ChristmasTree(0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfOne() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;*&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;|&amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(1).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfTwo() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot; * &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;***&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; | &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(2).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfThree() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;  *  &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; *** &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*****&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;  |  &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(3).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfFour() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;   *   &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;  ***  &amp;quot;).append(LINE_END); &lt;br /&gt;
        expected.append(&amp;quot; ***** &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*******&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;   |   &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(4).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfFive() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;    *    &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;   ***   &amp;quot;).append(LINE_END); &lt;br /&gt;
        expected.append(&amp;quot;  *****  &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; ******* &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*********&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;    |    &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(5).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ChristmasTree.java&lt;br /&gt;
 *&lt;br /&gt;
 * 05.01.2012&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2012 fastjack&lt;br /&gt;
 */&lt;br /&gt;
package blog.tree;&lt;br /&gt;
 &lt;br /&gt;
import org.apache.commons.lang.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * This class defines a christmas tree. After construction the tree can represented as String &lt;br /&gt;
 * via the toString() method.&lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 * System.out.println(new ChristmasTree(3).toString());&lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * prints out a christmas tree with a height of three in form: &lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 *   *  &lt;br /&gt;
 *  *** &lt;br /&gt;
 * *****&lt;br /&gt;
 *   |  &lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * the idea for defined height n is&lt;br /&gt;
 *  &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 *        // 2n-1 lines for body&lt;br /&gt;
 *   *    // for actual row (beginning at zero) r print out 2(r+1)-1 stars&lt;br /&gt;
 *  ***   // &lt;br /&gt;
 *  |.|   // if actual column is in star printing area |.| including the | then print a star &lt;br /&gt;
 *  |.|   // otherwise a space &lt;br /&gt;
 * *****  //&lt;br /&gt;
 *   |    // and a separate line for the centered trunk&lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 */&lt;br /&gt;
public class ChristmasTree {&lt;br /&gt;
    private static final String TRUNK = &amp;quot;|&amp;quot;;&lt;br /&gt;
    private static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
    private static final String STAR = &amp;quot;*&amp;quot;;&lt;br /&gt;
    private static final String LINE_END = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
    private int height;&lt;br /&gt;
    private int maxTreeWidth;&lt;br /&gt;
    private int halfOfTreeWidth;&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Creates a christmas tree for the defined height.&lt;br /&gt;
     * &lt;br /&gt;
     * @param height the height of the tree must be greater than zero&lt;br /&gt;
     */&lt;br /&gt;
    public ChristmasTree(int height) {&lt;br /&gt;
        Validate.isTrue(height &amp;gt; 0, &amp;quot;height must be greater than zero!&amp;quot;);&lt;br /&gt;
        this.height = height;&lt;br /&gt;
        maxTreeWidth = 2 * height - 1;&lt;br /&gt;
        halfOfTreeWidth = maxTreeWidth / 2;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        StringBuilder s = new StringBuilder();&lt;br /&gt;
        s.append(makeBody());&lt;br /&gt;
        s.append(makeBottomLineWithTrunk());&lt;br /&gt;
        return s.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String makeBody() {&lt;br /&gt;
        StringBuilder lines = new StringBuilder();&lt;br /&gt;
        for(int row = 0; row &amp;lt; height; row ++) {&lt;br /&gt;
            int numberOfStarsInRow = getNumberOfStarsInRow(row);&lt;br /&gt;
            int startOfStarPrinting = getStartColumnToPrintStars(numberOfStarsInRow);&lt;br /&gt;
            int endOfStarPrinting = startOfStarPrinting + numberOfStarsInRow;&lt;br /&gt;
            lines.append(makeLine(startOfStarPrinting, endOfStarPrinting));&lt;br /&gt;
        }&lt;br /&gt;
        return lines.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private int getNumberOfStarsInRow(int row) {&lt;br /&gt;
        return 2 * (row + 1) - 1;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private int getStartColumnToPrintStars(int numberOfStarsInRow) {&lt;br /&gt;
        return halfOfTreeWidth - (numberOfStarsInRow / 2);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private StringBuilder makeLine(int startOfStarPrinting, int endOfStarPrinting) {&lt;br /&gt;
        StringBuilder line = new StringBuilder();&lt;br /&gt;
        for(int column = 0; column &amp;lt; maxTreeWidth; column ++) {&lt;br /&gt;
            if (isStarToPrint(startOfStarPrinting, endOfStarPrinting, column)) {&lt;br /&gt;
                line.append(STAR);&lt;br /&gt;
            } else {&lt;br /&gt;
                line.append(SPACE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        line.append(LINE_END);&lt;br /&gt;
        return line;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private boolean isStarToPrint(int startOfStarPrinting, int endOfStarPrinting, int column) {&lt;br /&gt;
        return column &amp;gt;= startOfStarPrinting &amp;amp;&amp;amp; column &amp;lt; endOfStarPrinting;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String makeBottomLineWithTrunk() {&lt;br /&gt;
        StringBuilder bottom = new StringBuilder();&lt;br /&gt;
        for(int column = 0; column &amp;lt; maxTreeWidth; column ++) {&lt;br /&gt;
            if (column == maxTreeWidth / 2) {&lt;br /&gt;
                bottom.append(TRUNK);&lt;br /&gt;
            } else {&lt;br /&gt;
                bottom.append(SPACE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        bottom.append(LINE_END);&lt;br /&gt;
        return bottom.toString();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Formatierte_Tabellen_auf_der_Console_ausgeben&amp;diff=5297</id>
		<title>Formatierte Tabellen auf der Console ausgeben</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Formatierte_Tabellen_auf_der_Console_ausgeben&amp;diff=5297"/>
		<updated>2013-08-07T15:51:46Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
Die folgende Klasse kann auf einfache Art und Weise eine formatierte Texttabelle als String erzeugen. Dabei können zusätzlich die Formatierungseigenschaften der Klasse java.util.Formatter verwendet werden. Die Formatierung ähnelt den Konsolenausgaben von MySQL-Anfragen. Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Table.java&lt;br /&gt;
 *&lt;br /&gt;
 * 14.10.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.text;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * This class defines a simple formatted text table. It can be used to create simple formatted&lt;br /&gt;
 * text tables (like MySQL console outputs) with the formatting stuff from class&lt;br /&gt;
 * &amp;quot;java.util.Formatter&amp;quot; defined in the enumerations.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 */&lt;br /&gt;
public class Table {&lt;br /&gt;
    private List&amp;lt;Col&amp;gt; cols = new ArrayList&amp;lt;Col&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Row&amp;gt; rows = new ArrayList&amp;lt;Row&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name) {&lt;br /&gt;
        this.cols.add(new Col(name));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, null, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param conversion the conversion&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Conversions conversion, Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, conversion, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param conversion the conversion&lt;br /&gt;
     * @param dtconversion the date/timeconversion&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Conversions conversion, DateTimeConversions dtconversion,&lt;br /&gt;
            Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, conversion, dtconversion, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the col size.&lt;br /&gt;
     *&lt;br /&gt;
     * @return the col size&lt;br /&gt;
     */&lt;br /&gt;
    public int getColSize() {&lt;br /&gt;
        return this.cols.size();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index the index&lt;br /&gt;
     * @return the col&lt;br /&gt;
     */&lt;br /&gt;
    public Col getCol(int index) {&lt;br /&gt;
        return this.cols.get(index);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the row size.&lt;br /&gt;
     *&lt;br /&gt;
     * @return the row size&lt;br /&gt;
     */&lt;br /&gt;
    public int getRowSize() {&lt;br /&gt;
        return this.rows.size();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the row.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index the index&lt;br /&gt;
     * @return the row&lt;br /&gt;
     */&lt;br /&gt;
    public Row getRow(int index) {&lt;br /&gt;
        return this.rows.get(index);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds the row.&lt;br /&gt;
     *&lt;br /&gt;
     * @param values the values&lt;br /&gt;
     */&lt;br /&gt;
    public void addRow(Object... values) {&lt;br /&gt;
        this.rows.add(new Row(values));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        StringBuilder s1 = new StringBuilder();&lt;br /&gt;
        StringBuilder s2 = new StringBuilder();&lt;br /&gt;
        // data&lt;br /&gt;
        for (int i = 0, n = this.rows.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Row r = this.rows.get(i);&lt;br /&gt;
            for (int ii = 0, nn = this.cols.size(); ii &amp;lt; nn; ii++) {&lt;br /&gt;
                Col c = this.cols.get(ii);&lt;br /&gt;
                Object o = r.getValue(ii);&lt;br /&gt;
                if (c.getConversion() == null) {&lt;br /&gt;
                    c.setConversion(this.getConversionForType(o));&lt;br /&gt;
                }&lt;br /&gt;
                int nl = Math.max(c.getName().length(), String.valueOf(o).length());&lt;br /&gt;
                if (nl &amp;gt; c.getWidth()) {&lt;br /&gt;
                    c.width = nl;&lt;br /&gt;
                }&lt;br /&gt;
                int ol = String.format(this.getToken(o, c.getWidth(), c.getConversion(),&lt;br /&gt;
                        c.getDateTimeConversion(), c.getFlags()), o).length();&lt;br /&gt;
                if (ol &amp;gt; c.getWidth()) {&lt;br /&gt;
                    c.width = ol;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 0, n = this.rows.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Row r = this.rows.get(i);&lt;br /&gt;
            StringBuilder data = new StringBuilder();&lt;br /&gt;
            for (int ii = 0, nn = this.cols.size(); ii &amp;lt; nn; ii++) {&lt;br /&gt;
                Col c = this.cols.get(ii);&lt;br /&gt;
                Object o = r.getValue(ii);&lt;br /&gt;
                data.append(&amp;quot;| &amp;quot;);&lt;br /&gt;
                data.append(this.getToken(o, c.getWidth(), c.getConversion(),&lt;br /&gt;
                        c.getDateTimeConversion(), c.getFlags()));&lt;br /&gt;
                if (ii &amp;lt; nn - 1) {&lt;br /&gt;
                    data.append(&amp;quot; &amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            data.append(&amp;quot; |\n&amp;quot;);&lt;br /&gt;
            s2.append(String.format(data.toString(), r.getValues()));&lt;br /&gt;
        }&lt;br /&gt;
        // head&lt;br /&gt;
        StringBuilder sep = new StringBuilder();&lt;br /&gt;
        StringBuilder begin = new StringBuilder();&lt;br /&gt;
        StringBuilder end = new StringBuilder();&lt;br /&gt;
        StringBuilder head = new StringBuilder();&lt;br /&gt;
        Object[] oa = new Object[this.cols.size()];&lt;br /&gt;
        for (int i = 0, n = this.cols.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Col c = this.cols.get(i);&lt;br /&gt;
            oa[i] = c.getName();&lt;br /&gt;
            if (i == 0) {&lt;br /&gt;
                begin.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                begin.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            head.append(&amp;quot;| %&amp;quot;);&lt;br /&gt;
            head.append(String.valueOf(c.getWidth()));&lt;br /&gt;
            head.append(&amp;quot;s&amp;quot;);&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; c.getWidth() + 2; ii++) {&lt;br /&gt;
                begin.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            if (i &amp;lt; n - 1) {&lt;br /&gt;
                head.append(&amp;quot; &amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        begin.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        sep.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        end.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        head.append(&amp;quot; |\n&amp;quot;);&lt;br /&gt;
        s1.append(begin);&lt;br /&gt;
        s1.append(String.format(head.toString(), oa));&lt;br /&gt;
        s1.append(sep);&lt;br /&gt;
        s1.append(s2);&lt;br /&gt;
        s1.append(end);&lt;br /&gt;
        return s1.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String getToken(Object object, int width, Conversions conversion,&lt;br /&gt;
            DateTimeConversions dtconversion, Flags... flags) {&lt;br /&gt;
        StringBuilder s = new StringBuilder();&lt;br /&gt;
        s.append(&amp;quot;%&amp;quot;);&lt;br /&gt;
        if (flags != null &amp;amp;&amp;amp; flags.length &amp;gt; 0) {&lt;br /&gt;
            for (int i = 0; i &amp;lt; flags.length; i++) {&lt;br /&gt;
                Flags f = flags[i];&lt;br /&gt;
                s.append(f.getToken());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (width &amp;gt; 0) {&lt;br /&gt;
            s.append(width);&lt;br /&gt;
        }&lt;br /&gt;
        if (conversion != null) {&lt;br /&gt;
            s.append(conversion.getToken());&lt;br /&gt;
        } else {&lt;br /&gt;
            s.append(this.getConversionForType(object).getToken());&lt;br /&gt;
        }&lt;br /&gt;
        if (dtconversion != null) {&lt;br /&gt;
            s.append(dtconversion.getToken());&lt;br /&gt;
        }&lt;br /&gt;
        return s.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private Conversions getConversionForType(Object object) {&lt;br /&gt;
        if (object instanceof Byte) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Short) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Integer) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Character) {&lt;br /&gt;
            return Conversions.CHARACTER;&lt;br /&gt;
        } else if (object instanceof Long) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Float) {&lt;br /&gt;
            return Conversions.FLOAT;&lt;br /&gt;
        } else if (object instanceof Double) {&lt;br /&gt;
            return Conversions.FLOAT;&lt;br /&gt;
        } else if (object instanceof Boolean) {&lt;br /&gt;
            return Conversions.BOOLEAN;&lt;br /&gt;
        } else if (object instanceof String) {&lt;br /&gt;
            return Conversions.STRING;&lt;br /&gt;
        } else {&lt;br /&gt;
            return Conversions.STRING;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klasse für die Zeilen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This class defines a row, containing an object arry with values.&lt;br /&gt;
     */&lt;br /&gt;
    public class Row {&lt;br /&gt;
        private Object[] values = null;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new row.&lt;br /&gt;
         *&lt;br /&gt;
         * @param values the values&lt;br /&gt;
         */&lt;br /&gt;
        public Row(Object[] values) {&lt;br /&gt;
            super();&lt;br /&gt;
            this.values = values;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the value.&lt;br /&gt;
         *&lt;br /&gt;
         * @param index the index&lt;br /&gt;
         * @return the value&lt;br /&gt;
         */&lt;br /&gt;
        public Object getValue(int index) {&lt;br /&gt;
            return this.values[index];&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the values.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the values&lt;br /&gt;
         */&lt;br /&gt;
        public Object[] getValues() {&lt;br /&gt;
            return this.values;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klasse für die Spalten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This class defines a column.&lt;br /&gt;
     */&lt;br /&gt;
    public class Col {&lt;br /&gt;
        private Flags[] flags = null;&lt;br /&gt;
        private Conversions conversion = null;&lt;br /&gt;
        private DateTimeConversions dateTimeConversion = null;&lt;br /&gt;
        private String name = &amp;quot;&amp;quot;;&lt;br /&gt;
        private int width = 0;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name) {&lt;br /&gt;
            this(name, null);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         * @param conversion the conversion&lt;br /&gt;
         * @param flags the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name, Conversions conversion, Flags... flags) {&lt;br /&gt;
            this(name, conversion, null, flags);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         * @param conversion the conversion&lt;br /&gt;
         * @param dateTimeConversion the date time conversion&lt;br /&gt;
         * @param flags the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name, Conversions conversion, DateTimeConversions dateTimeConversion,&lt;br /&gt;
                Flags... flags) {&lt;br /&gt;
            super();&lt;br /&gt;
            this.dateTimeConversion = dateTimeConversion;&lt;br /&gt;
            this.conversion = conversion;&lt;br /&gt;
            this.flags = flags;&lt;br /&gt;
            this.name = name;&lt;br /&gt;
            this.width = this.name.length();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the name.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the name&lt;br /&gt;
         */&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return this.name;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the conversion&lt;br /&gt;
         */&lt;br /&gt;
        public Conversions getConversion() {&lt;br /&gt;
            return this.conversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Sets the conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param conversion the new conversion&lt;br /&gt;
         */&lt;br /&gt;
        public void setConversion(Conversions conversion) {&lt;br /&gt;
            this.conversion = conversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the width.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the width&lt;br /&gt;
         */&lt;br /&gt;
        public int getWidth() {&lt;br /&gt;
            return this.width;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the flags.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Flags[] getFlags() {&lt;br /&gt;
            return this.flags;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the date time conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the date time conversion&lt;br /&gt;
         */&lt;br /&gt;
        public DateTimeConversions getDateTimeConversion() {&lt;br /&gt;
            return this.dateTimeConversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Flaggen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines the flags.&lt;br /&gt;
     */&lt;br /&gt;
    public enum Flags {&lt;br /&gt;
        LEFT(&amp;quot;-&amp;quot;),&lt;br /&gt;
        CONVERSION_DEPENDENT(&amp;quot;#&amp;quot;),&lt;br /&gt;
        SIGN(&amp;quot;+&amp;quot;),&lt;br /&gt;
        POSITIVE_LEADING_SPACE(&amp;quot;  &amp;quot;),&lt;br /&gt;
        ZERO_PADDING(&amp;quot;0&amp;quot;),&lt;br /&gt;
        LOCALE_GROUPING_SEPARATORS(&amp;quot;,&amp;quot;),&lt;br /&gt;
        PARENTHESES_FOR_NEGATIVES(&amp;quot;(&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new flag.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        Flags(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konversionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines conversions.&lt;br /&gt;
     */&lt;br /&gt;
    public enum Conversions {&lt;br /&gt;
        BOOLEAN(&amp;quot;b&amp;quot;),&lt;br /&gt;
        CHARACTER(&amp;quot;c&amp;quot;),&lt;br /&gt;
        DATE_TIME(&amp;quot;t&amp;quot;),&lt;br /&gt;
        DECIMAL(&amp;quot;d&amp;quot;),&lt;br /&gt;
        FLOAT(&amp;quot;f&amp;quot;),&lt;br /&gt;
        FLOAT_HEX(&amp;quot;a&amp;quot;),&lt;br /&gt;
        FLOAT_SCIENCE(&amp;quot;e&amp;quot;),&lt;br /&gt;
        FLOAT_SCIENCE_PREC(&amp;quot;g&amp;quot;),&lt;br /&gt;
        HEX(&amp;quot;h&amp;quot;),&lt;br /&gt;
        HEX_INT(&amp;quot;h&amp;quot;),&lt;br /&gt;
        LINE_SEPARATOR(&amp;quot;n&amp;quot;),&lt;br /&gt;
        OCTAL(&amp;quot;o&amp;quot;),&lt;br /&gt;
        PERCENT(&amp;quot;%&amp;quot;),&lt;br /&gt;
        STRING(&amp;quot;s&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        Conversions(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeit/Datums- Konversionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines date/time conversions.&lt;br /&gt;
     */&lt;br /&gt;
    public enum DateTimeConversions {&lt;br /&gt;
        FULL_MONTH_NAME(&amp;quot;B&amp;quot;),&lt;br /&gt;
        ABBREVATED_MONTH_NAME(&amp;quot;b&amp;quot;),&lt;br /&gt;
        ABBREVATED_MONTH_NAME_H(&amp;quot;h&amp;quot;),&lt;br /&gt;
        FULL_DAY_OF_THE_WEEK_NAME(&amp;quot;A&amp;quot;),&lt;br /&gt;
        SHORT_DAY_OF_THE_WEEK_NAME(&amp;quot;a&amp;quot;),&lt;br /&gt;
        FOUR_DIGIT_YEAR(&amp;quot;C&amp;quot;),&lt;br /&gt;
        LEADING_ZEROS_YEAR(&amp;quot;Y&amp;quot;),&lt;br /&gt;
        LAST_TWO_DIGITS_YEAR(&amp;quot;y&amp;quot;),&lt;br /&gt;
        THREE_DIGIT_DAY_OF_THE_YEAR(&amp;quot;j&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_MONTH(&amp;quot;m&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_DAY_OF_MONTH(&amp;quot;d&amp;quot;),&lt;br /&gt;
        DAY_OF_MONTH(&amp;quot;e&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_LEADING_24(&amp;quot;H&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_LEADING_12(&amp;quot;I&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_24(&amp;quot;k&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_12(&amp;quot;l&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_MINUTE(&amp;quot;M&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_SECOND(&amp;quot;S&amp;quot;),&lt;br /&gt;
        THREE_DIGIT_MILLISECOND(&amp;quot;L&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_NANOSECOND(&amp;quot;N&amp;quot;),&lt;br /&gt;
        MORING_AFTERNOON_MARKER(&amp;quot;p&amp;quot;),&lt;br /&gt;
        RFC822_TIME_ZONE_OFFSET(&amp;quot;z&amp;quot;),&lt;br /&gt;
        TIME_ZONE_ABBREVATION(&amp;quot;Z&amp;quot;),&lt;br /&gt;
        BEGINNING_SECONDS(&amp;quot;s&amp;quot;),&lt;br /&gt;
        BEGINNING_MILLISECONDS(&amp;quot;Q&amp;quot;),&lt;br /&gt;
        TIME_HOUR_CLOCK_24(&amp;quot;R&amp;quot;),&lt;br /&gt;
        LONG_TIME_HOUR_CLOCK_24(&amp;quot;T&amp;quot;),&lt;br /&gt;
        TIME_HOUR_CLOCK_12(&amp;quot;r&amp;quot;),&lt;br /&gt;
        LONG_DATE(&amp;quot;D&amp;quot;),&lt;br /&gt;
        ISO8601_DATE(&amp;quot;F&amp;quot;),&lt;br /&gt;
        FULL_DATE(&amp;quot;c&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new date time conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        DateTimeConversions(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Anwendungsfall:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
 public static void main(String[] args) {&lt;br /&gt;
        Table t = new Table();&lt;br /&gt;
        t = t.addCol(&amp;quot;char&amp;quot;, Flags.LEFT)&lt;br /&gt;
                .addCol(&amp;quot;byte&amp;quot;, Flags.ZERO_PADDING)&lt;br /&gt;
                .addCol(&amp;quot;short&amp;quot;, Flags.PARENTHESES_FOR_NEGATIVES, Flags.LEFT)&lt;br /&gt;
                .addCol(&amp;quot;int&amp;quot;, Flags.LOCALE_GROUPING_SEPARATORS)&lt;br /&gt;
                .addCol(&amp;quot;long&amp;quot;, Flags.LOCALE_GROUPING_SEPARATORS, Flags.SIGN)&lt;br /&gt;
                .addCol(&amp;quot;float&amp;quot;, Conversions.FLOAT_HEX)&lt;br /&gt;
                .addCol(&amp;quot;double&amp;quot;, Conversions.FLOAT_SCIENCE)&lt;br /&gt;
                .addCol(&amp;quot;boolean&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;string&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;object&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;null&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;Date&amp;quot;, Conversions.DATE_TIME, DateTimeConversions.FULL_DATE);&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) 1, 100, 100L, 1.0F, 1.0, true, &amp;quot;ab&amp;quot;, new Object(), null,&lt;br /&gt;
                new Date());&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) -1, 1000, 1000L, 1.0F, 1.0, false, &amp;quot;abbas&amp;quot;, new Object(), null,&lt;br /&gt;
                new Date());&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) 1, 10000, -10000L, 1.0F, 1.0, true, &amp;quot;sdhjsdhjdsghsdghds&amp;quot;,&lt;br /&gt;
                new Object(), null, new Date());&lt;br /&gt;
        Col c = t.getCol(0);&lt;br /&gt;
        System.out.println(t);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt die Ausgabe:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
| char | byte | short |    int |    long |   float |       double | boolean |             string |                   object | null |                          Date |&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
| a    | 0001 | 1     |    100 |    +100 | 0x1.0p0 | 1,000000e+00 |    true |                 ab | java.lang.Object@1e97676 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
| a    | 0001 | (1)   |  1.000 |  +1.000 | 0x1.0p0 | 1,000000e+00 |   false |              abbas |  java.lang.Object@7bd9f2 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
| a    | 0001 | 1     | 10.000 | -10.000 | 0x1.0p0 | 1,000000e+00 |    true | sdhjsdhjdsghsdghds | java.lang.Object@121cc40 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5296</id>
		<title>Benchmarks</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5296"/>
		<updated>2013-08-07T15:50:06Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
&lt;br /&gt;
Ich poste mal ein absichtlich stark vereinfachtes und leicht zu bedienendes Benchmarkingsystem. Es basiert nur auf zwei Klassen, nämlich dem eigentlichen System namens QuickBench und einer Schnittstelle namens Bench, das den einzelnen Benchmark darstellt. Ich denke die Benutzung ist wirklich einfach. Benches, die auf einer Objektstruktur arbeiten und mit unterschiedlich vielen Objekten gebencht werden sollen sind ebenso möglich, wie Benches, die nur eine bestimmte Funktion messen sollen, z.B. fib oder fac() und Co.&lt;br /&gt;
&lt;br /&gt;
Das System erhebt keinesfalls den Anspruch perfekt implementiert oder jetzt der neue Meilenstein in Sachen benchmarking zu sein. Falls jemandem Fehler auffallen oder konstruktive Kritik besteht, bitte einfach kommentieren.&lt;br /&gt;
&lt;br /&gt;
Das Interface Bench:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Bench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Schnittstelle beschreibt einen Benchmark.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Bench {&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return der Name.&lt;br /&gt;
     */&lt;br /&gt;
    String getName();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * setzt den Benchmark und alle Resourcen, die er benutzt in den Urzustand zur&amp;amp;uuml;ck.&lt;br /&gt;
     */&lt;br /&gt;
    void reset();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Bereitet den Benchmark zur Ausf&amp;amp;uuml;hrung vor.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark vorbereitet wird.&lt;br /&gt;
     */&lt;br /&gt;
    void prepare(long lm);&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt den Benchmark aus.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark ausgef&amp;amp;uuml;hrt wird.&lt;br /&gt;
     */&lt;br /&gt;
    void execute(long lm);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die abstrakte Klasse Bench:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * AbstractBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 06.01.2011&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Klasse stellt einen abstrakten Benchmark dar.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public abstract class AbstractBench implements Bench {&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return this.getClass().getSimpleName();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void prepare(long lm) {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void reset() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Benchmarksystem QuickBench:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * QuickBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese kleine Klasse soll ein einfaches Benchmarksystem darstellen.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class QuickBench {&lt;br /&gt;
 &lt;br /&gt;
    private final static String headerNxMSep = &amp;quot;+---------------------------+----------+-------&amp;quot;&lt;br /&gt;
            + &amp;quot;-----+----------+----------+-----------------+-----------------+&amp;quot;;&lt;br /&gt;
    private final static String headerNxM = &amp;quot;| %-25s | %8s | %10s | %8s | %8s | %15s | %15s &amp;quot;&lt;br /&gt;
            + &amp;quot;|\n&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervallSep = &amp;quot;+---------------------------+----------&amp;quot;&lt;br /&gt;
            + &amp;quot;+------------+------------+----------+----------+-----------------+-------------&amp;quot;&lt;br /&gt;
            + &amp;quot;----+&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervall = &amp;quot;| %-25s | %8s | %10s | %10s | %8s | %8s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s | %15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxM = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %,15d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxMWNT = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %15s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervall = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,8d | %,15d | %,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervallWNT = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d &amp;quot;&lt;br /&gt;
            + &amp;quot;| %,8d | %15s | %15s |\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    private QuickBench() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet. Bevor das Benchmarking&lt;br /&gt;
     * gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch den&lt;br /&gt;
     * Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Alle Benchmarks werden zu jedem Eintrag e in n i-mal (i &amp;lt;= e) wiederholt,&lt;br /&gt;
     * jeweils mit einem Wert aus dem dem angegebenen Intervall.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxIntervall(long minMs, long wm, long[] n, long mmin, long mmax,&lt;br /&gt;
            Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        System.out.printf(headerNxIntervall, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;min&amp;quot;, &amp;quot;max&amp;quot;, &amp;quot;ms&amp;quot;,&lt;br /&gt;
                &amp;quot;ms (avg)&amp;quot;, &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            qb.executeIntervall(b, n, minMs, mmin, mmax);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die z.B. einer Anzahl von Objekten basieren, aus. Der Benchmark&lt;br /&gt;
     * wird zurerst zur&amp;amp;uuml;ckgesetzt und jeweils zu einem Wert aus m vorbereitet. Bevor das&lt;br /&gt;
     * Benchmarking gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch&lt;br /&gt;
     * den Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Die Anzahl der Objekte im Feld m. Alle Benchmarks werden zu jedem Eintrag m0&lt;br /&gt;
     * in m i-mal (i &amp;lt;= m0) durchlaufen und zu jedem Eintrag n0 in n j-mal (j &amp;lt;= n0)&lt;br /&gt;
     * zu dem Wert m0 ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param m Anzahl an z.B. Objekten.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxM(long minMs, long wm, long[] n, long[] m, Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        System.out.printf(headerNxM, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;Objects&amp;quot;, &amp;quot;ms&amp;quot;, &amp;quot;ms (avg)&amp;quot;,&lt;br /&gt;
                &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; m.length; ii++) {&lt;br /&gt;
                qb.execute(b, n, minMs, m[ii]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * Zeigt Informationen zum System an.&lt;br /&gt;
     */&lt;br /&gt;
    private void showInfo() {&lt;br /&gt;
        System.out.println(&amp;quot;java version &amp;quot; + System.getProperty(&amp;quot;java.version&amp;quot;));&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.runtime.name&amp;quot;) + &amp;quot;(build &amp;quot; +&lt;br /&gt;
                System.getProperty(&amp;quot;java.runtime.version&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.vm.name&amp;quot;) + &amp;quot;(build &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.version&amp;quot;) + &amp;quot;, &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.info&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;os.name&amp;quot;) + &amp;quot;(&amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;os.version&amp;quot;) + &amp;quot;) &amp;quot; + System.getProperty(&amp;quot;os.arch&amp;quot;));&lt;br /&gt;
        System.out.println(&amp;quot;Max memory: &amp;quot; + Runtime.getRuntime().maxMemory() / (1024 * 1024)&lt;br /&gt;
                + &amp;quot;MB&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt ein warmup zu allen Benchmarks durch. Dabei werden die Benches jeweils mit den&lt;br /&gt;
     * Werten 1 vorbereitet und ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     * @param n Anzahl an Durchl&amp;amp;auml;ufen zum WarmUp.&lt;br /&gt;
     */&lt;br /&gt;
    private void warmup(Bench[] ba, long n) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ba.length; ii++) {&lt;br /&gt;
                Bench b = ba[ii];&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(1);&lt;br /&gt;
                b.execute(1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     */&lt;br /&gt;
    private void executeIntervall(Bench b, long[] n, long minMs, long mmin, long mmax) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                for (long l = mmin; l &amp;lt; mmax; l++) {&lt;br /&gt;
                    b.reset();&lt;br /&gt;
                    ms0 = -System.currentTimeMillis();&lt;br /&gt;
                    nt0 = -System.nanoTime();&lt;br /&gt;
                    b.execute(l);&lt;br /&gt;
                    nt0 += System.nanoTime();&lt;br /&gt;
                    ms0 += System.currentTimeMillis();&lt;br /&gt;
                    ms += ms0;&lt;br /&gt;
                    nt += nt0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxIntervall, b.getName(), ln, mmin, mmax, ms, ms / ln,&lt;br /&gt;
                        nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxIntervallWNT, b.getName(), ln, mmin, mmax, ms,&lt;br /&gt;
                        ms / ln, &amp;quot;...&amp;quot;, &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks zu einem gegebenen Wert aus. Der Benchmark wird zurerst&lt;br /&gt;
     * zur&amp;amp;uuml;ckgesetzt und zu dem Wert val vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param val Wert.&lt;br /&gt;
     */&lt;br /&gt;
    private void execute(Bench b, long[] n, long minMs, long val) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(val);&lt;br /&gt;
                ms0 = -System.currentTimeMillis();&lt;br /&gt;
                nt0 = -System.nanoTime();&lt;br /&gt;
                b.execute(val);&lt;br /&gt;
                nt0 += System.nanoTime();&lt;br /&gt;
                ms0 += System.currentTimeMillis();&lt;br /&gt;
                ms += ms0;&lt;br /&gt;
                nt += nt0;&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxM, b.getName(), ln, val, ms, ms / ln, nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxMWNT, b.getName(), ln, val, ms, ms / ln, &amp;quot;...&amp;quot;,&lt;br /&gt;
                        &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispiel zum Traversieren einer Liste (NxM):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
     Bench b0 = new Bench() {&lt;br /&gt;
            List&amp;lt;String&amp;gt; l = null;&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public String getName() {&lt;br /&gt;
                return &amp;quot;Traverse&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void reset() {&lt;br /&gt;
                l = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void prepare(long lm) {&lt;br /&gt;
                for (int i = 0; i &amp;lt; lm; i++) {&lt;br /&gt;
                    l.add(String.valueOf(i));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void execute(long lm) {&lt;br /&gt;
                for (int i = 0, n = l.size(); i &amp;lt; n; i++) {&lt;br /&gt;
                    String s = l.get(i);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
        QuickBench.benchNxM(10, 50000, new long[] { 10, 100, 1000 }, new long[] { 10000, 100000 },&lt;br /&gt;
                new Bench[] { b0 });&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man folgendes:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |    Objects |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Traverse ArrayList For    |       10 |     10.000 |        0 |        0 |       1.945.638 |         194.563 |&lt;br /&gt;
| Traverse ArrayList For    |      100 |     10.000 |       16 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |     10.000 |      171 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |       10 |    100.000 |       16 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |      100 |    100.000 |      109 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |    100.000 |    1.170 |        1 |             ... |             ... |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Legende:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Bench: Name des Benchmarks.&lt;br /&gt;
Rounds: Anzahl an Durchläufen.&lt;br /&gt;
Objects: Anzahl an verwendeteten Objekten.&lt;br /&gt;
ms: Gesamtzeitbedarf in Millisekunden.&lt;br /&gt;
ms (avg): Durchschnittlicher Zeitbedarf in Millisekunden.&lt;br /&gt;
nt: Gesamtzeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
nt (avg): Durchschnittlicher Zeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele folgen...&lt;br /&gt;
&lt;br /&gt;
Und zwar jetzt:&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu NxIntervall (Fibonacci rekursiv und nicht-rekursiv):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    /* fibonacci -&amp;gt; recursive */&lt;br /&gt;
    static class FibBench_Recursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private int fib(int a) {&lt;br /&gt;
            if (a == 1 || a == 2) {&lt;br /&gt;
                return 1;&lt;br /&gt;
            } else {&lt;br /&gt;
                return fib(a - 1) + fib(a - 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    /* fibonacci -&amp;gt; non-recursive */&lt;br /&gt;
    static class FibBench_NonRecursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private long fib(int a) {&lt;br /&gt;
            long fib = 1;&lt;br /&gt;
            for (long fib1 = 1, fib2 = 1, i = 3; i &amp;lt;= a; i++) {&lt;br /&gt;
                fib = fib1 + fib2;&lt;br /&gt;
                fib1 = fib2;&lt;br /&gt;
                fib2 = fib;&lt;br /&gt;
            }&lt;br /&gt;
            return fib;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: non-recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf wie folgt: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code=java&amp;gt;&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        QuickBench.benchNxIntervall(10, 50000, new long[] { 10, 100, 1000}, 1, 25,&lt;br /&gt;
                new Bench[]{new FibBench_Recursive(), new FibBench_NonRecursive()});&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code=java&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man ungefähr folgende Ausgabe:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |        min |        max |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Fibonacci: recursive      |       10 |          1 |         25 |        0 |        0 |       8.312.579 |         831.257 |&lt;br /&gt;
| Fibonacci: recursive      |      100 |          1 |         25 |       93 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: recursive      |    1.000 |          1 |         25 |      812 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: non-recursive  |       10 |          1 |         25 |        0 |        0 |          25.911 |           2.591 |&lt;br /&gt;
| Fibonacci: non-recursive  |      100 |          1 |         25 |        0 |        0 |         241.581 |           2.415 |&lt;br /&gt;
| Fibonacci: non-recursive  |    1.000 |          1 |         25 |        0 |        0 |       1.974.832 |           1.974 |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Formatierte_Tabellen_auf_der_Console_ausgeben&amp;diff=5295</id>
		<title>Formatierte Tabellen auf der Console ausgeben</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Formatierte_Tabellen_auf_der_Console_ausgeben&amp;diff=5295"/>
		<updated>2013-08-07T15:01:38Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: Die Seite wurde neu angelegt: „Kategorie:Java Die folgende Klasse kann auf einfache Art und Weise eine formatierte Texttabelle als String erzeugen. Dabei können zusätzlich die Formatierun…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
Die folgende Klasse kann auf einfache Art und Weise eine formatierte Texttabelle als String erzeugen. Dabei können zusätzlich die Formatierungseigenschaften der Klasse java.util.Formatter verwendet werden. Die Formatierung ähnelt den Konsolenausgaben von MySQL-Anfragen. Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Table.java&lt;br /&gt;
 *&lt;br /&gt;
 * 14.10.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.text;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * This class defines a simple formatted text table. It can be used to create simple formatted&lt;br /&gt;
 * text tables (like MySQL console outputs) with the formatting stuff from class&lt;br /&gt;
 * &amp;quot;java.util.Formatter&amp;quot; defined in the enumerations.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 */&lt;br /&gt;
public class Table {&lt;br /&gt;
    private List&amp;lt;Col&amp;gt; cols = new ArrayList&amp;lt;Col&amp;gt;();&lt;br /&gt;
    private List&amp;lt;Row&amp;gt; rows = new ArrayList&amp;lt;Row&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name) {&lt;br /&gt;
        this.cols.add(new Col(name));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, null, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param conversion the conversion&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Conversions conversion, Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, conversion, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param name the name&lt;br /&gt;
     * @param conversion the conversion&lt;br /&gt;
     * @param dtconversion the date/timeconversion&lt;br /&gt;
     * @param flags the flags&lt;br /&gt;
     * @return the table&lt;br /&gt;
     */&lt;br /&gt;
    public Table addCol(String name, Conversions conversion, DateTimeConversions dtconversion,&lt;br /&gt;
            Flags... flags) {&lt;br /&gt;
        this.cols.add(new Col(name, conversion, dtconversion, flags));&lt;br /&gt;
        return this;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the col size.&lt;br /&gt;
     *&lt;br /&gt;
     * @return the col size&lt;br /&gt;
     */&lt;br /&gt;
    public int getColSize() {&lt;br /&gt;
        return this.cols.size();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the col.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index the index&lt;br /&gt;
     * @return the col&lt;br /&gt;
     */&lt;br /&gt;
    public Col getCol(int index) {&lt;br /&gt;
        return this.cols.get(index);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the row size.&lt;br /&gt;
     *&lt;br /&gt;
     * @return the row size&lt;br /&gt;
     */&lt;br /&gt;
    public int getRowSize() {&lt;br /&gt;
        return this.rows.size();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Gets the row.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index the index&lt;br /&gt;
     * @return the row&lt;br /&gt;
     */&lt;br /&gt;
    public Row getRow(int index) {&lt;br /&gt;
        return this.rows.get(index);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Adds the row.&lt;br /&gt;
     *&lt;br /&gt;
     * @param values the values&lt;br /&gt;
     */&lt;br /&gt;
    public void addRow(Object... values) {&lt;br /&gt;
        this.rows.add(new Row(values));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        StringBuilder s1 = new StringBuilder();&lt;br /&gt;
        StringBuilder s2 = new StringBuilder();&lt;br /&gt;
        // data&lt;br /&gt;
        for (int i = 0, n = this.rows.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Row r = this.rows.get(i);&lt;br /&gt;
            for (int ii = 0, nn = this.cols.size(); ii &amp;lt; nn; ii++) {&lt;br /&gt;
                Col c = this.cols.get(ii);&lt;br /&gt;
                Object o = r.getValue(ii);&lt;br /&gt;
                if (c.getConversion() == null) {&lt;br /&gt;
                    c.setConversion(this.getConversionForType(o));&lt;br /&gt;
                }&lt;br /&gt;
                int nl = Math.max(c.getName().length(), String.valueOf(o).length());&lt;br /&gt;
                if (nl &amp;gt; c.getWidth()) {&lt;br /&gt;
                    c.width = nl;&lt;br /&gt;
                }&lt;br /&gt;
                int ol = String.format(this.getToken(o, c.getWidth(), c.getConversion(),&lt;br /&gt;
                        c.getDateTimeConversion(), c.getFlags()), o).length();&lt;br /&gt;
                if (ol &amp;gt; c.getWidth()) {&lt;br /&gt;
                    c.width = ol;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 0, n = this.rows.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Row r = this.rows.get(i);&lt;br /&gt;
            StringBuilder data = new StringBuilder();&lt;br /&gt;
            for (int ii = 0, nn = this.cols.size(); ii &amp;lt; nn; ii++) {&lt;br /&gt;
                Col c = this.cols.get(ii);&lt;br /&gt;
                Object o = r.getValue(ii);&lt;br /&gt;
                data.append(&amp;quot;| &amp;quot;);&lt;br /&gt;
                data.append(this.getToken(o, c.getWidth(), c.getConversion(),&lt;br /&gt;
                        c.getDateTimeConversion(), c.getFlags()));&lt;br /&gt;
                if (ii &amp;lt; nn - 1) {&lt;br /&gt;
                    data.append(&amp;quot; &amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            data.append(&amp;quot; |\n&amp;quot;);&lt;br /&gt;
            s2.append(String.format(data.toString(), r.getValues()));&lt;br /&gt;
        }&lt;br /&gt;
        // head&lt;br /&gt;
        StringBuilder sep = new StringBuilder();&lt;br /&gt;
        StringBuilder begin = new StringBuilder();&lt;br /&gt;
        StringBuilder end = new StringBuilder();&lt;br /&gt;
        StringBuilder head = new StringBuilder();&lt;br /&gt;
        Object[] oa = new Object[this.cols.size()];&lt;br /&gt;
        for (int i = 0, n = this.cols.size(); i &amp;lt; n; i++) {&lt;br /&gt;
            Col c = this.cols.get(i);&lt;br /&gt;
            oa[i] = c.getName();&lt;br /&gt;
            if (i == 0) {&lt;br /&gt;
                begin.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
            } else {&lt;br /&gt;
                begin.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;+&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            head.append(&amp;quot;| %&amp;quot;);&lt;br /&gt;
            head.append(String.valueOf(c.getWidth()));&lt;br /&gt;
            head.append(&amp;quot;s&amp;quot;);&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; c.getWidth() + 2; ii++) {&lt;br /&gt;
                begin.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
                sep.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
                end.append(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            if (i &amp;lt; n - 1) {&lt;br /&gt;
                head.append(&amp;quot; &amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        begin.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        sep.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        end.append(&amp;quot;+\n&amp;quot;);&lt;br /&gt;
        head.append(&amp;quot; |\n&amp;quot;);&lt;br /&gt;
        s1.append(begin);&lt;br /&gt;
        s1.append(String.format(head.toString(), oa));&lt;br /&gt;
        s1.append(sep);&lt;br /&gt;
        s1.append(s2);&lt;br /&gt;
        s1.append(end);&lt;br /&gt;
        return s1.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String getToken(Object object, int width, Conversions conversion,&lt;br /&gt;
            DateTimeConversions dtconversion, Flags... flags) {&lt;br /&gt;
        StringBuilder s = new StringBuilder();&lt;br /&gt;
        s.append(&amp;quot;%&amp;quot;);&lt;br /&gt;
        if (flags != null &amp;amp;&amp;amp; flags.length &amp;gt; 0) {&lt;br /&gt;
            for (int i = 0; i &amp;lt; flags.length; i++) {&lt;br /&gt;
                Flags f = flags[i];&lt;br /&gt;
                s.append(f.getToken());&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (width &amp;gt; 0) {&lt;br /&gt;
            s.append(width);&lt;br /&gt;
        }&lt;br /&gt;
        if (conversion != null) {&lt;br /&gt;
            s.append(conversion.getToken());&lt;br /&gt;
        } else {&lt;br /&gt;
            s.append(this.getConversionForType(object).getToken());&lt;br /&gt;
        }&lt;br /&gt;
        if (dtconversion != null) {&lt;br /&gt;
            s.append(dtconversion.getToken());&lt;br /&gt;
        }&lt;br /&gt;
        return s.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private Conversions getConversionForType(Object object) {&lt;br /&gt;
        if (object instanceof Byte) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Short) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Integer) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Character) {&lt;br /&gt;
            return Conversions.CHARACTER;&lt;br /&gt;
        } else if (object instanceof Long) {&lt;br /&gt;
            return Conversions.DECIMAL;&lt;br /&gt;
        } else if (object instanceof Float) {&lt;br /&gt;
            return Conversions.FLOAT;&lt;br /&gt;
        } else if (object instanceof Double) {&lt;br /&gt;
            return Conversions.FLOAT;&lt;br /&gt;
        } else if (object instanceof Boolean) {&lt;br /&gt;
            return Conversions.BOOLEAN;&lt;br /&gt;
        } else if (object instanceof String) {&lt;br /&gt;
            return Conversions.STRING;&lt;br /&gt;
        } else {&lt;br /&gt;
            return Conversions.STRING;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klasse für die Zeilen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This class defines a row, containing an object arry with values.&lt;br /&gt;
     */&lt;br /&gt;
    public class Row {&lt;br /&gt;
        private Object[] values = null;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new row.&lt;br /&gt;
         *&lt;br /&gt;
         * @param values the values&lt;br /&gt;
         */&lt;br /&gt;
        public Row(Object[] values) {&lt;br /&gt;
            super();&lt;br /&gt;
            this.values = values;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the value.&lt;br /&gt;
         *&lt;br /&gt;
         * @param index the index&lt;br /&gt;
         * @return the value&lt;br /&gt;
         */&lt;br /&gt;
        public Object getValue(int index) {&lt;br /&gt;
            return this.values[index];&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the values.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the values&lt;br /&gt;
         */&lt;br /&gt;
        public Object[] getValues() {&lt;br /&gt;
            return this.values;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Klasse für die Spalten:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This class defines a column.&lt;br /&gt;
     */&lt;br /&gt;
    public class Col {&lt;br /&gt;
        private Flags[] flags = null;&lt;br /&gt;
        private Conversions conversion = null;&lt;br /&gt;
        private DateTimeConversions dateTimeConversion = null;&lt;br /&gt;
        private String name = &amp;quot;&amp;quot;;&lt;br /&gt;
        private int width = 0;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name) {&lt;br /&gt;
            this(name, null);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         * @param conversion the conversion&lt;br /&gt;
         * @param flags the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name, Conversions conversion, Flags... flags) {&lt;br /&gt;
            this(name, conversion, null, flags);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new col.&lt;br /&gt;
         *&lt;br /&gt;
         * @param name the name&lt;br /&gt;
         * @param conversion the conversion&lt;br /&gt;
         * @param dateTimeConversion the date time conversion&lt;br /&gt;
         * @param flags the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Col(String name, Conversions conversion, DateTimeConversions dateTimeConversion,&lt;br /&gt;
                Flags... flags) {&lt;br /&gt;
            super();&lt;br /&gt;
            this.dateTimeConversion = dateTimeConversion;&lt;br /&gt;
            this.conversion = conversion;&lt;br /&gt;
            this.flags = flags;&lt;br /&gt;
            this.name = name;&lt;br /&gt;
            this.width = this.name.length();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the name.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the name&lt;br /&gt;
         */&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return this.name;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the conversion&lt;br /&gt;
         */&lt;br /&gt;
        public Conversions getConversion() {&lt;br /&gt;
            return this.conversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Sets the conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param conversion the new conversion&lt;br /&gt;
         */&lt;br /&gt;
        public void setConversion(Conversions conversion) {&lt;br /&gt;
            this.conversion = conversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the width.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the width&lt;br /&gt;
         */&lt;br /&gt;
        public int getWidth() {&lt;br /&gt;
            return this.width;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the flags.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the flags&lt;br /&gt;
         */&lt;br /&gt;
        public Flags[] getFlags() {&lt;br /&gt;
            return this.flags;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the date time conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the date time conversion&lt;br /&gt;
         */&lt;br /&gt;
        public DateTimeConversions getDateTimeConversion() {&lt;br /&gt;
            return this.dateTimeConversion;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Flaggen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines the flags.&lt;br /&gt;
     */&lt;br /&gt;
    public enum Flags {&lt;br /&gt;
        LEFT(&amp;quot;-&amp;quot;),&lt;br /&gt;
        CONVERSION_DEPENDENT(&amp;quot;#&amp;quot;),&lt;br /&gt;
        SIGN(&amp;quot;+&amp;quot;),&lt;br /&gt;
        POSITIVE_LEADING_SPACE(&amp;quot;  &amp;quot;),&lt;br /&gt;
        ZERO_PADDING(&amp;quot;0&amp;quot;),&lt;br /&gt;
        LOCALE_GROUPING_SEPARATORS(&amp;quot;,&amp;quot;),&lt;br /&gt;
        PARENTHESES_FOR_NEGATIVES(&amp;quot;(&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new flag.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        Flags(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konversionen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines conversions.&lt;br /&gt;
     */&lt;br /&gt;
    public enum Conversions {&lt;br /&gt;
        BOOLEAN(&amp;quot;b&amp;quot;),&lt;br /&gt;
        CHARACTER(&amp;quot;c&amp;quot;),&lt;br /&gt;
        DATE_TIME(&amp;quot;t&amp;quot;),&lt;br /&gt;
        DECIMAL(&amp;quot;d&amp;quot;),&lt;br /&gt;
        FLOAT(&amp;quot;f&amp;quot;),&lt;br /&gt;
        FLOAT_HEX(&amp;quot;a&amp;quot;),&lt;br /&gt;
        FLOAT_SCIENCE(&amp;quot;e&amp;quot;),&lt;br /&gt;
        FLOAT_SCIENCE_PREC(&amp;quot;g&amp;quot;),&lt;br /&gt;
        HEX(&amp;quot;h&amp;quot;),&lt;br /&gt;
        HEX_INT(&amp;quot;h&amp;quot;),&lt;br /&gt;
        LINE_SEPARATOR(&amp;quot;n&amp;quot;),&lt;br /&gt;
        OCTAL(&amp;quot;o&amp;quot;),&lt;br /&gt;
        PERCENT(&amp;quot;%&amp;quot;),&lt;br /&gt;
        STRING(&amp;quot;s&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        Conversions(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zeit/Datums- Konversionen:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /**&lt;br /&gt;
     * This enumeration defines date/time conversions.&lt;br /&gt;
     */&lt;br /&gt;
    public enum DateTimeConversions {&lt;br /&gt;
        FULL_MONTH_NAME(&amp;quot;B&amp;quot;),&lt;br /&gt;
        ABBREVATED_MONTH_NAME(&amp;quot;b&amp;quot;),&lt;br /&gt;
        ABBREVATED_MONTH_NAME_H(&amp;quot;h&amp;quot;),&lt;br /&gt;
        FULL_DAY_OF_THE_WEEK_NAME(&amp;quot;A&amp;quot;),&lt;br /&gt;
        SHORT_DAY_OF_THE_WEEK_NAME(&amp;quot;a&amp;quot;),&lt;br /&gt;
        FOUR_DIGIT_YEAR(&amp;quot;C&amp;quot;),&lt;br /&gt;
        LEADING_ZEROS_YEAR(&amp;quot;Y&amp;quot;),&lt;br /&gt;
        LAST_TWO_DIGITS_YEAR(&amp;quot;y&amp;quot;),&lt;br /&gt;
        THREE_DIGIT_DAY_OF_THE_YEAR(&amp;quot;j&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_MONTH(&amp;quot;m&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_DAY_OF_MONTH(&amp;quot;d&amp;quot;),&lt;br /&gt;
        DAY_OF_MONTH(&amp;quot;e&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_LEADING_24(&amp;quot;H&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_LEADING_12(&amp;quot;I&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_24(&amp;quot;k&amp;quot;),&lt;br /&gt;
        HOUR_OF_DAY_12(&amp;quot;l&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_MINUTE(&amp;quot;M&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_SECOND(&amp;quot;S&amp;quot;),&lt;br /&gt;
        THREE_DIGIT_MILLISECOND(&amp;quot;L&amp;quot;),&lt;br /&gt;
        TWO_DIGIT_NANOSECOND(&amp;quot;N&amp;quot;),&lt;br /&gt;
        MORING_AFTERNOON_MARKER(&amp;quot;p&amp;quot;),&lt;br /&gt;
        RFC822_TIME_ZONE_OFFSET(&amp;quot;z&amp;quot;),&lt;br /&gt;
        TIME_ZONE_ABBREVATION(&amp;quot;Z&amp;quot;),&lt;br /&gt;
        BEGINNING_SECONDS(&amp;quot;s&amp;quot;),&lt;br /&gt;
        BEGINNING_MILLISECONDS(&amp;quot;Q&amp;quot;),&lt;br /&gt;
        TIME_HOUR_CLOCK_24(&amp;quot;R&amp;quot;),&lt;br /&gt;
        LONG_TIME_HOUR_CLOCK_24(&amp;quot;T&amp;quot;),&lt;br /&gt;
        TIME_HOUR_CLOCK_12(&amp;quot;r&amp;quot;),&lt;br /&gt;
        LONG_DATE(&amp;quot;D&amp;quot;),&lt;br /&gt;
        ISO8601_DATE(&amp;quot;F&amp;quot;),&lt;br /&gt;
        FULL_DATE(&amp;quot;c&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        String token = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Instantiates a new date time conversion.&lt;br /&gt;
         *&lt;br /&gt;
         * @param token the token&lt;br /&gt;
         */&lt;br /&gt;
        DateTimeConversions(String token) {&lt;br /&gt;
            this.token = token;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        /**&lt;br /&gt;
         * Gets the token.&lt;br /&gt;
         *&lt;br /&gt;
         * @return the token&lt;br /&gt;
         */&lt;br /&gt;
        String getToken() {&lt;br /&gt;
            return token;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Anwendungsfall:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 public static void main(String[] args) {&lt;br /&gt;
        Table t = new Table();&lt;br /&gt;
        t = t.addCol(&amp;quot;char&amp;quot;, Flags.LEFT)&lt;br /&gt;
                .addCol(&amp;quot;byte&amp;quot;, Flags.ZERO_PADDING)&lt;br /&gt;
                .addCol(&amp;quot;short&amp;quot;, Flags.PARENTHESES_FOR_NEGATIVES, Flags.LEFT)&lt;br /&gt;
                .addCol(&amp;quot;int&amp;quot;, Flags.LOCALE_GROUPING_SEPARATORS)&lt;br /&gt;
                .addCol(&amp;quot;long&amp;quot;, Flags.LOCALE_GROUPING_SEPARATORS, Flags.SIGN)&lt;br /&gt;
                .addCol(&amp;quot;float&amp;quot;, Conversions.FLOAT_HEX)&lt;br /&gt;
                .addCol(&amp;quot;double&amp;quot;, Conversions.FLOAT_SCIENCE)&lt;br /&gt;
                .addCol(&amp;quot;boolean&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;string&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;object&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;null&amp;quot;)&lt;br /&gt;
                .addCol(&amp;quot;Date&amp;quot;, Conversions.DATE_TIME, DateTimeConversions.FULL_DATE);&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) 1, 100, 100L, 1.0F, 1.0, true, &amp;quot;ab&amp;quot;, new Object(), null,&lt;br /&gt;
                new Date());&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) -1, 1000, 1000L, 1.0F, 1.0, false, &amp;quot;abbas&amp;quot;, new Object(), null,&lt;br /&gt;
                new Date());&lt;br /&gt;
        t.addRow(&#039;a&#039;, (byte) 1, (short) 1, 10000, -10000L, 1.0F, 1.0, true, &amp;quot;sdhjsdhjdsghsdghds&amp;quot;,&lt;br /&gt;
                new Object(), null, new Date());&lt;br /&gt;
        Col c = t.getCol(0);&lt;br /&gt;
        System.out.println(t);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erzeugt die Ausgabe:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
| char | byte | short |    int |    long |   float |       double | boolean |             string |                   object | null |                          Date |&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
| a    | 0001 | 1     |    100 |    +100 | 0x1.0p0 | 1,000000e+00 |    true |                 ab | java.lang.Object@1e97676 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
| a    | 0001 | (1)   |  1.000 |  +1.000 | 0x1.0p0 | 1,000000e+00 |   false |              abbas |  java.lang.Object@7bd9f2 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
| a    | 0001 | 1     | 10.000 | -10.000 | 0x1.0p0 | 1,000000e+00 |    true | sdhjsdhjdsghsdghds | java.lang.Object@121cc40 | null |  So Apr 03 17:46:15 MESZ 2011 |&lt;br /&gt;
+------+------+-------+--------+---------+---------+--------------+---------+--------------------+--------------------------+------+-------------------------------+&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Weihnachtsbaum&amp;diff=5294</id>
		<title>Weihnachtsbaum</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Weihnachtsbaum&amp;diff=5294"/>
		<updated>2013-08-07T14:54:05Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: Die Seite wurde neu angelegt: „Kategorie:Java  Da viele immer mal wieder einen Weihnachtsbaum erstellen möchten, stelle ich mal meinen vor Wem es hilft, der kann sich gerne bedienen.  Viel…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
&lt;br /&gt;
Da viele immer mal wieder einen Weihnachtsbaum erstellen möchten, stelle ich mal meinen vor Wem es hilft, der kann sich gerne bedienen.&lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ChristmasTreeTest.java&lt;br /&gt;
 *&lt;br /&gt;
 * 05.01.2012&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2012 fastjack&lt;br /&gt;
 */&lt;br /&gt;
package blog.tree;&lt;br /&gt;
 &lt;br /&gt;
import org.junit.*;&lt;br /&gt;
 &lt;br /&gt;
import static org.junit.Assert.*;&lt;br /&gt;
 &lt;br /&gt;
public class ChristmasTreeTest {&lt;br /&gt;
    private static final String LINE_END = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    @Test(expected=IllegalArgumentException.class)&lt;br /&gt;
    public void failCreateWithNegativeHigh() {&lt;br /&gt;
        new ChristmasTree(-1);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test(expected=IllegalArgumentException.class)&lt;br /&gt;
    public void failCreateWithZeroHigh() {&lt;br /&gt;
        new ChristmasTree(0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfOne() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;*&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;|&amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(1).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfTwo() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot; * &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;***&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; | &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(2).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfThree() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;  *  &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; *** &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*****&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;  |  &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(3).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfFour() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;   *   &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;  ***  &amp;quot;).append(LINE_END); &lt;br /&gt;
        expected.append(&amp;quot; ***** &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*******&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;   |   &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(4).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Test&lt;br /&gt;
    public void shouldCreateWithHighOfFive() {&lt;br /&gt;
        StringBuilder expected = new StringBuilder();&lt;br /&gt;
        expected.append(&amp;quot;    *    &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;   ***   &amp;quot;).append(LINE_END); &lt;br /&gt;
        expected.append(&amp;quot;  *****  &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot; ******* &amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;*********&amp;quot;).append(LINE_END);&lt;br /&gt;
        expected.append(&amp;quot;    |    &amp;quot;).append(LINE_END);&lt;br /&gt;
        assertEquals(&amp;quot;christmas tree was not correct!&amp;quot;, expected.toString(), &lt;br /&gt;
                new ChristmasTree(5).toString());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * ChristmasTree.java&lt;br /&gt;
 *&lt;br /&gt;
 * 05.01.2012&lt;br /&gt;
 *&lt;br /&gt;
 * Copyright 2012 fastjack&lt;br /&gt;
 */&lt;br /&gt;
package blog.tree;&lt;br /&gt;
 &lt;br /&gt;
import org.apache.commons.lang.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * This class defines a christmas tree. After construction the tree can represented as String &lt;br /&gt;
 * via the toString() method.&lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 * System.out.println(new ChristmasTree(3).toString());&lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * prints out a christmas tree with a height of three in form: &lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 *   *  &lt;br /&gt;
 *  *** &lt;br /&gt;
 * *****&lt;br /&gt;
 *   |  &lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * the idea for defined height n is&lt;br /&gt;
 *  &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 *        // 2n-1 lines for body&lt;br /&gt;
 *   *    // for actual row (beginning at zero) r print out 2(r+1)-1 stars&lt;br /&gt;
 *  ***   // &lt;br /&gt;
 *  |.|   // if actual column is in star printing area |.| including the | then print a star &lt;br /&gt;
 *  |.|   // otherwise a space &lt;br /&gt;
 * *****  //&lt;br /&gt;
 *   |    // and a separate line for the centered trunk&lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 */&lt;br /&gt;
public class ChristmasTree {&lt;br /&gt;
    private static final String TRUNK = &amp;quot;|&amp;quot;;&lt;br /&gt;
    private static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
    private static final String STAR = &amp;quot;*&amp;quot;;&lt;br /&gt;
    private static final String LINE_END = System.getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
    private int height;&lt;br /&gt;
    private int maxTreeWidth;&lt;br /&gt;
    private int halfOfTreeWidth;&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Creates a christmas tree for the defined height.&lt;br /&gt;
     * &lt;br /&gt;
     * @param height the height of the tree must be greater than zero&lt;br /&gt;
     */&lt;br /&gt;
    public ChristmasTree(int height) {&lt;br /&gt;
        Validate.isTrue(height &amp;gt; 0, &amp;quot;height must be greater than zero!&amp;quot;);&lt;br /&gt;
        this.height = height;&lt;br /&gt;
        maxTreeWidth = 2 * height - 1;&lt;br /&gt;
        halfOfTreeWidth = maxTreeWidth / 2;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String toString() {&lt;br /&gt;
        StringBuilder s = new StringBuilder();&lt;br /&gt;
        s.append(makeBody());&lt;br /&gt;
        s.append(makeBottomLineWithTrunk());&lt;br /&gt;
        return s.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String makeBody() {&lt;br /&gt;
        StringBuilder lines = new StringBuilder();&lt;br /&gt;
        for(int row = 0; row &amp;lt; height; row ++) {&lt;br /&gt;
            int numberOfStarsInRow = getNumberOfStarsInRow(row);&lt;br /&gt;
            int startOfStarPrinting = getStartColumnToPrintStars(numberOfStarsInRow);&lt;br /&gt;
            int endOfStarPrinting = startOfStarPrinting + numberOfStarsInRow;&lt;br /&gt;
            lines.append(makeLine(startOfStarPrinting, endOfStarPrinting));&lt;br /&gt;
        }&lt;br /&gt;
        return lines.toString();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private int getNumberOfStarsInRow(int row) {&lt;br /&gt;
        return 2 * (row + 1) - 1;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private int getStartColumnToPrintStars(int numberOfStarsInRow) {&lt;br /&gt;
        return halfOfTreeWidth - (numberOfStarsInRow / 2);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private StringBuilder makeLine(int startOfStarPrinting, int endOfStarPrinting) {&lt;br /&gt;
        StringBuilder line = new StringBuilder();&lt;br /&gt;
        for(int column = 0; column &amp;lt; maxTreeWidth; column ++) {&lt;br /&gt;
            if (isStarToPrint(startOfStarPrinting, endOfStarPrinting, column)) {&lt;br /&gt;
                line.append(STAR);&lt;br /&gt;
            } else {&lt;br /&gt;
                line.append(SPACE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        line.append(LINE_END);&lt;br /&gt;
        return line;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private boolean isStarToPrint(int startOfStarPrinting, int endOfStarPrinting, int column) {&lt;br /&gt;
        return column &amp;gt;= startOfStarPrinting &amp;amp;&amp;amp; column &amp;lt; endOfStarPrinting;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private String makeBottomLineWithTrunk() {&lt;br /&gt;
        StringBuilder bottom = new StringBuilder();&lt;br /&gt;
        for(int column = 0; column &amp;lt; maxTreeWidth; column ++) {&lt;br /&gt;
            if (column == maxTreeWidth / 2) {&lt;br /&gt;
                bottom.append(TRUNK);&lt;br /&gt;
            } else {&lt;br /&gt;
                bottom.append(SPACE);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        bottom.append(LINE_END);&lt;br /&gt;
        return bottom.toString();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5293</id>
		<title>Benchmarks</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5293"/>
		<updated>2013-08-07T14:50:57Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
&lt;br /&gt;
Ich poste mal ein absichtlich stark vereinfachtes und leicht zu bedienendes Benchmarkingsystem. Es basiert nur auf zwei Klassen, nämlich dem eigentlichen System namens QuickBench und einer Schnittstelle namens Bench, das den einzelnen Benchmark darstellt. Ich denke die Benutzung ist wirklich einfach. Benches, die auf einer Objektstruktur arbeiten und mit unterschiedlich vielen Objekten gebencht werden sollen sind ebenso möglich, wie Benches, die nur eine bestimmte Funktion messen sollen, z.B. fib oder fac() und Co.&lt;br /&gt;
&lt;br /&gt;
Das System erhebt keinesfalls den Anspruch perfekt implementiert oder jetzt der neue Meilenstein in Sachen benchmarking zu sein. Falls jemandem Fehler auffallen oder konstruktive Kritik besteht, bitte einfach kommentieren.&lt;br /&gt;
&lt;br /&gt;
Das Interface Bench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Bench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Schnittstelle beschreibt einen Benchmark.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Bench {&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return der Name.&lt;br /&gt;
     */&lt;br /&gt;
    String getName();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * setzt den Benchmark und alle Resourcen, die er benutzt in den Urzustand zur&amp;amp;uuml;ck.&lt;br /&gt;
     */&lt;br /&gt;
    void reset();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Bereitet den Benchmark zur Ausf&amp;amp;uuml;hrung vor.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark vorbereitet wird.&lt;br /&gt;
     */&lt;br /&gt;
    void prepare(long lm);&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt den Benchmark aus.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark ausgef&amp;amp;uuml;hrt wird.&lt;br /&gt;
     */&lt;br /&gt;
    void execute(long lm);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die abstrakte Klasse Bench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * AbstractBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 06.01.2011&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Klasse stellt einen abstrakten Benchmark dar.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public abstract class AbstractBench implements Bench {&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return this.getClass().getSimpleName();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void prepare(long lm) {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void reset() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Benchmarksystem QuickBench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * QuickBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese kleine Klasse soll ein einfaches Benchmarksystem darstellen.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class QuickBench {&lt;br /&gt;
 &lt;br /&gt;
    private final static String headerNxMSep = &amp;quot;+---------------------------+----------+-------&amp;quot;&lt;br /&gt;
            + &amp;quot;-----+----------+----------+-----------------+-----------------+&amp;quot;;&lt;br /&gt;
    private final static String headerNxM = &amp;quot;| %-25s | %8s | %10s | %8s | %8s | %15s | %15s &amp;quot;&lt;br /&gt;
            + &amp;quot;|\n&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervallSep = &amp;quot;+---------------------------+----------&amp;quot;&lt;br /&gt;
            + &amp;quot;+------------+------------+----------+----------+-----------------+-------------&amp;quot;&lt;br /&gt;
            + &amp;quot;----+&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervall = &amp;quot;| %-25s | %8s | %10s | %10s | %8s | %8s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s | %15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxM = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %,15d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxMWNT = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %15s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervall = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,8d | %,15d | %,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervallWNT = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d &amp;quot;&lt;br /&gt;
            + &amp;quot;| %,8d | %15s | %15s |\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    private QuickBench() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet. Bevor das Benchmarking&lt;br /&gt;
     * gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch den&lt;br /&gt;
     * Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Alle Benchmarks werden zu jedem Eintrag e in n i-mal (i &amp;lt;= e) wiederholt,&lt;br /&gt;
     * jeweils mit einem Wert aus dem dem angegebenen Intervall.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxIntervall(long minMs, long wm, long[] n, long mmin, long mmax,&lt;br /&gt;
            Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        System.out.printf(headerNxIntervall, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;min&amp;quot;, &amp;quot;max&amp;quot;, &amp;quot;ms&amp;quot;,&lt;br /&gt;
                &amp;quot;ms (avg)&amp;quot;, &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            qb.executeIntervall(b, n, minMs, mmin, mmax);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die z.B. einer Anzahl von Objekten basieren, aus. Der Benchmark&lt;br /&gt;
     * wird zurerst zur&amp;amp;uuml;ckgesetzt und jeweils zu einem Wert aus m vorbereitet. Bevor das&lt;br /&gt;
     * Benchmarking gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch&lt;br /&gt;
     * den Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Die Anzahl der Objekte im Feld m. Alle Benchmarks werden zu jedem Eintrag m0&lt;br /&gt;
     * in m i-mal (i &amp;lt;= m0) durchlaufen und zu jedem Eintrag n0 in n j-mal (j &amp;lt;= n0)&lt;br /&gt;
     * zu dem Wert m0 ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param m Anzahl an z.B. Objekten.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxM(long minMs, long wm, long[] n, long[] m, Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        System.out.printf(headerNxM, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;Objects&amp;quot;, &amp;quot;ms&amp;quot;, &amp;quot;ms (avg)&amp;quot;,&lt;br /&gt;
                &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; m.length; ii++) {&lt;br /&gt;
                qb.execute(b, n, minMs, m[ii]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * Zeigt Informationen zum System an.&lt;br /&gt;
     */&lt;br /&gt;
    private void showInfo() {&lt;br /&gt;
        System.out.println(&amp;quot;java version &amp;quot; + System.getProperty(&amp;quot;java.version&amp;quot;));&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.runtime.name&amp;quot;) + &amp;quot;(build &amp;quot; +&lt;br /&gt;
                System.getProperty(&amp;quot;java.runtime.version&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.vm.name&amp;quot;) + &amp;quot;(build &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.version&amp;quot;) + &amp;quot;, &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.info&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;os.name&amp;quot;) + &amp;quot;(&amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;os.version&amp;quot;) + &amp;quot;) &amp;quot; + System.getProperty(&amp;quot;os.arch&amp;quot;));&lt;br /&gt;
        System.out.println(&amp;quot;Max memory: &amp;quot; + Runtime.getRuntime().maxMemory() / (1024 * 1024)&lt;br /&gt;
                + &amp;quot;MB&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt ein warmup zu allen Benchmarks durch. Dabei werden die Benches jeweils mit den&lt;br /&gt;
     * Werten 1 vorbereitet und ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     * @param n Anzahl an Durchl&amp;amp;auml;ufen zum WarmUp.&lt;br /&gt;
     */&lt;br /&gt;
    private void warmup(Bench[] ba, long n) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ba.length; ii++) {&lt;br /&gt;
                Bench b = ba[ii];&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(1);&lt;br /&gt;
                b.execute(1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     */&lt;br /&gt;
    private void executeIntervall(Bench b, long[] n, long minMs, long mmin, long mmax) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                for (long l = mmin; l &amp;lt; mmax; l++) {&lt;br /&gt;
                    b.reset();&lt;br /&gt;
                    ms0 = -System.currentTimeMillis();&lt;br /&gt;
                    nt0 = -System.nanoTime();&lt;br /&gt;
                    b.execute(l);&lt;br /&gt;
                    nt0 += System.nanoTime();&lt;br /&gt;
                    ms0 += System.currentTimeMillis();&lt;br /&gt;
                    ms += ms0;&lt;br /&gt;
                    nt += nt0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxIntervall, b.getName(), ln, mmin, mmax, ms, ms / ln,&lt;br /&gt;
                        nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxIntervallWNT, b.getName(), ln, mmin, mmax, ms,&lt;br /&gt;
                        ms / ln, &amp;quot;...&amp;quot;, &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks zu einem gegebenen Wert aus. Der Benchmark wird zurerst&lt;br /&gt;
     * zur&amp;amp;uuml;ckgesetzt und zu dem Wert val vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param val Wert.&lt;br /&gt;
     */&lt;br /&gt;
    private void execute(Bench b, long[] n, long minMs, long val) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(val);&lt;br /&gt;
                ms0 = -System.currentTimeMillis();&lt;br /&gt;
                nt0 = -System.nanoTime();&lt;br /&gt;
                b.execute(val);&lt;br /&gt;
                nt0 += System.nanoTime();&lt;br /&gt;
                ms0 += System.currentTimeMillis();&lt;br /&gt;
                ms += ms0;&lt;br /&gt;
                nt += nt0;&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxM, b.getName(), ln, val, ms, ms / ln, nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxMWNT, b.getName(), ln, val, ms, ms / ln, &amp;quot;...&amp;quot;,&lt;br /&gt;
                        &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispiel zum Traversieren einer Liste (NxM):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
     Bench b0 = new Bench() {&lt;br /&gt;
            List&amp;lt;String&amp;gt; l = null;&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public String getName() {&lt;br /&gt;
                return &amp;quot;Traverse&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void reset() {&lt;br /&gt;
                l = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void prepare(long lm) {&lt;br /&gt;
                for (int i = 0; i &amp;lt; lm; i++) {&lt;br /&gt;
                    l.add(String.valueOf(i));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void execute(long lm) {&lt;br /&gt;
                for (int i = 0, n = l.size(); i &amp;lt; n; i++) {&lt;br /&gt;
                    String s = l.get(i);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzung:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
        QuickBench.benchNxM(10, 50000, new long[] { 10, 100, 1000 }, new long[] { 10000, 100000 },&lt;br /&gt;
                new Bench[] { b0 });&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man folgendes:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |    Objects |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Traverse ArrayList For    |       10 |     10.000 |        0 |        0 |       1.945.638 |         194.563 |&lt;br /&gt;
| Traverse ArrayList For    |      100 |     10.000 |       16 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |     10.000 |      171 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |       10 |    100.000 |       16 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |      100 |    100.000 |      109 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |    100.000 |    1.170 |        1 |             ... |             ... |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Legende:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Bench: Name des Benchmarks.&lt;br /&gt;
Rounds: Anzahl an Durchläufen.&lt;br /&gt;
Objects: Anzahl an verwendeteten Objekten.&lt;br /&gt;
ms: Gesamtzeitbedarf in Millisekunden.&lt;br /&gt;
ms (avg): Durchschnittlicher Zeitbedarf in Millisekunden.&lt;br /&gt;
nt: Gesamtzeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
nt (avg): Durchschnittlicher Zeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele folgen...&lt;br /&gt;
&lt;br /&gt;
Und zwar jetzt:&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu NxIntervall (Fibonacci rekursiv und nicht-rekursiv):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /* fibonacci -&amp;gt; recursive */&lt;br /&gt;
    static class FibBench_Recursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private int fib(int a) {&lt;br /&gt;
            if (a == 1 || a == 2) {&lt;br /&gt;
                return 1;&lt;br /&gt;
            } else {&lt;br /&gt;
                return fib(a - 1) + fib(a - 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    /* fibonacci -&amp;gt; non-recursive */&lt;br /&gt;
    static class FibBench_NonRecursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private long fib(int a) {&lt;br /&gt;
            long fib = 1;&lt;br /&gt;
            for (long fib1 = 1, fib2 = 1, i = 3; i &amp;lt;= a; i++) {&lt;br /&gt;
                fib = fib1 + fib2;&lt;br /&gt;
                fib1 = fib2;&lt;br /&gt;
                fib2 = fib;&lt;br /&gt;
            }&lt;br /&gt;
            return fib;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: non-recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf wie folgt: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        QuickBench.benchNxIntervall(10, 50000, new long[] { 10, 100, 1000}, 1, 25,&lt;br /&gt;
                new Bench[]{new FibBench_Recursive(), new FibBench_NonRecursive()});&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man ungefähr folgende Ausgabe:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |        min |        max |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Fibonacci: recursive      |       10 |          1 |         25 |        0 |        0 |       8.312.579 |         831.257 |&lt;br /&gt;
| Fibonacci: recursive      |      100 |          1 |         25 |       93 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: recursive      |    1.000 |          1 |         25 |      812 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: non-recursive  |       10 |          1 |         25 |        0 |        0 |          25.911 |           2.591 |&lt;br /&gt;
| Fibonacci: non-recursive  |      100 |          1 |         25 |        0 |        0 |         241.581 |           2.415 |&lt;br /&gt;
| Fibonacci: non-recursive  |    1.000 |          1 |         25 |        0 |        0 |       1.974.832 |           1.974 |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
	<entry>
		<id>https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5292</id>
		<title>Benchmarks</title>
		<link rel="alternate" type="text/html" href="https://wiki.byte-welt.net/index.php?title=Benchmarks&amp;diff=5292"/>
		<updated>2013-08-07T14:42:42Z</updated>

		<summary type="html">&lt;p&gt;Fastjack: Die Seite wurde neu angelegt: „Ich poste mal ein absichtlich stark vereinfachtes und leicht zu bedienendes Benchmarkingsystem. Es basiert nur auf zwei Klassen, nämlich dem eigentlichen System …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ich poste mal ein absichtlich stark vereinfachtes und leicht zu bedienendes Benchmarkingsystem. Es basiert nur auf zwei Klassen, nämlich dem eigentlichen System namens QuickBench und einer Schnittstelle namens Bench, das den einzelnen Benchmark darstellt. Ich denke die Benutzung ist wirklich einfach. Benches, die auf einer Objektstruktur arbeiten und mit unterschiedlich vielen Objekten gebencht werden sollen sind ebenso möglich, wie Benches, die nur eine bestimmte Funktion messen sollen, z.B. fib oder fac() und Co.&lt;br /&gt;
&lt;br /&gt;
Das System erhebt keinesfalls den Anspruch perfekt implementiert oder jetzt der neue Meilenstein in Sachen benchmarking zu sein. Falls jemandem Fehler auffallen oder konstruktive Kritik besteht, bitte einfach kommentieren.&lt;br /&gt;
&lt;br /&gt;
Das Interface Bench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Bench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Schnittstelle beschreibt einen Benchmark.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public interface Bench {&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * @return der Name.&lt;br /&gt;
     */&lt;br /&gt;
    String getName();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * setzt den Benchmark und alle Resourcen, die er benutzt in den Urzustand zur&amp;amp;uuml;ck.&lt;br /&gt;
     */&lt;br /&gt;
    void reset();&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * Bereitet den Benchmark zur Ausf&amp;amp;uuml;hrung vor.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark vorbereitet wird.&lt;br /&gt;
     */&lt;br /&gt;
    void prepare(long lm);&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt den Benchmark aus.&lt;br /&gt;
     *&lt;br /&gt;
     * @param lm Parameter anhand dessen der Benchmark ausgef&amp;amp;uuml;hrt wird.&lt;br /&gt;
     */&lt;br /&gt;
    void execute(long lm);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die abstrakte Klasse Bench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * AbstractBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 06.01.2011&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese Klasse stellt einen abstrakten Benchmark dar.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public abstract class AbstractBench implements Bench {&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return this.getClass().getSimpleName();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void prepare(long lm) {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    @Override&lt;br /&gt;
    public void reset() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Benchmarksystem QuickBench:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * QuickBench.java&lt;br /&gt;
 *&lt;br /&gt;
 * 03.06.2010&lt;br /&gt;
 *&lt;br /&gt;
 * (c) fastjack&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
package blog.benchmarking;&lt;br /&gt;
 &lt;br /&gt;
import java.util.*;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Diese kleine Klasse soll ein einfaches Benchmarksystem darstellen.&lt;br /&gt;
 *&lt;br /&gt;
 * @author fastjack&lt;br /&gt;
 * @version 1.0&lt;br /&gt;
 */&lt;br /&gt;
public class QuickBench {&lt;br /&gt;
 &lt;br /&gt;
    private final static String headerNxMSep = &amp;quot;+---------------------------+----------+-------&amp;quot;&lt;br /&gt;
            + &amp;quot;-----+----------+----------+-----------------+-----------------+&amp;quot;;&lt;br /&gt;
    private final static String headerNxM = &amp;quot;| %-25s | %8s | %10s | %8s | %8s | %15s | %15s &amp;quot;&lt;br /&gt;
            + &amp;quot;|\n&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervallSep = &amp;quot;+---------------------------+----------&amp;quot;&lt;br /&gt;
            + &amp;quot;+------------+------------+----------+----------+-----------------+-------------&amp;quot;&lt;br /&gt;
            + &amp;quot;----+&amp;quot;;&lt;br /&gt;
    private final static String headerNxIntervall = &amp;quot;| %-25s | %8s | %10s | %10s | %8s | %8s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s | %15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxM = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %,15d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxMWNT = &amp;quot;| %-25s | %,8d | %,10d | %,8d | %,8d | %15s | &amp;quot;&lt;br /&gt;
            + &amp;quot;%15s |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervall = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d | &amp;quot;&lt;br /&gt;
            + &amp;quot;%,8d | %,15d | %,15d |\n&amp;quot;;&lt;br /&gt;
    private final static String patternNxIntervallWNT = &amp;quot;| %-25s | %,8d | %,10d | %,10d | %,8d &amp;quot;&lt;br /&gt;
            + &amp;quot;| %,8d | %15s | %15s |\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
    private QuickBench() {&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet. Bevor das Benchmarking&lt;br /&gt;
     * gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch den&lt;br /&gt;
     * Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Alle Benchmarks werden zu jedem Eintrag e in n i-mal (i &amp;lt;= e) wiederholt,&lt;br /&gt;
     * jeweils mit einem Wert aus dem dem angegebenen Intervall.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxIntervall(long minMs, long wm, long[] n, long mmin, long mmax,&lt;br /&gt;
            Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        System.out.printf(headerNxIntervall, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;min&amp;quot;, &amp;quot;max&amp;quot;, &amp;quot;ms&amp;quot;,&lt;br /&gt;
                &amp;quot;ms (avg)&amp;quot;, &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            qb.executeIntervall(b, n, minMs, mmin, mmax);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxIntervallSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die z.B. einer Anzahl von Objekten basieren, aus. Der Benchmark&lt;br /&gt;
     * wird zurerst zur&amp;amp;uuml;ckgesetzt und jeweils zu einem Wert aus m vorbereitet. Bevor das&lt;br /&gt;
     * Benchmarking gestartet wird, wird ein warmup zu allen Benchmarks aufgerufen und wie durch&lt;br /&gt;
     * den Parameter wm angegeben, wiederholt. Die Anzahl an Durchl&amp;amp;auml;ufen wird im Feld n&lt;br /&gt;
     * angegeben. Die Anzahl der Objekte im Feld m. Alle Benchmarks werden zu jedem Eintrag m0&lt;br /&gt;
     * in m i-mal (i &amp;lt;= m0) durchlaufen und zu jedem Eintrag n0 in n j-mal (j &amp;lt;= n0)&lt;br /&gt;
     * zu dem Wert m0 ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param wm WarmUp-Iterationen.&lt;br /&gt;
     * @param n Anzahl an Iterationen.&lt;br /&gt;
     * @param m Anzahl an z.B. Objekten.&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     */&lt;br /&gt;
    public static void benchNxM(long minMs, long wm, long[] n, long[] m, Bench[] ba) {&lt;br /&gt;
        QuickBench qb = new QuickBench();&lt;br /&gt;
        qb.warmup(ba, wm);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        System.out.printf(headerNxM, &amp;quot;Bench&amp;quot;, &amp;quot;Rounds&amp;quot;, &amp;quot;Objects&amp;quot;, &amp;quot;ms&amp;quot;, &amp;quot;ms (avg)&amp;quot;,&lt;br /&gt;
                &amp;quot;nt&amp;quot;, &amp;quot;nt (avg)&amp;quot;);&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        for (int i = 0; i &amp;lt; ba.length; i++) {&lt;br /&gt;
            Bench b = ba[i];&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; m.length; ii++) {&lt;br /&gt;
                qb.execute(b, n, minMs, m[ii]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(headerNxMSep);&lt;br /&gt;
        qb.showInfo();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * Zeigt Informationen zum System an.&lt;br /&gt;
     */&lt;br /&gt;
    private void showInfo() {&lt;br /&gt;
        System.out.println(&amp;quot;java version &amp;quot; + System.getProperty(&amp;quot;java.version&amp;quot;));&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.runtime.name&amp;quot;) + &amp;quot;(build &amp;quot; +&lt;br /&gt;
                System.getProperty(&amp;quot;java.runtime.version&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;java.vm.name&amp;quot;) + &amp;quot;(build &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.version&amp;quot;) + &amp;quot;, &amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;java.vm.info&amp;quot;) + &amp;quot;)&amp;quot;);&lt;br /&gt;
        System.out.println(System.getProperty(&amp;quot;os.name&amp;quot;) + &amp;quot;(&amp;quot;&lt;br /&gt;
                + System.getProperty(&amp;quot;os.version&amp;quot;) + &amp;quot;) &amp;quot; + System.getProperty(&amp;quot;os.arch&amp;quot;));&lt;br /&gt;
        System.out.println(&amp;quot;Max memory: &amp;quot; + Runtime.getRuntime().maxMemory() / (1024 * 1024)&lt;br /&gt;
                + &amp;quot;MB&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt ein warmup zu allen Benchmarks durch. Dabei werden die Benches jeweils mit den&lt;br /&gt;
     * Werten 1 vorbereitet und ausgef&amp;amp;uuml;hrt.&lt;br /&gt;
     *&lt;br /&gt;
     * @param ba Benchmarks.&lt;br /&gt;
     * @param n Anzahl an Durchl&amp;amp;auml;ufen zum WarmUp.&lt;br /&gt;
     */&lt;br /&gt;
    private void warmup(Bench[] ba, long n) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ba.length; ii++) {&lt;br /&gt;
                Bench b = ba[ii];&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(1);&lt;br /&gt;
                b.execute(1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks, die auf Funktionen etc. aufbauen und einen numerischen Parameter&lt;br /&gt;
     * als Eingabe ben&amp;amp;ouml;tigen, aus. Diese Parameter werden in einem Intervall angegeben. Der&lt;br /&gt;
     * Benchmark wird zurerst zur&amp;amp;uuml;ckgesetzt aber nicht vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param mmin Minimum des Intervalls.&lt;br /&gt;
     * @param mmax Maximum des Intervalls.&lt;br /&gt;
     */&lt;br /&gt;
    private void executeIntervall(Bench b, long[] n, long minMs, long mmin, long mmax) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                for (long l = mmin; l &amp;lt; mmax; l++) {&lt;br /&gt;
                    b.reset();&lt;br /&gt;
                    ms0 = -System.currentTimeMillis();&lt;br /&gt;
                    nt0 = -System.nanoTime();&lt;br /&gt;
                    b.execute(l);&lt;br /&gt;
                    nt0 += System.nanoTime();&lt;br /&gt;
                    ms0 += System.currentTimeMillis();&lt;br /&gt;
                    ms += ms0;&lt;br /&gt;
                    nt += nt0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxIntervall, b.getName(), ln, mmin, mmax, ms, ms / ln,&lt;br /&gt;
                        nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxIntervallWNT, b.getName(), ln, mmin, mmax, ms,&lt;br /&gt;
                        ms / ln, &amp;quot;...&amp;quot;, &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
     * F&amp;amp;uuml;hrt Benchmarks zu einem gegebenen Wert aus. Der Benchmark wird zurerst&lt;br /&gt;
     * zur&amp;amp;uuml;ckgesetzt und zu dem Wert val vorbereitet.&lt;br /&gt;
     *&lt;br /&gt;
     * @param b Benchmark.&lt;br /&gt;
     * @param n Iterationen.&lt;br /&gt;
     * @param minMs minimale Millesekunden, bei denen Nanosekunden angezeigt werden.&lt;br /&gt;
     * @param val Wert.&lt;br /&gt;
     */&lt;br /&gt;
    private void execute(Bench b, long[] n, long minMs, long val) {&lt;br /&gt;
        for (int i = 0; i &amp;lt; n.length; i++) {&lt;br /&gt;
            long ln = n[i];&lt;br /&gt;
            long ms = 0;&lt;br /&gt;
            long nt = 0;&lt;br /&gt;
            long ms0 = 0;&lt;br /&gt;
            long nt0 = 0;&lt;br /&gt;
            for (int ii = 0; ii &amp;lt; ln; ii++) {&lt;br /&gt;
                b.reset();&lt;br /&gt;
                b.prepare(val);&lt;br /&gt;
                ms0 = -System.currentTimeMillis();&lt;br /&gt;
                nt0 = -System.nanoTime();&lt;br /&gt;
                b.execute(val);&lt;br /&gt;
                nt0 += System.nanoTime();&lt;br /&gt;
                ms0 += System.currentTimeMillis();&lt;br /&gt;
                ms += ms0;&lt;br /&gt;
                nt += nt0;&lt;br /&gt;
            }&lt;br /&gt;
            if (ms &amp;lt; minMs) {&lt;br /&gt;
                System.out.printf(patternNxM, b.getName(), ln, val, ms, ms / ln, nt, (nt / ln));&lt;br /&gt;
            } else {&lt;br /&gt;
                System.out.printf(patternNxMWNT, b.getName(), ln, val, ms, ms / ln, &amp;quot;...&amp;quot;,&lt;br /&gt;
                        &amp;quot;...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleines Beispiel zum Traversieren einer Liste (NxM):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
     Bench b0 = new Bench() {&lt;br /&gt;
            List&amp;lt;String&amp;gt; l = null;&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public String getName() {&lt;br /&gt;
                return &amp;quot;Traverse&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void reset() {&lt;br /&gt;
                l = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void prepare(long lm) {&lt;br /&gt;
                for (int i = 0; i &amp;lt; lm; i++) {&lt;br /&gt;
                    l.add(String.valueOf(i));&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            @Override&lt;br /&gt;
            public void execute(long lm) {&lt;br /&gt;
                for (int i = 0, n = l.size(); i &amp;lt; n; i++) {&lt;br /&gt;
                    String s = l.get(i);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Benutzung:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
        QuickBench.benchNxM(10, 50000, new long[] { 10, 100, 1000 }, new long[] { 10000, 100000 },&lt;br /&gt;
                new Bench[] { b0 });&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man folgendes:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |    Objects |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Traverse ArrayList For    |       10 |     10.000 |        0 |        0 |       1.945.638 |         194.563 |&lt;br /&gt;
| Traverse ArrayList For    |      100 |     10.000 |       16 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |     10.000 |      171 |        0 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |       10 |    100.000 |       16 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |      100 |    100.000 |      109 |        1 |             ... |             ... |&lt;br /&gt;
| Traverse ArrayList For    |    1.000 |    100.000 |    1.170 |        1 |             ... |             ... |&lt;br /&gt;
+---------------------------+----------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Legende:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Bench: Name des Benchmarks.&lt;br /&gt;
Rounds: Anzahl an Durchläufen.&lt;br /&gt;
Objects: Anzahl an verwendeteten Objekten.&lt;br /&gt;
ms: Gesamtzeitbedarf in Millisekunden.&lt;br /&gt;
ms (avg): Durchschnittlicher Zeitbedarf in Millisekunden.&lt;br /&gt;
nt: Gesamtzeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
nt (avg): Durchschnittlicher Zeitbedarf in Nanosekunden. Wenn ms &amp;gt; minMs wird hier nichts angezeigt.&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Beispiele folgen...&lt;br /&gt;
&lt;br /&gt;
Und zwar jetzt:&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu NxIntervall (Fibonacci rekursiv und nicht-rekursiv):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    /* fibonacci -&amp;gt; recursive */&lt;br /&gt;
    static class FibBench_Recursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private int fib(int a) {&lt;br /&gt;
            if (a == 1 || a == 2) {&lt;br /&gt;
                return 1;&lt;br /&gt;
            } else {&lt;br /&gt;
                return fib(a - 1) + fib(a - 2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
 &lt;br /&gt;
    /* fibonacci -&amp;gt; non-recursive */&lt;br /&gt;
    static class FibBench_NonRecursive extends AbstractBench {&lt;br /&gt;
 &lt;br /&gt;
        private long fib(int a) {&lt;br /&gt;
            long fib = 1;&lt;br /&gt;
            for (long fib1 = 1, fib2 = 1, i = 3; i &amp;lt;= a; i++) {&lt;br /&gt;
                fib = fib1 + fib2;&lt;br /&gt;
                fib1 = fib2;&lt;br /&gt;
                fib2 = fib;&lt;br /&gt;
            }&lt;br /&gt;
            return fib;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public String getName() {&lt;br /&gt;
            return &amp;quot;Fibonacci: non-recursive&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void prepare(long lm) {&lt;br /&gt;
            this.fib(1);&lt;br /&gt;
            this.fib(2);&lt;br /&gt;
            this.fib(3);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        @Override&lt;br /&gt;
        public void execute(long lm) {&lt;br /&gt;
            this.fib((int) lm);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aufruf wie folgt: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        QuickBench.benchNxIntervall(10, 50000, new long[] { 10, 100, 1000}, 1, 25,&lt;br /&gt;
                new Bench[]{new FibBench_Recursive(), new FibBench_NonRecursive()});&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis erhält man ungefähr folgende Ausgabe:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Bench                     |   Rounds |        min |        max |       ms | ms (avg) |              nt |        nt (avg) |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
| Fibonacci: recursive      |       10 |          1 |         25 |        0 |        0 |       8.312.579 |         831.257 |&lt;br /&gt;
| Fibonacci: recursive      |      100 |          1 |         25 |       93 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: recursive      |    1.000 |          1 |         25 |      812 |        0 |             ... |             ... |&lt;br /&gt;
| Fibonacci: non-recursive  |       10 |          1 |         25 |        0 |        0 |          25.911 |           2.591 |&lt;br /&gt;
| Fibonacci: non-recursive  |      100 |          1 |         25 |        0 |        0 |         241.581 |           2.415 |&lt;br /&gt;
| Fibonacci: non-recursive  |    1.000 |          1 |         25 |        0 |        0 |       1.974.832 |           1.974 |&lt;br /&gt;
+---------------------------+----------+------------+------------+----------+----------+-----------------+-----------------+&lt;br /&gt;
java version 1.6.0_16&lt;br /&gt;
Java(TM) SE Runtime Environment(build 1.6.0_16-b01)&lt;br /&gt;
Java HotSpot(TM) Client VM(build 14.2-b01, mixed mode)&lt;br /&gt;
Windows Vista(6.0) x86&lt;br /&gt;
Max memory: 63MB&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Fastjack</name></author>
	</entry>
</feed>