搜索
查看: 505|回复: 7

迭代器效率问题

[复制链接]

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
发表于 2017-12-6 10:00:14 | 显示全部楼层 |阅读模式
由于功能需要,自己改了点东西,严重影响速度,特来请教一下,是不是我用法有误导致?
  1. lines = function(path){
  2.         var f = ..io.open(path,"r+b");
  3.         if(!f) error("打开文件失败",2);
  4.        
  5.         return function(){
  6.                 var s = f.read();
  7.                 return s;
  8.         },function() { f.close(); }
  9. }
复制代码

以上代码执行没有问题,迭代器增加一个返回值后速度就慢了N倍
  1. lines = function(path){
  2.         var f = ..io.open(path,"r+b");
  3.         if(!f) error("打开文件失败",2);
  4.        
  5.         return function(){
  6.                 var cur = f.seek();
  7.                 var s = f.read();
  8.                 return s,cur;
  9.         },function() { f.close(); }
  10. }
复制代码

增加一个返回值后就慢了N倍,找不到是什么原因
回复

使用道具 举报

13

主题

34

帖子

391

积分

二级会员

Rank: 3Rank: 3

积分
391
发表于 2017-12-6 10:08:55 | 显示全部楼层
  1.        
  2.         for line in io.lines( "") {
  3.        
  4.         }
复制代码


和这个有什么区别?
回复

使用道具 举报

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
 楼主| 发表于 2017-12-6 10:12:28 | 显示全部楼层
cnruby 发表于 2017-12-6 10:08
和这个有什么区别?

io.lines遇到\xA1会终止,为解决这个问题,修改了读取模式
这是区别

第二段是增加了一个返回值:偏移
回复

使用道具 举报

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
 楼主| 发表于 2017-12-6 11:04:51 | 显示全部楼层
用不上了,谢谢大家,f.seek()超过2147483647无法正常返回
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-12-6 19:12:21 | 显示全部楼层
幻月 发表于 2017-12-6 10:12
io.lines遇到\xA1会终止,为解决这个问题,修改了读取模式
这是区别

这是文档中的一个笔误,实际上是遇到0x1A( 不是0xA1)
0x1A是一个控制字符,不在文本字符编码的范围内,所以并不影响文本读取,
而分行读取 - 是纯文本才有的概念。

你希望用 io.lines ,又希望可以自己操作文件对象,
可以直接用 io.open打开一个文件流,作为 io.lines的参数。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2017-12-6 19:14:53 | 显示全部楼层
幻月 发表于 2017-12-6 11:04
用不上了,谢谢大家,f.seek()超过2147483647无法正常返回

f.seek()改成使用64位数了,这下总够你用了。下次注意发到BUG反馈里。
回复

使用道具 举报

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
 楼主| 发表于 2017-12-7 08:14:24 | 显示全部楼层
你希望用 io.lines ,又希望可以自己操作文件对象,
可以直接用 io.open打开一个文件流,作为 io.lines的参数。

学习了
回复

使用道具 举报

3

主题

51

帖子

312

积分

二级会员

Rank: 3Rank: 3

积分
312
 楼主| 发表于 2017-12-7 08:15:23 | 显示全部楼层
Jacen.He 发表于 2017-12-6 19:14
f.seek()改成使用64位数了,这下总够你用了。下次注意发到BUG反馈里。

谢谢Jacen~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-20 03:23 , Processed in 0.093750 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表