作者wwwc (secret)
看板Ruby
标题Re: [问题] 传输时间非线性
时间Sat Jun 21 13:08:37 2008
※ 引述《yzugsr (Bird)》之铭言:
: ※ 引述《wwwc (secret)》之铭言:
: : tmp = alice.gets
: 我不是很确定
: 但我看Ruby source code中gets的实作 (在io.c)
: 他应该是每次最多读8192 bytes
: 然後附加到之前的字串上
: 所以一次读1M左右 可能会造成不断的allocate memory & copy data
: 而且看到这行
: rb_str_resize(str, last + len);
: 似乎每次读取 只会allocate刚刚好的memory
: 所以看样子 当资料足够大的时候
: 这个演算法会有O(N^2)的time complexity
: ==
: 其实手边没有灌ruby的环境
: 以上纯属嘴炮 XD
: gets看起来是用在读取一般文字输入
: 资料量大的时候最好不要用gets
: 试试用别的function还会不会这样
: P.S. write我有稍微看一下 应该是O(N)没问题
string_length time(seconds)
10000000 9.915431
20000000 42.183346
30000000 97.629504
40000000 164.325812
50000000 213.681785
60000000 395.54032
70000000 468.580234
80000000
90000000
100000000
以上是把gets改成read後的结果
不但非线性关系
而且花的时间远超过gets !?
(空白的部分还没跑完)
很纳闷...
会不会是ruby版本的问题?(两台电脑的版本不同)
我把code交换放在不同的机器上後
似乎就是线性关系
而且时间大幅减少
gets跟read也没有什麽差异了!?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.16.218
1F:→ godfat:那可能是某台的 ruby 坏了?对了,引言尽量不要放在最後面 06/21 14:41
2F:推 godfat:比较不方便阅读 06/21 14:42
已修改!
※ 编辑: wwwc 来自: 140.109.16.218 (06/21 15:01)
3F:推 godfat:啊,感谢你 @_@b 06/21 15:19
4F:→ wwwc:但如果把string length再加大十倍 无论用gets或read 06/21 18:54
5F:→ wwwc:结果都不是线性 所以资料长度超过一定值就会失去线性关系吗? 06/21 18:55
6F:→ godfat:我又试了一下,好像跨到某个临界值时间就会怪掉 06/21 19:10
7F:→ godfat:我在时间开始暴走的长度,大约是256MB, 跟记忆体配置有关吧 06/21 19:12
8F:→ godfat:要那麽巨大的资料量又要保持线性关系,应该不能这样做 06/21 19:14
9F:→ wwwc:感谢解答! 06/21 20:00