今天读到http://blog.yufeng.info的[url=http://blog.yufeng.info/archives/336]gen_tcp:send的深度解刨和使用指南(初稿)[/url],看到下面这句:
[quote]
gent_tcp:send的时候数据的格式是iolist. 很多人会误会,特地把iolist特地变成list或者binary. 新生成的binary或者list在send之后要GC回收, 如果频繁的话,
系统的性能损失很大.
tcp驱动是支持scatter write的, 最终是调用writev系统调用的.所以我们要充分利用这一特性.
我们从上面的代码可以看出, io是按照这样的规则填充writev向量的: 如果iolist的元素是
1. int, 拷贝.
2. binary是heap binary, 拷贝
3. binary是proc binary而且大小<64字节拷贝.
同时tcp是流协议,我们在发送消息的时候, 通常需要在消息前面添加个头, 比如说4个字节的长度. 这个如果手工做的话, 效率非常低.
[/quote]
时,对iolist数据类型,不是很明白,然后自己在[url]http://www.cnblogs.com/me-sa/archive/2012/01/31/erlang0034.html[/url]和[url=http://mryufeng.iteye.com/blog/634867]list和iolist有什么区别[/url]找到了答案:
[quote]
1. []
2. binary
3. 列表, 每个元素是int(0-255)或者binary或者iolist.
其中binary是指 bitsize % 8 == 0 .
int 是0-255
[/quote]
[quote]
gent_tcp:send的时候数据的格式是iolist. 很多人会误会,特地把iolist特地变成list或者binary. 新生成的binary或者list在send之后要GC回收, 如果频繁的话,
系统的性能损失很大.
tcp驱动是支持scatter write的, 最终是调用writev系统调用的.所以我们要充分利用这一特性.
我们从上面的代码可以看出, io是按照这样的规则填充writev向量的: 如果iolist的元素是
1. int, 拷贝.
2. binary是heap binary, 拷贝
3. binary是proc binary而且大小<64字节拷贝.
同时tcp是流协议,我们在发送消息的时候, 通常需要在消息前面添加个头, 比如说4个字节的长度. 这个如果手工做的话, 效率非常低.
[/quote]
时,对iolist数据类型,不是很明白,然后自己在[url]http://www.cnblogs.com/me-sa/archive/2012/01/31/erlang0034.html[/url]和[url=http://mryufeng.iteye.com/blog/634867]list和iolist有什么区别[/url]找到了答案:
[quote]
1. []
2. binary
3. 列表, 每个元素是int(0-255)或者binary或者iolist.
其中binary是指 bitsize % 8 == 0 .
int 是0-255
[/quote]