Update 2012-12-11: 之前引入的 bug 修复了,新的二进制文件已经上传。处理 chunked encoding 的代码在抽取重复代码时漏掉了最后的 CRLF,原来的代码稍微有点 tricky,把自己给坑了……
Update 2012-12-10: 发布之后发现引入了一个新的 bug,会导致有些网站访问不正常。所以把下载页面的二进制文件删除了,等 bug 修完再重新上传。
新功能:加入 shadowsocks 支持,允许指定 ssh server 端口。
除臭虫:修正了一个 crash bug,还有一个 http chunked encoding 处理的 bug。
推荐更新。
Update on 2013-01-01: 其实 ReadFrom
只对某个 fd 是普通文件的时候会使用 sendfile
系统调用。否则会 fallback 到普通的先读到 buffer,再写的方式。ReadFrom
在实现的时候发现无法使用 sendfile
时会把 witer 包在一个仅暴露 io.Writer
接口的 struct 中再调用 io.Copy
。
还有一点性能的优化。对所有的 net.Conn
接口,不再使用 bufio.Writer
来缓冲写操作。Go 的 net.TCPConn
实现了 ReadFrom
函数,io.CopyN
函数发现写端实现了这个函数时会调用该函数,因此可以避免从 bufio.Reader
中读出再写到 bufio.Writer
这样没必要的拷贝。虽然会多一些写操作,但理论上来说减少不必要的拷贝应该可以减小加载网页时的延迟。不过不熟悉网络性能测试工具,没有实际测试过。(其实用 ab 测试过 cow,结果 ab 说数据标准差过大,结果很可能不可靠。)
昨天才发现 go 原来有 ssh 的实现,在考虑要不要用这个来创建 socks 连接。好处是不需要系统安装有 ssh (windows 上使用会方便很多),可以不用另外开一个 ssh 进程,避免网络数据在两个进程间传递的开销。不过不清楚这个 ssh 实现的成熟度,得先看下才能决定。