`
mryufeng
  • 浏览: 968477 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iolist跟list有什么区别?

阅读更多
看到erlang-china.org上有个帖子在问这个问题
引用
一直不太明白iolist,跟list到底有什么区别?请各位大侠指教。。


我翻看了半天erlang的文档也没写的太明白,所以就看看源码:
erts/emulator/beam/utils.c

3015int io_list_len(Eterm obj)
3016{
3017    Eterm* objp;
3018    Sint len = 0;
3019    DECLARE_ESTACK(s);
3020    goto L_again;
3021
3022    while (!ESTACK_ISEMPTY(s)) {
3023        obj = ESTACK_POP(s);
3024    L_again:
3025        if (is_list(obj)) {
3026        L_iter_list:
3027            objp = list_val(obj);
3028            /* Head */
3029            obj = CAR(objp);
3030            if (is_byte(obj)) {
3031                len++;
3032            } else if (is_binary(obj) && binary_bitsize(obj) == 0) {
3033                len += binary_size(obj);
3034            } else if (is_list(obj)) {
3035                ESTACK_PUSH(s, CDR(objp));
3036                goto L_iter_list; /* on head */
3037            } else if (is_not_nil(obj)) {
3038                goto L_type_error;
3039            }
3040            /* Tail */
3041            obj = CDR(objp);
3042            if (is_list(obj))
3043                goto L_iter_list; /* on tail */
3044            else if (is_binary(obj) && binary_bitsize(obj) == 0) {
3045                len += binary_size(obj);
3046            } else if (is_not_nil(obj)) {
3047                goto L_type_error;
3048            }
3049        } else if (is_binary(obj) && binary_bitsize(obj) == 0) { /* Tail was binary */
3050            len += binary_size(obj);
3051        } else if (is_not_nil(obj)) {
3052            goto L_type_error;
3053        }
3054    }
3055
3056    DESTROY_ESTACK(s);
3057    return len;
3058
3059 L_type_error:
3060    DESTROY_ESTACK(s);
3061    return -1;
3062}


从源码可以看出来iolist是这样的定义的:
1. []
2. binary
3. 列表, 每个元素是int(0-255)或者binary或者iolist.
其中binary是指 bitsize % 8 == 0 .
int 是0-255


root@ubuntu:/usr/src/otp# erl
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5  (abort with ^G)
2> iolist_size(<<>>).
0
3> iolist_size(<<1:1>>).
** exception error: bad argument
in function  iolist_size/1
called as iolist_size(<<1:1>>)
4> iolist_size(<<1:8>>).
1
5> iolist_size([]).
0
6> iolist_size(<<1,2>>).
2
7> iolist_size([1,2]).
2
8> iolist_size([1,2, <<1,2>>]).
4
9> iolist_size([1,2, <<1,2>>, [2]]).
5
10> iolist_size([1,2, <<1,2>>, [2]]).
5
11> iolist_size([<<1:1>>]).
** exception error: bad argument
in function  iolist_size/1
called as iolist_size([<<1:1>>])
12>


Iolist的作用是用于往port送数据的时候.由于底层的系统调用如writev支持向量写, 就避免了无谓的iolist_to_binary这样的扁平话操作, 避免了内存拷贝,极大的提高了效率.
建议多用.
分享到:
评论

相关推荐

    nodejs.socketio很好的入门例子javascript脚本方式

    1.运行时候找不到 express 等,进入工程目录,npm install express,package.json就会加入库;...var iolist = []; //定义socket on connection( 连入) 事件行为 io.on('connection', function (socket) { .....

    axiom:Web应用程序的微型框架

    公理 Axiom是一个微框架,用于在Erlang中构建Web应用程序。 它的灵感来自 ,建在之上。 入门 构建Axiom的目的是使创建Web应用程序变得快速而轻松。 一个最小的应用程序将如下所示... 返回值可以是二进制字符串或iolist

    useragent:通过Erlang中的用户代理字符串识别浏览器和操作系统

    函数useragent:parse/1可以接受iolist或二进制UserAgent,并将返回所需的详细信息: 1&gt; useragent:parse("Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.8) PPC; 240x320; HTC_TyTN/1.0 Profile/...

    bunyan_core:Elixir的分布式记录器

    使用iolist构造消息 人性化的多行消息格式(包括error_logger和SASL) 支持按源和按作者配置,并能够登录到多个文件和设备 与logrotate一起使用(将其发送给SIGHUP ,它将关闭并重新打开日志文件)。 概括 摘要摘要...

    jiffy:适用于Erlang的JSON NIF

    唯一可能使您措手不及的是,即使jiffy:encode/1的返回类型在大多数情况下都返回二进制,它也是一个iolist。 关于unicode的快速说明。 Jiffy仅了解二进制格式的UTF-8。 故事结局。 错误作为错误异常引发。 Eshell V...

Global site tag (gtag.js) - Google Analytics