/* * 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.ignite.loadtests.client; import java.io.IOException; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.apache.ignite.internal.client.marshaller.GridClientMarshaller; import org.apache.ignite.internal.client.marshaller.jdk.GridClientJdkMarshaller; import org.apache.ignite.internal.client.marshaller.optimized.GridClientOptimizedMarshaller; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import static org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest.GridCacheOperation.CAS; /** * Tests basic performance of marshallers. */ public class ClientMarshallerBenchmarkTest extends GridCommonAbstractTest { /** Marshallers to test. */ private GridClientMarshaller[] marshallers; /** */ public ClientMarshallerBenchmarkTest() { marshallers = new GridClientMarshaller[] { new GridClientJdkMarshaller(), new GridClientOptimizedMarshaller() }; } /** * @throws Exception If failed. */ public void testCacheRequestTime() throws Exception { GridClientCacheRequest req = new GridClientCacheRequest(CAS); req.clientId(UUID.randomUUID()); req.cacheName("CacheName"); req.requestId(1024); req.key("key"); req.value(1L); req.value2(2L); Map<Object, Object> additional = new HashMap<>(); for (int i = 0; i < 1000; i++) additional.put("key" + i, (long)i); req.values(additional); // Warm up. for (GridClientMarshaller marshaller : marshallers) { GridClientCacheRequest res = runMarshallUnmarshalLoop(req, 1, marshaller); assertEquals(req.operation(), res.operation()); assertEquals(0, res.requestId()); // requestId is not marshalled. assertEquals(null, res.clientId()); // clientId is not marshalled. assertEquals(null, res.destinationId()); // destinationId is not marshalled. assertEquals(req.cacheName(), res.cacheName()); assertEquals(req.key(), res.key()); assertEquals(req.value(), res.value()); assertEquals(req.value2(), res.value2()); for (Map.Entry<Object, Object> e : req.values().entrySet()) assertEquals(e.getValue(), res.values().get(e.getKey())); } // Now real test. for (GridClientMarshaller marshaller : marshallers) runMarshallUnmarshalLoop(req, 1000, marshaller); } /** * Runs marshal/unmarshal loop and prints statistics. * * @param obj Object to marshal. * @param iterCnt Iteration count. * @param marshaller Marshaller to use. * @throws IOException If marshalling failed. * @return Unmarshalled object in last iteration */ @SuppressWarnings("unchecked") private <T> T runMarshallUnmarshalLoop(T obj, int iterCnt, GridClientMarshaller marshaller) throws IOException { if (iterCnt == 1) { // Warm-up, will not print statistics. ByteBuffer buf = marshaller.marshal(obj, 0); byte[] arr = new byte[buf.remaining()]; buf.get(arr); Object res = marshaller.unmarshal(arr); assertNotNull("Failed for marshaller: " + marshaller.getClass().getSimpleName(), res); return (T)res; } long marshallingTime = 0, unmarshallingTime = 0; long start = System.currentTimeMillis(); Object res = null; for (int i = 0; i < iterCnt; i++) { ByteBuffer buf = marshaller.marshal(obj, 0); byte[] raw = new byte[buf.remaining()]; buf.get(raw); long end = System.currentTimeMillis(); marshallingTime += (end - start); start = end; res = marshaller.unmarshal(raw); assertNotNull(res); end = System.currentTimeMillis(); unmarshallingTime += (end - start); start = end; } X.println("Marshalling statistics gathered [marshallerClass=" + marshaller.getClass().getSimpleName() + ", objClass=" + obj.getClass().getSimpleName() + ", marshallingTime=" + marshallingTime + ", unmarshallingTime=" + unmarshallingTime + "]"); assert res != null; return (T)res; } }