我只是在来自infoq的经历分享演示中找到。它声称如果你将字符串转换为servlet中的byte [],它将增加QPS(每秒查询数?)。 代码示例显示了比较:
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);
}
任何人都可以解释为什么它被优化了吗?我相信这是真的。
更新
如果我引起任何误导。我需要解释原始演示文稿仅以此为例。他们实际上通过这种方式重构速度引擎。 BUt这个源代码有点长。
实际上在演示文稿中并没有暗示他们如何详细地做到这一点。但我发现了一些领先优势。
在ASTText.java中,他们缓存了byte [] ctext而不是char [] ctext,这大大提升了性能〜!
就像上面那样。这很有道理,对吧?
(但是他们也应该重构Node接口.Writer不能写byte []。这意味着使用OutputStream!)
As Perception建议实际上Write最终委托给StreamEncoder。而StreamEncoder写入将首先将char []更改为byte []。然后将其委托给OutputSteam进行实际写入。您可以轻松参考源代码并进行验证。 考虑到每次显示页面时都会调用渲染方法,节省的成本将相当可观。
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;
}
}
答案 0 :(得分:5)
除了您没有调用相同的输出方法之外,在第二个示例中,您可以避免在将String写入输出流之前将字符串转换为字节的开销。但是,这些场景不太现实,Web应用程序的动态特性阻止了将所有数据模型预转换为字节流。 并且,现在没有严肃的架构,您将直接写入HTTP输出流。