免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2011-06-22 13:32 |只看该作者
楼主这是丢了西瓜捡芝麻啊。
同意仙子的说法。

论坛徽章:
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
12 [报告]
发表于 2011-06-22 14:38 |只看该作者
本帖最后由 Monox 于 2011-06-22 14:39 编辑
shift是会慢一点。
兰花仙子 发表于 2011-06-21 16:38


shift 应该会快一点。不知是小骆驼书还是其它什么书上说过,在 C 语言里使用下标索引是很快的,但是在 Perl 里面显示的下标索引会降低速度,使用 shift, unshift 等会更快点。因为 Perl 对 AV 做过优化,让 AV 的常用操作比在 Perl 里直接使用下标索引更快。
于是我做了以下测试:

  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(90000000, {
  15.         shift => &sum_a,
  16.         index => &sum_b
  17.     });

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

  1. $ perl test.pl
  2.              Rate index shift
  3. index 140625000/s    --   -3%
  4. shift 145161290/s    3%    --
复制代码
也就是说同时运行 90000000 次的话,使用 shift 比使用 index 要快 3%,不过,正如大家说的,这点差异是几乎可以忽略的。把 90000000 改成 10000000 以下的数的结果类似如下:
  1. $ perl test.pl
  2.             (warning: too few iterations for a reliable count)
  3.             (warning: too few iterations for a reliable count)
  4.              Rate shift index
  5. shift 100000000/s    --  -20%
  6. index 125000000/s   25%    --
复制代码

论坛徽章:
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
13 [报告]
发表于 2011-06-22 14:43 |只看该作者
回复 12# Monox
把 cmpthese 改成 timethese 的结果:

  1.     $ perl test.pl
  2. Benchmark: timing 90000000 iterations of index, shift...
  3.      index:  1 wallclock secs ( 0.73 usr +  0.01 sys =  0.74 CPU) @ 121621621.62/s (n=90000000)
  4.      shift:  1 wallclock secs ( 0.28 usr + -0.02 sys =  0.26 CPU) @ 346153846.15/s (n=90000000)
  5.             (warning: too few iterations for a reliable count)
复制代码
注意最后说 90000000 还是不够喔,我就不继续上调这个次数了。

论坛徽章:
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
14 [报告]
发表于 2011-06-22 14:53 |只看该作者
回复  Monox
把 cmpthese 改成 timethese 的结果:注意最后说 90000000 还是不够喔,我就不继续上调这个次 ...
Monox 发表于 2011-06-22 14:43



    你根本没有传入参数比较个什么? shift 可以直接检测出来 @_ 为空。
  1. use Benchmark;

  2. my @a = (1..1000000);
  3. my @b = (1..1000000);

  4. timethese 1, {
  5.     shift => sub {
  6.         my $b;
  7.         for (1 .. @a) {
  8.             $b = shift @a;
  9.         }
  10.     },
  11.     ref => sub {
  12.         my $b;
  13.         for (1 .. @b) {
  14.             $b = $b[$_];
  15.         }
  16.     }
  17. }
复制代码

论坛徽章:
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
15 [报告]
发表于 2011-06-22 14:58 |只看该作者
回复 14# zhlong8
喔,一不小心忘了传参数了,我修改了一下代码,好像 index 比 shift 还是快点

  1. $ perl test.pl
  2. Benchmark: timing 90000000 iterations of index, shift...
  3.      index:  1 wallclock secs ( 0.71 usr + -0.01 sys =  0.70 CPU) @ 128571428.57/s (n=90000000)
  4.      shift:  0 wallclock secs ( 0.74 usr +  0.00 sys =  0.74 CPU) @ 121621621.62/s (n=90000000)
复制代码
不好意思刚才搞错了。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
16 [报告]
发表于 2011-06-22 15:25 |只看该作者
看半天,看不出所以然....

没有说参数只能shift或$_[n]
foreach(@_)直接用不就好了....

11楼的"丢了西瓜捡芝麻啊"....妙哉妙哉

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2011-06-22 15:35 |只看该作者
你根本没有传入参数比较个什么? shift 可以直接检测出来 @_ 为空。
zhlong8 发表于 2011-06-22 14:53



    你这个测试很怪异,感觉不足信的样子。

论坛徽章:
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
18 [报告]
发表于 2011-06-22 15:43 |只看该作者
你这个测试很怪异,感觉不足信的样子。
flw 发表于 2011-06-22 15:35



    只想比较 shift 和索引两种方法的速度,可是 shift 会改变数组一时想不出来好办法了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2011-06-22 15:50 |只看该作者
我这里测试的结果是 index 快,5.8.5 下快 12%,5.14 下快 9%
  1. #!/usr/bin/perl

  2. use Benchmark qw(:all);

  3. sub test_shift {
  4.     my $left  = shift;
  5.     my $right = shift;

  6.     return $left + $right;
  7. }

  8. sub test_index {
  9.     my $left  = $_[0];
  10.     my $right = $_[1];

  11.     return $left + $right;
  12. }

  13. cmpthese( -1, {
  14.     shift => sub {
  15.         test_shift( 1, 2 );
  16.     },
  17.     index => sub {
  18.         test_index( 1, 2 );
  19.     }
  20. } );
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2011-06-22 15:52 |只看该作者
只想比较 shift 和索引两种方法的速度,可是 shift 会改变数组一时想不出来好办法了
zhlong8 发表于 2011-06-22 15:43



    但楼主问的是子程序取参数,所以起码得搞个 sub 糊弄糊弄吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP