2012-12-03 1 views
1

Представлен декомпрессор и компрессор в ChannelPipeline, но Слишком большое время выполнения по сравнению с временем выполнения обоих методов, введенных в конкретный класс.Почему время работы компрессора и декомпрессора, включенного в ChannelPipeline, слишком велико?

@Override 
public ChannelPipeline getPipeline() throws Exception { 
    ChannelPipeline pipeline = pipeline(); 
    pipeline.addLast("decoder",new IcapRequestDecoder(maxInitialLineLength, maxIcapHeaderSize, maxHttpHeaderSize, maxChunkSize)); 
    pipeline.addLast("chunkAggregator",new IcapChunkAggregator(maxContentLength)); 
    pipeline.addLast("decompressor",new IcapContentDecompressor()); 
    pipeline.addLast("encoder",new IcapResponseEncoder()); 
    pipeline.addLast("chunkSeparator",new IcapChunkSeparator(maxContentLength)); 
    pipeline.addLast("handler", handler); 
    pipeline.addLast("compressor",new IcapContentCompressor()); 
    return pipeline; 
} 

В чем могут быть причины ?.

+0

Я думаю, что невозможно помочь без дополнительной информации. Вы также пытались присоединить профилировщик, как вашkit к вашему приложению? –

ответ

0

Я расскажу подробнее.

Класс IcapContentCompress:

public class IcapContentCompressor extends SimpleChannelDownstreamHandler { 

... 

/** 
* Invoked when {@link Channel#write(Object)} is called. 
*/ 
@Override 
public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {   

      ... 

    IcapResponse icapResponse = (IcapResponse) msg; 

    // Get response message 
    HttpResponse httpMessage = icapResponse.getHttpResponse(); 

    ... 

    boolean compressed = isCompressed(httpMessage); 
    if (compressed) {   
     String acceptEncoding = httpMessage.getHeader(HttpHeaders.Names.CONTENT_ENCODING); 
     compress(httpMessage, acceptEncoding); 
    } 

    }  

    ctx.sendDownstream(e); 

} 

Метод компресс:

private void compress(HttpResponse httpMessage, String acceptEncoding) throws Exception {      
    ZlibWrapper wrapper = determineWrapper(acceptEncoding); 
    if (wrapper == null) { 
     return; 
    } 

    EncoderEmbedder<ChannelBuffer> encoder = new EncoderEmbedder<ChannelBuffer>(new ZlibEncoder(wrapper, compressionLevel, windowBits, memLevel)); 

    httpMessage.setHeader(
      HttpHeaders.Names.CONTENT_ENCODING, 
      getTargetContentEncoding(wrapper)); 

    ChannelBuffer contentCompressed = ChannelBuffers.wrappedBuffer(
              encode(httpMessage.getContent(), encoder), 
              finishEncode(encoder)); 

    // Replace the content. 
    httpMessage.setContent(contentCompressed); 
} 

Когда мы используем тот же метод в конкретном классе, не вводя в классе ChannelPipeline, время выполнения значительно меньше.