iolist类型

本文深入解析了Erlang中gen_tcp:send函数中iolist数据类型的使用,解释了它与list、binary的区别,并强调了利用tcp驱动的scatterwrite特性的重要性,以优化性能和提高消息发送效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天读到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]
package com.priusis.report.controller; import com.priusis.api.domain.monitor.TrainIo; import com.priusis.api.domain.monitor.TrainIu; import com.priusis.api.domain.monitor.TrainNet; import com.priusis.core.common.lib.Result; import com.priusis.report.service.IDoorStatusService; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.validation.constraints.NotNull; import java.util.Date; import java.util.List; import java.util.Map; /** * @author yangli * @since 2021/07/01 */ @Validated @RestController @RequestMapping(value = "door_status") public class DoorStatusController { @Resource private IDoorStatusService doorStatusService; // @GetMapping(value = "io/list") public Result<List<TrainIo>> ioList( @RequestParam @NotNull Integer trainNo, @RequestParam @NotNull Integer carriageNo, @RequestParam @NotNull Integer doorNo, @RequestParam(value = "hour") @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") Date minute) { return Result.success(doorStatusService.ioList(trainNo, carriageNo, doorNo, minute)); } @GetMapping(value = "net/list") public Result<List<TrainNet>> netList( @RequestParam @NotNull Integer trainNo, @RequestParam @NotNull Integer carriageNo, @RequestParam @NotNull Integer doorNo, @RequestParam(value = "hour") @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") Date minute) { return Result.success(doorStatusService.netList(trainNo, carriageNo, doorNo, minute)); } 帮我解释一下
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值