用于在web(java)中优化输出的字符[]到字节[]

用于在web(java)中优化输出的字符[]到字节[],java,performance,bytearray,velocity,arrays,Java,Performance,Bytearray,Velocity,Arrays,我刚刚在infoq的经验分享演示中发现。它声称,如果在servlet中将字符串转换为字节[],将增加QPS(每秒查询数?)。 代码示例显示了比较: 之前 之后 结果之前 页面大小(K)94 最大QPS 1800 结果之后 页面大小(K)94 最大QPS 3500 有人能解释为什么它被优化了吗?我相信这是真的 更新 以防我造成任何误导。我需要解释一下,最初的演示文稿仅将此作为示例。他们实际上通过这种方式重构了velocity引擎。但是这个源代码有点长 实际上,在演讲中并没有暗示他们是如何做

我刚刚在infoq的经验分享演示中发现。它声称,如果在servlet中将字符串转换为字节[],将增加QPS(每秒查询数?)。 代码示例显示了比较:

之前 之后 结果之前
  • 页面大小(K)94
  • 最大QPS 1800
结果之后
  • 页面大小(K)94
  • 最大QPS 3500
有人能解释为什么它被优化了吗?我相信这是真的

更新

以防我造成任何误导。我需要解释一下,最初的演示文稿仅将此作为示例。他们实际上通过这种方式重构了velocity引擎。但是这个源代码有点长

实际上,在演讲中并没有暗示他们是如何做的。但我找到了一些线索

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

<强壮>就像上面的路。这很有道理,对吧?

(但他们肯定也应该重构节点接口。写入程序不能写入字节[]。这意味着使用OutputStream!)

正如Perception所建议的那样,实际上是将一个Write finally委托给streamncoder。而StreamEncoder写入将首先将char[]更改为byte[]。然后将其委托给OutputSteam进行真正的写入。您可以很容易地参考源代码并证明它。 考虑到每次都会调用呈现方法来显示页面,因此节省的成本将是可观的


除了不调用相同的输出方法之外,在第二个示例中,您还避免了在将字符串写入输出流之前将其转换为字节的开销。但是,这些场景并不十分现实,web应用程序的动态特性阻止了将所有数据模型预转换为字节流,现在没有像这样直接写入HTTP输出流的严肃体系结构。

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

@Oli:@Oli:这只是一个例子。它声称他们重构velocity引擎使用这种方式来优化性能很多~这只是一个例子。它声称他们重构velocity引擎使用这种方式来优化性能表演很多~
private static String content = “…94k…”;
protected doGet(…){
response.getWrite().print(content);
}
private static String content = “…94k…”;
Private static byte[] bytes = content.getBytes();
protected doGet(…){
response.getOutputStream().write(bytes);
}
 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;
    }
}