/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package org.apache.shindig.social.opensocial.util;
import org.apache.shindig.social.JsonLibTestsGuiceModule;
import org.apache.shindig.social.SocialApiTestsGuiceModule;
import org.apache.shindig.social.core.model.ActivityImpl;
import org.apache.shindig.social.core.model.AddressImpl;
import org.apache.shindig.social.core.model.ListFieldImpl;
import org.apache.shindig.social.core.model.MediaItemImpl;
import org.apache.shindig.social.core.model.NameImpl;
import org.apache.shindig.social.core.model.PersonImpl;
import org.apache.shindig.social.core.util.BeanJsonConverter;
import org.apache.shindig.social.core.util.BeanJsonLibConverter;
import org.apache.shindig.social.opensocial.model.Activity;
import org.apache.shindig.social.opensocial.model.Address;
import org.apache.shindig.social.opensocial.model.ListField;
import org.apache.shindig.social.opensocial.model.MediaItem;
import org.apache.shindig.social.opensocial.model.Person;
import com.google.common.collect.Lists;
import com.google.inject.Guice;
import com.google.inject.Injector;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
public class JsonConverterPerformancePerf extends TestCase {
private static final Log log = LogFactory.getLog(JsonConverterPerformancePerf.class);
private static final int TEST_SIZE = 10000;
private Person johnDoe;
private Activity activity;
private BeanJsonLibConverter beanJsonLibConverter;
private BeanJsonConverter beanJsonConverter;
@Override
public void setUp() throws Exception {
super.setUp();
johnDoe = new PersonImpl("johnDoeId", "Johnny", new NameImpl("John Doe"));
johnDoe.setPhoneNumbers(Lists.<ListField> newArrayList(new ListFieldImpl("home",
"+33H000000000"), new ListFieldImpl("mobile", "+33M000000000"), new ListFieldImpl("work",
"+33W000000000")));
johnDoe.setAddresses(Lists.<Address> newArrayList(new AddressImpl("My home address")));
johnDoe.setEmails(Lists.<ListField> newArrayList(
new ListFieldImpl("work", "john.doe@work.bar"), new ListFieldImpl("home",
"john.doe@home.bar")));
activity = new ActivityImpl("activityId", johnDoe.getId());
activity.setMediaItems(Lists.<MediaItem> newArrayList(new MediaItemImpl("image/jpg",
MediaItem.Type.IMAGE, "http://foo.bar")));
Injector injector = Guice.createInjector(new JsonLibTestsGuiceModule());
beanJsonLibConverter = injector.getInstance(BeanJsonLibConverter.class);
beanJsonConverter = new BeanJsonConverter(
Guice.createInjector(new SocialApiTestsGuiceModule()));
}
public static class SpecialPerson extends PersonImpl {
private String newfield;
public SpecialPerson() {
super();
}
public SpecialPerson(String id, String name, String newfield) {
super(id, name, new NameImpl(name));
this.newfield = newfield;
}
public String getNewfield() {
return newfield;
}
public void setNewfield(String newfield) {
this.newfield = newfield;
}
}
public void testToJsonLibOnInheritedClassOutput() throws Exception {
SpecialPerson[] spa = new SpecialPerson[TEST_SIZE];
for (int i = 0; i < TEST_SIZE; i++) {
spa[i] = new SpecialPerson(String.valueOf(i), "robot", "nonsense");
}
Runtime r = Runtime.getRuntime();
r.gc();
long memstart = r.totalMemory() - r.freeMemory();
long startOutput = System.currentTimeMillis();
String[] output = new String[TEST_SIZE];
for (int i = 0; i < TEST_SIZE; i++) {
output[i] = beanJsonLibConverter.convertToString(spa[i]);
}
long endOutput = System.currentTimeMillis();
long memend = r.totalMemory() - r.freeMemory();
String[] serializeOutput = new String[TEST_SIZE];
char[] source = output[0].toCharArray();
r.gc();
long stringsizeStart = r.totalMemory() - r.freeMemory();
for (int i = 0; i < TEST_SIZE; i++) {
serializeOutput[i] = new String(source);
}
long stringsizeEnd = r.totalMemory() - r.freeMemory();
/*
* Output the time per conversion and the memory usage - the output per
* conversion.
*
*/
log
.info("SF JSON Lib Output "
+ average(startOutput, endOutput, TEST_SIZE)
+ " ms/conversion, "
+ (average(memstart, memend, TEST_SIZE) - average(stringsizeStart, stringsizeEnd,
TEST_SIZE)) + " heap bytes/conversion, output packet consumed on average "
+ average(stringsizeStart, stringsizeEnd, TEST_SIZE) + " for a string length of "
+ output[0].length());
log.info("Output Was [" + output[0] + "]");
}
public void testToJsonLibOnInheritedClassInput() throws Exception {
SpecialPerson[] spa = new SpecialPerson[TEST_SIZE];
SpecialPerson[] sparesult = new SpecialPerson[TEST_SIZE];
Runtime r = Runtime.getRuntime();
r.gc();
long personStart = r.totalMemory() - r.freeMemory();
for (int i = 0; i < TEST_SIZE; i++) {
spa[i] = new SpecialPerson(String.valueOf(i), "robot", "nonsense");
}
long personEnd = r.totalMemory() - r.freeMemory();
String[] serializeOutput = new String[TEST_SIZE];
r.gc();
for (int i = 0; i < TEST_SIZE; i++) {
serializeOutput[i] = beanJsonLibConverter.convertToString(spa[i]);
}
r.gc();
long memstart = r.totalMemory() - r.freeMemory();
long startInput = System.currentTimeMillis();
for (int i = 0; i < TEST_SIZE; i++) {
sparesult[i] = beanJsonLibConverter.convertToObject(serializeOutput[i], SpecialPerson.class);
}
long endInput = System.currentTimeMillis();
long memend = r.totalMemory() - r.freeMemory();
log.info("SF JSON Lib Input " + average(startInput, endInput, TEST_SIZE) + " ms/conversion, "
+ (average(memstart, memend, TEST_SIZE) - average(personStart, personEnd, TEST_SIZE))
+ " heap bytes/conversion, person object consumed on average "
+ average(personStart, personEnd, TEST_SIZE));
}
public void testToJsonOnInheritedClassOutput() throws Exception {
SpecialPerson[] spa = new SpecialPerson[TEST_SIZE];
for (int i = 0; i < TEST_SIZE; i++) {
spa[i] = new SpecialPerson(String.valueOf(i), "robot", "nonsense");
}
Runtime r = Runtime.getRuntime();
String[] output = new String[TEST_SIZE];
r.gc();
long memstart = r.totalMemory() - r.freeMemory();
long startOutput = System.currentTimeMillis();
for (int i = 0; i < TEST_SIZE; i++) {
output[i] = ((JSONObject) beanJsonConverter.convertToJson(spa[i])).toString();
}
long endOutput = System.currentTimeMillis();
long memend = r.totalMemory() - r.freeMemory();
String[] serializeOutput = new String[TEST_SIZE];
char[] source = output[0].toCharArray();
r.gc();
long stringsizeStart = r.totalMemory() - r.freeMemory();
for (int i = 0; i < TEST_SIZE; i++) {
serializeOutput[i] = new String(source);
}
long stringsizeEnd = r.totalMemory() - r.freeMemory();
log
.info("ORG JSON Lib Output "
+ average(startOutput, endOutput, TEST_SIZE)
+ " ms/conversion, "
+ (average(memstart, memend, TEST_SIZE) - average(stringsizeStart, stringsizeEnd,
TEST_SIZE)) + " heap bytes/conversion, output packet consumed on average "
+ average(stringsizeStart, stringsizeEnd, TEST_SIZE) + " for a string length of "
+ output[0].length());
log.info("Output Was [" + output[0] + "]");
}
/**
* @param endOutput
* @param startOutput
* @param testSize
* @return
*/
private float average(long start, long end, int testSize) {
float r = end - start;
r = r / testSize;
return r;
}
public void XtestToJsonOnInheritedClassInput() throws Exception {
SpecialPerson[] spa = new SpecialPerson[TEST_SIZE];
SpecialPerson[] sparesult = new SpecialPerson[TEST_SIZE];
Runtime r = Runtime.getRuntime();
r.gc();
long personStart = r.totalMemory() - r.freeMemory();
for (int i = 0; i < TEST_SIZE; i++) {
spa[i] = new SpecialPerson(String.valueOf(i), "robot", "nonsense");
}
long personEnd = r.totalMemory() - r.freeMemory();
String[] serializeOutput = new String[TEST_SIZE];
r.gc();
for (int i = 0; i < TEST_SIZE; i++) {
serializeOutput[i] = beanJsonConverter.convertToString(spa[i]);
}
r.gc();
long memstart = r.totalMemory() - r.freeMemory();
long startInput = System.currentTimeMillis();
for (int i = 0; i < TEST_SIZE; i++) {
sparesult[i] = beanJsonConverter.convertToObject(serializeOutput[i], SpecialPerson.class);
}
long endInput = System.currentTimeMillis();
long memend = r.totalMemory() - r.freeMemory();
log.info("SF JSON Lib Input " + average(startInput, endInput, TEST_SIZE) + " ms/conversion, "
+ (average(memstart, memend, TEST_SIZE) - average(personStart, personEnd, TEST_SIZE))
+ " heap bytes/conversion, person object consumed on average "
+ average(personStart, personEnd, TEST_SIZE));
}
}