免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8587 | 回复: 24
打印 上一主题 下一主题

Never map as that~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-13 00:06 |只看该作者 |倒序浏览
Recently I saw a few guys writing their code with inefficient map.
I can't bear that and must point it out:

Never map in void context instead of a for loop.

When will map?
You should only use a map when you expect a list as the result returned from it.
Otherwise please use the regular for loop, which is faster and clearer.

# time perl -e 'open STDOUT,">/dev/null";map { print $_ } 1 .. 1000000'

real    0m1.204s
user    0m1.160s
sys     0m0.044s

# time perl -e 'open STDOUT,">/dev/null";print $_ for 1 .. 1000000'   

real    0m0.920s
user    0m0.916s
sys     0m0.004s


So, don't think everything is cool in Perl, stop such stupid behavior please.

--Xiaolan


I don't think that using map in void context instead of a for loop will lead to any speeed increase.
In earlier perls it will lead to a slowdown.

--Paul Johnson

[ 本帖最后由 兰花仙子 于 2009-12-13 11:00 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-13 00:19 |只看该作者
深夜的沙发 坐下来漫漫看

[ 本帖最后由 yz86yz 于 2009-12-13 00:55 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-12-13 00:39 |只看该作者
如果在 void context 下 for 更快的话,能想到的原因,就是在 list 下赋值时,map 做了更多的 list 的优化,因此在非list context下耗时了,那顺着思路,map 如果用于 list context,相比 for 应该会更快,仙子有实测结果吗,一起给一个吧,我 linux 刚退出来...
for 下赋值数组,方便的也就 push, unshift 了,map 更快的操作可能是什么呢?
刚好也想到最近一段 code 经常需要修改一个 array ref ,数组不大,但有比较多的 unshift, push 操作,因为是 array ref,我用的方法是 $refArray = [@{$refArray}, @addList] 这个有改进余地嘛?


====== 分隔线 ============
[flw]: perldoc -f splice
不好意思,引用点成编辑了。
=======================

[ 本帖最后由 flw 于 2009-12-13 11:32 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-12-13 09:33 |只看该作者
$refArray = [@{$refArray}, @addList]
这样复制来复制去的   应该比直接push慢吧??我猜~~~

论坛徽章:
0
5 [报告]
发表于 2009-12-13 11:17 |只看该作者

回复 #3 dugu072_cu 的帖子

# time perl -e '%hash = map { $_,1} 1 .. 1000000'

real    0m2.457s
user    0m2.264s
sys     0m0.192s

# time perl -e '$hash{$_}=1 for 1 .. 1000000'   

real    0m1.550s
user    0m1.508s
sys     0m0.040s

论坛徽章:
0
6 [报告]
发表于 2009-12-13 12:27 |只看该作者
map grep 和 foreach属于不同的编程风格 在适当的时候用他们代替foreach常常可以使程序变得更清晰简洁。 因为在正常情况下他们表达的意思更加单一, 比如map表达的就是2个集合之间的映射关系。
我想性能问题在这里并不重要, 至少在我遇到过的场景里这东西不会变成系统性能的瓶颈。

论坛徽章:
0
7 [报告]
发表于 2009-12-13 12:41 |只看该作者
请教一下··$refArray = [@{$refArray}, @addList] 这句是什么意思···

论坛徽章:
0
8 [报告]
发表于 2009-12-13 13:21 |只看该作者

回复 #6 DQP 的帖子

这与风格无关~而是滥用与非滥用的区别~~
as I have said, map只有在该操作期待返回一个list结果时,才是有效用法,例如这个帖子:
http://bbs2.chinaunix.net/viewthread.php?tid=706742

类似于 map { print $_ } @array的做法,没人说不可以这样,但毫无疑问这是低效而stupid的行为。

论坛徽章:
0
9 [报告]
发表于 2009-12-13 15:12 |只看该作者
虽说不怎么懂,还是学习了

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
10 [报告]
发表于 2009-12-13 16:15 |只看该作者
代表a few guys前来聆听仙子教诲
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP