免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: 3P用户
打印 上一主题 下一主题

子程序shift取参数,是否会增加CPU时钟周期? [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
21 [报告]
发表于 2011-06-22 16:03 |只看该作者
但楼主问的是子程序取参数,所以起码得搞个 sub 糊弄糊弄吧。
flw 发表于 2011-06-22 15:52



    最终比较的不还是 shift 和索引的差别。用函数包起来会夹杂大量的多余指令,差异会被摊薄

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
22 [报告]
发表于 2011-06-22 16:07 |只看该作者
我又测试了两次,都是 shift 更快,所以,到底哪个快这个好像也不太好说。
一次代码如下:

  1. #!/usr/bin/env perl

  2. use 5.12.0;
  3. use Benchmark qw(timethese);

  4. sub sum_a {
  5.     my $a = shift;
  6.     my $b = shift;
  7.     return $a + $b;
  8. }

  9. sub sum_b {
  10.     my $a = $_[0];
  11.     my $b = $_[1];
  12.     return $a + $b;
  13. }

  14. timethese(90000000, {
  15.         shift => sub {
  16.             sum_a(3, 5)
  17.         },
  18.         index => sub {
  19.             sum_b(3, 5)
  20.         }
  21.     });

  22. # vim: sw=4 ts=4 ft=perl expandtab
复制代码
输出:

  1. $ perl test.pl
  2. Benchmark: timing 90000000 iterations of index, shift...
  3.      index: 46 wallclock secs (45.23 usr +  0.02 sys = 45.25 CPU) @ 1988950.28/s (n=90000000)
  4.      shift: 43 wallclock secs (42.33 usr +  0.03 sys = 42.36 CPU) @ 2124645.89/s (n=90000000)
复制代码
另一次从 flw 版主那儿偷学来一个参数(-1):

  1. #!/usr/bin/env perl

  2. use 5.12.0;
  3. use Benchmark qw(cmpthese);

  4. sub sum_a {
  5.     my $a = shift;
  6.     my $b = shift;
  7.     return $a + $b;
  8. }

  9. sub sum_b {
  10.     my $a = $_[0];
  11.     my $b = $_[1];
  12.     return $a + $b;
  13. }

  14. cmpthese(-1, {
  15.         shift => sub {
  16.             sum_a(3, 5)
  17.         },
  18.         index => sub {
  19.             sum_b(3, 5)
  20.         }
  21.     });

  22. # vim: sw=4 ts=4 ft=perl expandtab
复制代码
输出:
  1. $ perl test2.pl
  2.            Rate index shift
  3. index 1872457/s    --   -6%
  4. shift 1989485/s    6%    --
复制代码
这次我没有写错什么吧。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2011-06-22 16:07 |只看该作者
最终比较的不还是 shift 和索引的差别。用函数包起来会夹杂大量的多余指令,差异会被摊薄
zhlong8 发表于 2011-06-22 16:03



    那可不好说。万一在取参数这块有什么优化,那就完全不是同一个问题了。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
24 [报告]
发表于 2011-06-22 16:08 |只看该作者
最终比较的不还是 shift 和索引的差别。用函数包起来会夹杂大量的多余指令,差异会被摊薄
zhlong8 发表于 2011-06-22 16:03


这个我可以肯定是不一样的。Perl 5.14 的 perldelta 里明确说了在函数调用里 shift 比 shift @_ 要快。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
25 [报告]
发表于 2011-06-22 16:14 |只看该作者
本帖最后由 zhlong8 于 2011-06-22 16:15 编辑

好吧你们赢了

想起之前看精通正则表达式学了一堆优化技巧,结果 Perl 全都已经优化了,一点成就感都没有。那咱就具体情况具体分析吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
26 [报告]
发表于 2011-06-22 16:16 |只看该作者
好吧你们赢了

想起之前看精通正则表达式学了一堆优化技巧,结果 Perl 全都已经优化了,一点成就感 ...
zhlong8 发表于 2011-06-22 16:14



    所以只有逻辑才是可靠的啊。乌鸦是黑的并不能证明北极熊是白的呀。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
27 [报告]
发表于 2011-06-22 16:32 |只看该作者
我自己检讨一下,我测试的是 shift 比 index 快,数据在前面的回复里已经给出了。我要检讨的是我在一个15楼里说 index 比 shift 快是因为我是在函数的第一句直接修改了 @_ 的值。
这大概说明了 shift 只在参数传递时可能会比 index 快,但是在一般情况下应该是 index 更快。因此也会有参数传递的优化不足以超过 index 的效率的情况,就像 flw 版主说过的测试结果。
我之前使用的测试环境都是 Linux x64, Perl 5.14.1。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
28 [报告]
发表于 2011-06-22 16:33 |只看该作者
才传这么几个参数根本不可能成为瓶颈,楼主如果真对速度有着无尽的渴望那就把函数都 inline 了吧,提升绝对是这里的百倍

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2011-06-22 16:43 |只看该作者
可惜 Perl 没有 inline,很多时候我确实挺喜欢 inline 的。
尤其是做一些统计类的程序时,函数可以让代码结构更清晰,
但是函数体本身又很轻,函数调用的开销比重就很大。所以很矛盾。

论坛徽章:
3
15-16赛季CBA联赛之同曦
日期:2016-04-02 22:00:3915-16赛季CBA联赛之江苏
日期:2016-04-07 12:09:0015-16赛季CBA联赛之天津
日期:2016-05-04 01:20:19
30 [报告]
发表于 2011-06-23 02:37 |只看该作者
谢谢,谢谢大家!
这么一个突发奇想的问题,引得大家这么热心,尽管是夏天,但还是让人感觉到温暖。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP