/**************************************************************** * 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.james.mime4j; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.james.mime4j.codec.CodecUtil; import org.apache.james.mime4j.descriptor.BodyDescriptor; import org.apache.james.mime4j.message.Header; import org.apache.james.mime4j.message.Message; import org.apache.james.mime4j.message.SimpleContentHandler; import org.apache.james.mime4j.parser.AbstractContentHandler; import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; import org.apache.james.mime4j.parser.MimeTokenStream; import org.apache.james.mime4j.storage.DefaultStorageProvider; import org.apache.james.mime4j.storage.MemoryStorageProvider; public class LongMultipartReadBench { public static void main(String[] args) throws Exception { byte[] content = loadMessage("long-multipart.msg"); if (content == null) { System.err.println("Test message not found"); return; } int testNumber = args.length > 0 ? Integer.parseInt(args[0]) : 0; Test test = createTest(testNumber); if (test == null) { System.err.println("No such test: " + testNumber); return; } int repetitions = args.length > 1 ? Integer.parseInt(args[1]) : 25000; System.out.println("Multipart message read."); System.out.println("No of repetitions: " + repetitions); System.out.println("Content length: " + content.length); System.out.println("Test: " + test.getClass().getSimpleName()); System.out.print("Warmup... "); long t0 = System.currentTimeMillis(); while (System.currentTimeMillis() - t0 < 1500) { test.run(content, 10); } System.out.println("done"); System.out.println("--------------------------------"); long start = System.currentTimeMillis(); test.run(content, repetitions); long finish = System.currentTimeMillis(); double seconds = (finish - start) / 1000.0; double mb = content.length * repetitions / 1024.0 / 1024; System.out.printf("Execution time: %f sec\n", seconds); System.out.printf("%.2f messages/sec\n", repetitions / seconds); System.out.printf("%.2f mb/sec\n", mb / seconds); } private static Test createTest(int testNumber) { switch (testNumber) { case 0: return new MimeTokenStreamTest(); case 1: return new AbstractContentHandlerTest(); case 2: return new SimpleContentHandlerTest(); case 3: return new MessageTest(); default: return null; } } private static byte[] loadMessage(String resourceName) throws IOException { ClassLoader cl = LongMultipartReadBench.class.getClassLoader(); ByteArrayOutputStream outstream = new ByteArrayOutputStream(); InputStream instream = cl.getResourceAsStream(resourceName); if (instream == null) { return null; } try { CodecUtil.copy(instream, outstream); } finally { instream.close(); } return outstream.toByteArray(); } private interface Test { void run(byte[] content, int repetitions) throws Exception; } private static final class MimeTokenStreamTest implements Test { public void run(byte[] content, int repetitions) throws Exception { MimeTokenStream stream = new MimeTokenStream(); for (int i = 0; i < repetitions; i++) { stream.parse(new ByteArrayInputStream(content)); for (int state = stream.getState(); state != MimeTokenStream.T_END_OF_STREAM; state = stream .next()) { } } } } private static final class AbstractContentHandlerTest implements Test { public void run(byte[] content, int repetitions) throws Exception { ContentHandler contentHandler = new AbstractContentHandler() { }; for (int i = 0; i < repetitions; i++) { MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(contentHandler); parser.parse(new ByteArrayInputStream(content)); } } } private static final class SimpleContentHandlerTest implements Test { public void run(byte[] content, int repetitions) throws Exception { ContentHandler contentHandler = new SimpleContentHandler() { @Override public void bodyDecoded(BodyDescriptor bd, InputStream is) throws IOException { } @Override public void headers(Header header) { } }; for (int i = 0; i < repetitions; i++) { MimeStreamParser parser = new MimeStreamParser(); parser.setContentHandler(contentHandler); parser.parse(new ByteArrayInputStream(content)); } } } private static final class MessageTest implements Test { public void run(byte[] content, int repetitions) throws Exception { DefaultStorageProvider.setInstance(new MemoryStorageProvider()); for (int i = 0; i < repetitions; i++) { new Message(new ByteArrayInputStream(content)); } } } /* // requires mail.jar and activation.jar to be present private static final class MimeMessageTest implements Test { public void run(byte[] content, int repetitions) throws Exception { for (int i = 0; i < repetitions; i++) { MimeMessage mm = new MimeMessage(null, new ByteArrayInputStream(content)); Multipart multipart = (Multipart) mm.getContent(); multipart.getCount(); // force parsing } } } */ }