001package org.jivesoftware.smack.full;
002
003import java.util.function.Supplier;
004
005import org.jivesoftware.smack.util.XmlStringBuilder;
006
007public class XmlStringBuilderTest {
008    static int COUNT_OUTER = 500;
009    static int COUNT_INNER = 50;
010
011    public static void main(String[] args) throws Exception {
012        test1();
013        test2();
014        test3();
015    }
016
017    public static void test1() throws Exception {
018        System.err.println("Test 1");
019        XmlStringBuilder parent = new XmlStringBuilder();
020        XmlStringBuilder child = new XmlStringBuilder();
021        XmlStringBuilder child2 = new XmlStringBuilder();
022
023        for (int i = 1; i < COUNT_OUTER; i++) {
024            XmlStringBuilder cs = new XmlStringBuilder();
025            for (int j = 0; j < COUNT_INNER; j++) {
026                cs.append("abc");
027            }
028            child2.append((CharSequence) cs);
029        }
030
031        child.append((CharSequence) child2);
032        parent.append((CharSequence) child);
033
034        time("test1: parent", () -> "len=" + parent.toString().length());
035        time("test1: child", () -> "len=" + child.toString().length());
036        time("test1: child2", () -> "len=" + child2.toString().length());
037    }
038
039    public static void test2() throws Exception {
040        System.err.println("Test 2: evaluate children first");
041        XmlStringBuilder parent = new XmlStringBuilder();
042        XmlStringBuilder child = new XmlStringBuilder();
043        XmlStringBuilder child2 = new XmlStringBuilder();
044
045        for (int i = 1; i < COUNT_OUTER; i++) {
046            XmlStringBuilder cs = new XmlStringBuilder();
047            for (int j = 0; j < COUNT_INNER; j++) {
048                cs.append("abc");
049            }
050            child2.append((CharSequence) cs);
051        }
052
053        child.append((CharSequence) child2);
054        parent.append((CharSequence) child);
055
056        time("test2: child2", () -> "len=" + child2.toString().length());
057        time("test2: child", () -> "len=" + child.toString().length());
058        time("test2: parent", () -> "len=" + parent.toString().length());
059    }
060
061    public static void test3() throws Exception {
062        System.err.println("Test 3: use append(XmlStringBuilder)");
063        XmlStringBuilder parent = new XmlStringBuilder();
064        XmlStringBuilder child = new XmlStringBuilder();
065        XmlStringBuilder child2 = new XmlStringBuilder();
066
067        for (int i = 1; i < COUNT_OUTER; i++) {
068            XmlStringBuilder cs = new XmlStringBuilder();
069            for (int j = 0; j < COUNT_INNER; j++) {
070                cs.append("abc");
071            }
072            child2.append(cs);
073        }
074
075        child.append(child2);
076        parent.append(child);
077
078        time("test3: parent", () -> "len=" + parent.toString().length());
079        time("test3: child", () -> "len=" + child.toString().length());
080        time("test3: child2", () -> "len=" + child2.toString().length());
081    }
082
083    static void time(String name, Supplier<String> block) {
084        long start = System.currentTimeMillis();
085        String result = block.get();
086        long end = System.currentTimeMillis();
087
088        System.err.println(name + " took " + (end - start) + "ms: " + result);
089    }
090}