cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 1 | import java.io.*; |
| 2 | |
| 3 | import org.codehaus.jackson.*; |
| 4 | import org.codehaus.jackson.map.*; |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 5 | |
| 6 | public final class TestSerPerf |
| 7 | { |
| 8 | /* |
| 9 | ///////////////////////////////////////////////////// |
| 10 | // Bean classes |
| 11 | ///////////////////////////////////////////////////// |
| 12 | */ |
| 13 | |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 14 | static class NonFinalBean { |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 15 | final NonFinalBean2 _bean = new NonFinalBean2(); |
| 16 | |
| 17 | public NonFinalBean2 getBean() { return _bean; } |
| 18 | public NonFinalBean2 getBean2() { return _bean; } |
| 19 | public NonFinalBean2 getBean3() { return _bean; } |
| 20 | public NonFinalBean2 getBean4() { return _bean; } |
| 21 | } |
| 22 | |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 23 | static class NonFinalBean2 { |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 24 | public int getX() { return 3; } |
| 25 | public String getName() { return "foobar"; } |
| 26 | } |
| 27 | |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 28 | final static class FinalBean { |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 29 | final FinalBean2 _bean = new FinalBean2(); |
| 30 | |
| 31 | public FinalBean2 getBean() { return _bean; } |
| 32 | public FinalBean2 getBean2() { return _bean; } |
| 33 | public FinalBean2 getBean3() { return _bean; } |
| 34 | public FinalBean2 getBean4() { return _bean; } |
| 35 | } |
| 36 | |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 37 | final static class FinalBean2 { |
| 38 | public int getX() { return 3; } |
| 39 | public String getName() { return "foobar"; } |
| 40 | } |
| 41 | |
| 42 | final static class FinalFieldBean { |
| 43 | private final FinalFieldBean2 _bean = new FinalFieldBean2(); |
| 44 | |
| 45 | public FinalFieldBean2 fieldBean = _bean; |
| 46 | public FinalFieldBean2 fieldBean2 = _bean; |
| 47 | public FinalFieldBean2 fieldBean3 = _bean; |
| 48 | public FinalFieldBean2 fieldBean4 = _bean; |
| 49 | } |
| 50 | |
| 51 | final static class FinalFieldBean2 { |
cowtowncoder | 8759018 | 2009-06-28 01:22:13 +0000 | [diff] [blame] | 52 | public int x = 3; |
| 53 | public String name = "foobar"; |
cowtowncoder | b33abfc | 2009-02-21 00:19:08 +0000 | [diff] [blame] | 54 | } |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 55 | |
| 56 | private final int REPS; |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 57 | private final ObjectMapper _mapper; |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 58 | |
| 59 | final Object _finalBean = new FinalBean(); |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 60 | final Object _finalFieldBean = new FinalFieldBean(); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 61 | final Object _nonFinalBean = new NonFinalBean(); |
| 62 | |
cowtowncoder | 939cdad | 2009-12-10 07:26:29 +0000 | [diff] [blame] | 63 | private TestSerPerf() |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 64 | throws Exception |
| 65 | { |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 66 | _mapper = new ObjectMapper(); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 67 | // Let's try to guestimate suitable size... to get to 50 megs processed |
cowtowncoder | 8759018 | 2009-06-28 01:22:13 +0000 | [diff] [blame] | 68 | REPS = 10000; |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | public void test() |
| 72 | throws Exception |
| 73 | { |
| 74 | int i = 0; |
| 75 | int sum = 0; |
| 76 | |
| 77 | ByteArrayOutputStream result = new ByteArrayOutputStream(); |
| 78 | |
| 79 | // Let's create tree from objects |
| 80 | testObjectSer(_finalBean, 1, result); |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 81 | final JsonNode _tree = _mapper.readTree(new JsonFactory().createJsonParser(result.toByteArray())); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 82 | |
| 83 | while (true) { |
| 84 | try { Thread.sleep(100L); } catch (InterruptedException ie) { } |
cowtowncoder | 8759018 | 2009-06-28 01:22:13 +0000 | [diff] [blame] | 85 | int round = (i++ % 3); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 86 | |
| 87 | long curr = System.currentTimeMillis(); |
| 88 | String msg; |
| 89 | boolean lf = (round == 0); |
| 90 | |
| 91 | switch (round) { |
| 92 | |
| 93 | case 0: |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 94 | msg = "Jackson, object+GET, final"; |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 95 | sum += testObjectSer(_finalBean, REPS, result); |
| 96 | break; |
| 97 | case 1: |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 98 | msg = "Jackson, object+Field, final"; |
| 99 | sum += testObjectSer(_finalFieldBean, REPS, result); |
| 100 | break; |
| 101 | case 2: |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 102 | msg = "Jackson, tree"; |
| 103 | sum += testTreeSer(_tree, REPS, result); |
| 104 | break; |
cowtowncoder | 8759018 | 2009-06-28 01:22:13 +0000 | [diff] [blame] | 105 | |
| 106 | /* |
| 107 | case 4: |
| 108 | msg = "Jackson, object, nonfinal"; |
| 109 | sum += testObjectSer(_nonFinalBean, REPS, result); |
| 110 | break; |
| 111 | */ |
| 112 | |
| 113 | |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 114 | default: |
| 115 | throw new Error("Internal error"); |
| 116 | } |
| 117 | |
| 118 | curr = System.currentTimeMillis() - curr; |
| 119 | if (lf) { |
| 120 | System.out.println(); |
| 121 | } |
| 122 | System.out.println("Test '"+msg+"' -> "+curr+" msecs (" |
| 123 | +(sum & 0xFF)+")."); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 124 | } |
| 125 | } |
| 126 | |
| 127 | protected int testObjectSer(Object value, int reps, ByteArrayOutputStream result) |
| 128 | throws Exception |
| 129 | { |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 130 | for (int i = 0; i < reps; ++i) { |
| 131 | result.reset(); |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 132 | _mapper.writeValue(result, value); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 133 | } |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 134 | return _mapper.hashCode(); // just to get some non-optimizable number |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 135 | } |
| 136 | |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 137 | protected int testTreeSer(JsonNode root, int reps, ByteArrayOutputStream result) |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 138 | throws Exception |
| 139 | { |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 140 | for (int i = 0; i < reps; ++i) { |
| 141 | result.reset(); |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 142 | _mapper.writeValue(result, root); |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 143 | } |
cowtowncoder | 003228a | 2009-06-24 19:06:07 +0000 | [diff] [blame] | 144 | return _mapper.hashCode(); // just to get some non-optimizable number |
cowtowncoder | 3f1dee8 | 2009-02-19 20:11:55 +0000 | [diff] [blame] | 145 | } |
| 146 | |
| 147 | public static void main(String[] args) throws Exception |
| 148 | { |
| 149 | new TestSerPerf().test(); |
| 150 | } |
| 151 | } |