Char []到Byte []用于web中的输出优化(java)

Cla*_*Bao 1 java arrays performance velocity bytearray

我只是在一个来自infoq的经历分享演示中找到.它声称如果你将字符串转换为servlet中的byte [],它将增加QPS(每秒查询数?).代码示例显示了比较:

之前

private static String content = “…94k…”;
protected doGet(…){
response.getWrite().print(content);
}
Run Code Online (Sandbox Code Playgroud)

private static String content = “…94k…”;
Private static byte[] bytes = content.getBytes();
protected doGet(…){
response.getOutputStream().write(bytes);
}
Run Code Online (Sandbox Code Playgroud)

结果之前

  • 页面大小(K)94
  • 最大QPS 1800

结果之后

  • 页面大小(K)94
  • 最大QPS 3500

谁能解释为什么它被优化了?我相信这是真的.

UPDATE

如果我引起任何误导.我需要解释原始演示文稿仅以此为例.他们实际上通过这种方式重构速度引擎.BUt这个源代码有点长.

实际上在演示文稿中并没有暗示他们如何详细地做到这一点.但我发现了一些领先优势.

在ASTText.java中,他们缓存了byte [] ctext而不是char [] ctext,这大大提升了性能〜!

就像上面的方式一样.这很有道理,对吧?

(但是他们肯定也应该重构Node接口.Writer不能写byte [].这意味着使用OutputStream代替!)

正如Perception所建议的那样,Write最终委托给StreamEncoder.而StreamEncoder写入将首先将char []更改为byte [].然后将其委托给OutputSteam进行实际写入.您可以轻松参考源代码并进行验证.考虑到每次显示页面时都会调用render方法,节省的成本将相当可观.

StreamEncoder.class

 public class ASTText extends SimpleNode {
            private char[] ctext;
        /**
         * @param id
         */
        public ASTText(int id) {
            super (id);
        }

        /**
         * @param p
         * @param id
         */
        public ASTText(Parser p, int id) {
            super (p, id);
        }

        /**
         * @see org.apache.velocity.runtime.parser.node.SimpleNode#jjtAccept(org.apache.velocity.runtime.parser.node.ParserVisitor, java.lang.Object)
         */
        public Object jjtAccept(ParserVisitor visitor, Object data) {
            return visitor.visit(this , data);
        }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#init(org.apache.velocity.context.InternalContextAdapter, java.lang.Object)
     */
    public Object init(InternalContextAdapter context, Object data)
            throws TemplateInitException {
        Token t = getFirstToken();

        String text = NodeUtils.tokenLiteral(t);

        ctext = text.toCharArray();

        return data;
    }

    /**
     * @see org.apache.velocity.runtime.parser.node.SimpleNode#render(org.apache.velocity.context.InternalContextAdapter, java.io.Writer)
     */
    public boolean render(InternalContextAdapter context, Writer writer)
            throws IOException {
        if (context.getAllowRendering()) {
            writer.write(ctext);
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Per*_*ion 5

除了不调用相同的输出方法之外,在第二个示例中,您可以避免在将String写入输出流之前将字符串转换为字节的开销.但是,这些场景不太现实,Web应用程序的动态特性阻止了将所有数据模型预转换为字节流.而且,现在还没有严肃的架构,你将直接写入这样的HTTP输出流.