/*
* Copyright 2015 the original author or authors.
* Licensed 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.springframework.xd.dirt.integration.bus;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.integration.codec.kryo.PojoCodec;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.util.StopWatch;
import org.springframework.xd.tuple.TupleBuilder;
import org.springframework.xd.tuple.serializer.kryo.TupleKryoRegistrar;
/**
* Performance benchmark tests for {@link MessageBusSupport}
* @author David Turanski
*/
public class MessageBusSupportBenchmarkTests {
private static MessageBusSupport messageBusSupport;
/*
Baseline (before MessageValues):
StopWatch '': running time (millis) = 119480
-----------------------------------------
ms % Task name
-----------------------------------------
119480 100% simple tuple codec
---
After MessageValues and caching payload types:
StopWatch '': running time (millis) = 99382
-----------------------------------------
ms % Task name
-----------------------------------------
99382 100% simple tuple codec
*/
@BeforeClass
@SuppressWarnings({"unchecked", "rawtypes"})
public static void initMessageBus() {
TestMessageBus messageBus = new TestMessageBus();
messageBus.setCodec(new PojoCodec(new TupleKryoRegistrar()));
messageBusSupport = messageBus;
}
@Test
public void run() {
StopWatch watch = new StopWatch("MessageBusSupport");
watch.start("simple tuple codec");
runBenchmark(TupleBuilder.tuple().of("foo", "bar", "val", 1234));
watch.stop();
watch.start("string payload");
runBenchmark(StringUtils.leftPad("hello", 1000, "*"));
watch.stop();
System.out.println(watch.prettyPrint());
}
@SuppressWarnings({"unchecked", "rawtypes"})
private void runBenchmark(Object payload) {
Message<?> message = new GenericMessage(payload);
int ITERATIONS = 1000000;
for (int i = 0; i < ITERATIONS; i++) {
MessageValues msg = messageBusSupport.serializePayloadIfNecessary(message
);
messageBusSupport.deserializePayloadIfNecessary(msg.toMessage());
if (i > 0 && i % 100000 == 0) {
System.out.println("completed " + i + " iterations.");
}
}
}
public static class TestMessageBus extends MessageBusSupport {
@Override
public void bindConsumer(String name, MessageChannel channel, Properties properties) {
}
@Override
public void bindPubSubConsumer(String name, MessageChannel moduleInputChannel,
Properties properties) {
}
@Override
public void bindPubSubProducer(String name, MessageChannel moduleOutputChannel,
Properties properties) {
}
@Override
public void bindProducer(String name, MessageChannel channel, Properties properties) {
}
@Override
public void bindRequestor(String name, MessageChannel requests, MessageChannel replies,
Properties properties) {
}
@Override
public void bindReplier(String name, MessageChannel requests, MessageChannel replies,
Properties properties) {
}
}
}