介于大家目前有些人比较关心 lua table中pairs 和 ipairs的效率问题, 特此研究了一下... 如有不正 还需指出..

首先来看下 lua中table的结构定义:

table中分为2个存储空间, 一个是线性数组空间(TValue *array), 和一个hash空间(Node *node)

当我们使用 pairs 和 ipairs 会产生两种不同的迭代器, 一个仅仅遍历数组, 一个遍历所有的值

所以, 当调用ipairs的时候, 在线性数组中遇到第一个nil时便停止遍历, 不管后面还是否有值, 这点在遍历的时候要格外注意

而pairs的迭代器会调用lua_next, lua_next的实现:

这个函数会根据top信息调用luaH_next获取当前table中的下一组键值, 那么关键就在luaH_next中, 来看看这个函数的实现:

我们粗略的可以看到, 这个函数会先计算索引位置, 并根据该位置优先从线性数组中查找, 如果没有找到, 再从hash表中查找, 所以如果用pairs遍历array, 实则和ipairs等效, 并无差异.

所以, 由上面的分析, 如果我们明确table中的数据全部存放在线性数组中, 调用ipairs或者pairs均可, 并无太大差异(注意ipairs时中间不要出现nil值, 否则会导致遍历中断), 如果我们明确遍历hash表中的值, 则使用pairs, 其效率会较遍历array中的差

简单测试 遍历500 000 000个array or hash value的效率:

local array = {}
for i = 1, 500000000 dotable.insert(array, i)
endlocal startTime = os.time()
for i, v in pairs(array) doend
print(string.format("pairs time : %d", os.time() - startTime))startTime = os.time()
for i, v in ipairs(array) doend
print(string.format("ipairs time : %d", os.time() - startTime))

由于使用了os.time() , 只能获取到秒级时间, 故精确度不算太高...

转载自:https://blog.csdn.net/tony7758/article/details/6334001

Lua pairs与ipairs效率分析相关推荐

  1. lua pairs与ipairs区别

    目录 pairs与ipairs区别 pairs与ipairs区别 pairs是无序遍历,ipairs是有序遍历 pairs支持key,value格式,ipairs 只支持key为数字 local a= ...

  2. Lua——迭代器的使用、pairs 和 ipairs区别

    --迭代器是一种可以便利一种集合中所有元素得机制 --lua中,迭代器表示为函数,每调用一次函数,即返回集合中得下一个元素 --主要是根据闭合函数来实现得:闭合函数:一个函数加上该函数所需要访问得所有 ...

  3. Lua系列--pairs和ipairs

    Lua系列–pairs和ipairs Lua中Table的存储方式 在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的. Table的组成: 1.哈希表 用来存储Key- ...

  4. Lua中的pairs们(pairs,ipairs,gmatch)

    我们都知道 pairs在英语中有一对,一双的意思.在Lua中,仍然是这个意思,不过这儿的对是键值对,也就是key-value. 在Lua的文档中查询pairs,我们可以看到的有三个结果 pairs,i ...

  5. Lua⭐️迭代器pairs、ipairs ; 自定义迭代器

    迭代器pairs.ipairs array={"lua","c#","c"} --pairs可以遍历所有的键值对,即使其中key不连续 fo ...

  6. lua中, pairs和ipairs的区别

     函数pairs和ipairs都是实现遍历功能的函数,通常使用方法是和for函数共同使用构造for u,v in pairs/ipairs(t)实现遍历t表中的所有元素对.  区别在于,pairs可以 ...

  7. Lua中 pairs 和 ipairs 的区别

    Lua中 pairs 和 ipairs 的区别 在我看来,pairs就是粗略计算,ipairs就是仔细计算. pairs只关注存在还是不存在,而ipairs还要关注存在是否合理. pairs将存在的值 ...

  8. lua中 pairs 与 ipairs 区别

    pairs 与  ipairs 两者的区别如下: --数组这么定义,貌似没差别 t= {1,2,3,4,5}for k, v in ipairs(t) doprint(v) endprint(&quo ...

  9. pairs和ipairs的区别

    在lua中ipairs 和pairs均可以用来遍历集合,但是两者有区别: 同:都是能遍历集合(表.数组),两者均优先按顺序输出没有key的值: 异:对于有key的集合: ipairs从第一个数字key ...

最新文章

  1. (自兴人工智能)python字符串
  2. Apache Ignite与Apache Hive的个人理解与总结
  3. java16位字符串压缩成8位_在8位UART上发送16位值
  4. nexus 6p Android SDK,Flutter没有检测到Android SDK
  5. scrapyd部署_第八章 第一节 scrapyd和scrapy-client
  6. UI设计实用素材|寻找一种新的方法来设计网站,单页网站
  7. python @classmethod和@staticmethod的区别
  8. heroku_如何通过5个步骤在Heroku上部署机器学习UI
  9. css布局Absolute的垂直水平居中
  10. 计算机 高新 会计电算化,会计软件应用(用友软件系列)用友通T3试题汇编 , 会计电算化员级[电子资源]...
  11. webtrends之ODBC源数据获取(三)——webtrends工具篇
  12. Java 生成水印图片
  13. 图片公式转word公式
  14. 激活Windows Vista Home Basic Aero玻璃效果
  15. (八)RHEL系统之红帽8操作系统基础环境配置及软件安装
  16. Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
  17. JAVA LIST、ARRAY 移除其中某一元素
  18. Spring配置文件报错 :通配符的匹配很全面, 但无法找到元素 ‘context:property-placeholder‘ 的声明
  19. 游戏感:虚拟感觉的游戏设计师指南——第二章 游戏感与人类感知能力
  20. 使用 PetaLinux 自定义 ZynqMP 平台

热门文章

  1. HDU 5643 King's Game 【约瑟夫环】
  2. 闭关修炼——five——Spring
  3. Quectel EC600N-CN 中尺寸物联网首选LTE Cat 1模块[移远通信]
  4. 微信小程序-从零开始制作一个跑步微信小程序
  5. ipmitool sdr type Temperature sdr 从传感器获取某一类数据
  6. 互联网的那点事:商业模式、开放平台、开放开源标准
  7. Idea基本操作攻略
  8. 算法图解第一章算法简介之二分查找C++代码实现
  9. iPhone 6 被盗记录二【写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈】...
  10. JDK8-十大新特性-附demo