我一直在进行一些性能分析和基准测试,以优化向临时文件的写操作,bytes.Buffer
以捕获来自的任何错误template.ExecuteTemplate
。
具体来说,我们正在写入缓冲区,检查是否有错误,如果没有,则写出到http.ResponseWriter
。但是,问题在于临时缓冲区的请求开销有些明显:
当然,21k req / s仍然是很多请求,但是性能为22%。打击也是一个相当大的影响。
func renderTemplate(w http.ResponseWriter, name string, data map[string]interface{}) error {
// Ensure the template exists in the map.
tmpl, ok := templates[name]
if !ok {
return ErrTemplateDoesNotExist
}
// Create a buffer to temporarily write to and check if any errors were encountered.
buf := bytes.NewBuffer(make([]byte, 0, 10000))
err := tmpl.ExecuteTemplate(buf, "base", data)
if err != nil {
return err
}
// Set the header and write the buffer to the http.ResponseWriter
w.Header().Set("Content-Type", "text/html; charset=utf-8")
buf.WriteTo(w)
return nil
}
10K缓冲区大小是我 大多数 响应的典型最大页面大小的粗略估计,尽管我尚未在少数页面上进行测试。大于缓冲区大小的响应通常会导致性能降低20%。
是否有更好的方法在 每个
请求中写入临时缓冲区?
另一位地鼠指出了即将推出的sync.Pool在Go
1.3中,但是我不确定从哪里开始写。
新增
:目前使用http://godoc.org/github.com/oxtoacart/bpool可以以每个请求36ms的速度产生33k
req / s:
var bufpool *bpool.BufferPool
func renderTemplate(w http.ResponseWriter, name string, data map[string]interface{}) error {
...
buf := bufpool.Get()
err := tmpl.ExecuteTemplate(buf, "base", data)
if err != nil {
return err
}
// Set the header and write the buffer to the http.ResponseWriter
w.Header().Set("Content-Type", "text/html; charset=utf-8")
buf.WriteTo(w)
bufpool.Put(buf)
return nil
}
func init() {
bufpool = bpool.NewBufferPool(48)
}
[从评论中复制作为答案]
只需使用不是来自标准库的可用池来缓冲缓冲区。这看起来很有效(可以在godoc上搜索一些其他方法):
http://godoc.org/github.com/oxtoacart/bpool
无论大小如何,您可能还应该看到通过减少垃圾收集器压力而增加了吞吐量。
我有一个输入流,我想将其写入HttpServletResponse。有一种方法,由于使用字节[],需要花费的时间太长 我想知道在速度和效率方面,什么可能是最好的方法。
我正在使用一个nodejs应用程序。我已经开发了一个工作良好的虚拟API。这是我在命中get请求endpoint后收到的响应。 我的主要目标是能够将此响应保存到本地文件中。然而,我的代码返回的东西与我预期的相去甚远。它返回了大量的“代码”,但摘录如下: 另一方面,我的代码看起来是这样的: 你能发现我的错误吗?或者有别的办法吗?请分享。谢谢
我正在调用一个客户端的下载服务,该服务发送回MIME数据,并试图保存一个zip文件。 该服务不仅返回文件本身,还返回其他几个MIME字段。所以当我使用entity.getContent()打开输入流时,我最终会将所有这些数据写入我的zip文件,而我只希望写入一部分“有效载荷”。我已经搜索过了,无论如何都看不到,只从内容中获得一个单独的部分。 代码如下: 生成的文件的内容如下所示。请注意,我只希望将
我正在创建临时文件(outputFile)并使用BufferedWriter编写文本。我没有例外。但是字符串没有附加。我也使用sysout来输出文件,但它什么也不打印。 请帮忙 提前感谢
我使用WireMock来存根来自远程服务器的响应。在文件夹中,我有许多为存根设置规则的文件。这里的例子: { 如您所见,当我收到请求时,会从文件
问题内容: 我使用的是node-http-proxy,想要监视特定的响应标头,并在必要时重写它。这里有人建议这样做吗? 我的代理服务器位于几个不同的节点服务器以及一个Java WebApp的前面。Java应用程序正在设置Cookie,但是该Cookie的路径相对于Web应用程序的上下文。我需要cookie是安全的,并且有一个无需修改Java应用程序即可到达root的路径。 换句话说,将返回以下标头