package org.skyscreamer.yoga.demo.performance;
import java.io.ByteArrayOutputStream;
import org.skyscreamer.yoga.demo.dao.GenericDao;
import org.skyscreamer.yoga.demo.model.User;
import org.skyscreamer.yoga.listener.CountLimitRenderingListener;
import org.skyscreamer.yoga.view.AbstractYogaView;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class PerfRunner
{
PlatformTransactionManager txManager;
GenericDao dao;
AbstractYogaView view;
MockHttpServletRequest request = new MockHttpServletRequest();
{
request.setParameter("selector", "recommendedAlbums(songs(artist(fans)))");
}
MockHttpServletResponse response = new MockHttpServletResponse();
Runtime r = Runtime.getRuntime();
private TransactionStatus transaction;
private User user;
public long getMem(){
return r.totalMemory() - r.freeMemory();
}
public void init(){
transaction = txManager
.getTransaction(new DefaultTransactionDefinition());
user = dao.find(User.class, 1);
}
public void end(){
txManager.commit(transaction);
}
protected void render(int renderCount) throws Exception
{
r.gc();
long size = 0;
// long mem = getMem();
long start = System.nanoTime();
for (int i = 0; i < renderCount; i++)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
view.render(request, response, user, out);
size += out.size();
// System.out.println(new String(out.toByteArray()));
}
float total = (System.nanoTime() - start) / 1000000;
// long endMem = getMem();
System.out.println(String.format("rendering %d took %.2f avg: %.2f, memory: %.2fK size: %d",
renderCount, total, total / renderCount, ((float)getMem())/1024, size));
}
public static void main(String[] args) throws Exception
{
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/applicationContext.xml", "classpath:/applicationContext-test.xml");
PerfRunner perf = new PerfRunner();
perf.txManager = context.getBean(PlatformTransactionManager.class);
perf.dao = context.getBean(GenericDao.class);
context.getBean(CountLimitRenderingListener.class).setMaxCount(Integer.MAX_VALUE);
perf.init();
System.out.println("\n\nTesting default json");
perf.view = context.getBean("json.view", AbstractYogaView.class);
test(perf);
System.out.println("\n\nTesting streaming json");
perf.view = context.getBean("json.streaming.view", AbstractYogaView.class);
test(perf);
perf.end();
}
private static void test(PerfRunner perf) throws Exception {
perf.render(1);
perf.render(2);
perf.render(2);
perf.render(2);
perf.render(2);
perf.render(10);
perf.render(10);
perf.render(10);
perf.render(2);
perf.render(2);
}
}