免费注册 查看新帖 |

Chinaunix

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

数组需求突变,求高手快速处理以下数组问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-09-08 17:44 |只看该作者
Interesting - it is the fastest way too. And if you pre allocate the array, it can even be a little bit faster.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;

  5. use Benchmark;

  6. our @x = ();

  7. for (1..1000000) {
  8.     push @x, int($_ * rand);
  9. }

  10. sub my_copy {
  11.     my @y = @x;
  12. }

  13. sub my_return {
  14.     \@x;
  15. }

  16. sub extract1 {
  17.     my @y = @x;
  18.     $#y   = 1000000;
  19.     @y = @y[@y*0.25 .. @y*0.75];
  20.     return \@y;
  21. }

  22. sub extract2 {
  23.     my @y = @x;
  24.     $#y  -= 250000;
  25.     @y    = reverse @y;
  26.     $#y  -= 250000;
  27.     @y    = reverse @y;
  28.     return \@y;
  29. }

  30. sub extract3 {
  31.     my @y = @x;
  32.     my $count = scalar @y;
  33.     my $start = int(0.25 * $count);
  34.     my $end   = int(0.75 * $count);
  35.     my $len   = $end - $start;
  36.     @y        = splice(@y, $start, $len);
  37.     return \@y;
  38. }

  39. sub extract4 {
  40.     my @y = @x;
  41.     $#y   = 500000;
  42.     my $count = scalar @y;
  43.     my $start = int(0.25 * $count);
  44.     my $end   = int(0.75 * $count);
  45.     my $len   = $end - $start;
  46.     @y        = splice(@y, $start, $len);
  47.     return \@y;
  48. }

  49. my $code = {
  50.     my_copy     => q| my_copy()   |,
  51.     extract1    => q| extract1()  |,
  52.     extract2    => q| extract2()  |,
  53.     extract3    => q| extract3()  |,
  54.     extract4    => q| extract4()  |,
  55. };

  56. timethese( 100, $code );


  57. #--- Result
  58. Benchmark: timing 100 iterations of extract1, extract2, extract3, extract4, my_copy...
  59.   extract1: 20 wallclock secs (17.63 usr +  0.87 sys = 18.50 CPU) @  5.41/s (n=100)
  60.   extract2: 26 wallclock secs (25.50 usr +  0.42 sys = 25.92 CPU) @  3.86/s (n=100)
  61.   extract3: 14 wallclock secs (13.74 usr +  0.32 sys = 14.06 CPU) @  7.11/s (n=100)
  62.   extract4: 12 wallclock secs (10.43 usr +  0.34 sys = 10.77 CPU) @  9.29/s (n=100)
  63.    my_copy:  7 wallclock secs ( 6.75 usr +  0.07 sys =  6.82 CPU) @ 14.66/s (n=100)

复制代码

论坛徽章:
0
12 [报告]
发表于 2011-09-08 17:56 |只看该作者
$#y   = 500000; is pre allocate the array size.
学习了。

论坛徽章:
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
13 [报告]
发表于 2011-09-08 18:05 |只看该作者
才10W条就求什么最优,明显过早优化了。这么简单的需求不行就上C几亿条也没问题

论坛徽章:
0
14 [报告]
发表于 2011-09-08 18:10 |只看该作者
just for fun and edification ...

论坛徽章:
0
15 [报告]
发表于 2011-09-08 18:14 |只看该作者
C语言的快速,是长期以来,C语言编译器不断优化的结果。
就算法来说,不同的语言,是相通的。
Go language 的执行效率在X86上,已经和C不相上下。
同样的C代码,在不同的处理器架构上编译的代码,执行效率也不同。

我们比较,是比自己的东西,不是别人给的东西。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP