Архив эхоконференции RU.PERL сообщение #3562

- RU.PERL ----------------------------------------------------------- RU.PERL -
 Msg  : #3561 [639]
 От   : Yuriy Kaminskiy               2:5020/517.21       15 мая 04, 05:03
 Кому : Serge Chervjakov                                  16 мая 04, 20:25
 Тема : Re: Проверка на вхождение в массив
-------------------------------------------------------------------------------
@RFC-NNTP-Posting-Date: 15 May 2004 01:03:34 GMT
 Hello, Serge!
>>>>> On 19:21 14/5/2004, Serge Chervjakov wrote to Pavel Reich:
 MP>>> my %hash = map {$_ => 1} @_;
 PR>> map работает дольше for, это заранее известно.
 SC>  Есть такая хорошая штука - perldoc Benchmark
 SC> называется. Рекомендую всегда обращаться к ней, делая подобные
 SC> заявления, что что-то работает быстрее чего-то. Код тестов
 SC> достаточно большой вышел,
 ... а у меня - достаточно маленький...
 SC> потому сюда
 ... я его кидаю:
 $ perl5.6.0 -MBenchmark=cmpthese -e '
 my @list=map {int rand(100)} 1..1024;
 cmpthese(-1, {
       Map  =>sub { my %hash = map { $_ => 1 } @list; \%hash },
       For  =>sub { my %hash; for(@list) { $hash{$_} = 1 } \%hash },
       ForMy=>sub { my %hash; for my $x(@list) { $hash{$x} = 1 } \%hash },
       Slice=>sub { my %hash; @hash{@list}=(); \%hash }});'
        Rate   Map   For ForMy Slice
Map    146/s    --  -83%  -84%  -96%
For    873/s  496%    --   -5%  -76%
ForMy  923/s  530%    6%    --  -75%
Slice 3692/s 2420%  323%  300%    --
 Аналогично для 5.8.1:
        Rate   Map ForMy   For Slice
Map    435/s    --  -60%  -61%  -85%
ForMy 1090/s  150%    --   -3%  -62%
For   1120/s  157%    3%    --  -61%
Slice 2901/s  566%  166%  159%    --
 Аналогично для 5.00404:
        Rate   Map   For ForMy Slice
Map    158/s    --  -88%  -88%  -96%
For   1309/s  731%    --   -0%  -68%
ForMy 1309/s  731%    0%    --  -68%
Slice 4148/s 2533%  217%  217%    --
 Как видно - самый быстрый метод - @hash{@slice}. Оно, конечно, в
теории не эквивалентно (вместо 1 оно присваивает undef), но в данном
случае - результат будет тот же самый (потому как мы используем
exists, а не значение), только гораздо быстрее, короче, и красивее :-)
 SC> кидать не буду, но у меня получилось что map отработал в примерно
 SC> 6 раз быстрее.
 Ты где-то здорово ошибся в своём "большущем тесте". Проще надо быть,
проще :-)
 SC>  Попробуй у себя проделать то же самое. Полезно:).
-- 
Yuriy Kaminskiy.
E-mail (rot13): lhevl.z.xnzvafxvl@zgh-arg.eh
PS Стоит отметить, что сравнивать тут разные версии перла нельзя,
поскольку оно собрано с разными опциями:
5.00404 - libperl.a = -fno-PIC, single-thrd, single-obj, egcs-1.0.3, glibc2.0.7
  5.6.0 - libperl.so = -fPIC,   single-thrd, single-obj, egcs-1.0.3, glibc2.0.7
  5.8.1 - libperl.so = -fPIC,   multi-thrd,  multi-obj,   gcc-3.3.2, glibc2.3.2
 [JFYI: одно только -fPIC даёт снижение скорости до ~30%]
PS Почему map такой тормоз? Hу, это же очевидно, Ватсон: он создаёт
временный список длины 2*n, а for - не создаёт ни одного временного
объекта. Почему @hash{@slice} такой быстрый? Hу, это же очевидно,
Ватсон: всё укладывается в одну элементарную операцию, а остальные разводят
канитель с циклами, передачей управления и иже с ним на каждый элемент
массива.
   BTW, perl -MO=Concise или perl -MO=Terse в руки - и вперёд на танки :-)
PPS
   Возвращаясь к нашим баранам: проверка на вхождение в массив (perl-5.8.1):
   @arr = map {int rand(10)} 102
          Rate   hash ykhash    arr
hash    3623/s     --   -67%   -77%
ykhash 11095/s   206%     --   -28%
arr    15459/s   327%    39%     --
   @arr = map {int rand(100)} 1024
         Rate   hash    arr ykhash
hash    425/s     --   -74%   -85%
arr    1643/s   287%     --   -41%
ykhash 2765/s   551%    68%     --
   @arr = map {int rand(1000)} 1024;
         Rate   hash ykhash    arr
hash    327/s     --   -68%   -80%
ykhash 1013/s   210%     --   -37%
arr    1614/s   394%    59%     --
   Оттаквот. Hесмотря на изначальную бредовость - создавать хеш для
единственной проверки глупо - при грамотном кодировании результат
получается вполне на уровне (и иногда - даже быстрее ).
   А map - тоРМоз-ТормоЗ-ТОРМОЗ! 
--- Gnus/5.1002 (Gnus v5.10.2) XEmacs/21.5 (chayote, linux)
 * Origin: Code is language! http://www.anti-dmca.org (2:5020/517.21@fidonet)


[← назад]
Другие эхоконференции сети Фидо[вперёд →]
[-10]
[-100]
[-500]
[-1000]
[3500] [3501] [3502] [3503] [3504] [3505] [3506] [3507] [3508] [3509] [3510] [3511] [3512] [3513] [3514] [3515] [3516] [3517] [3518] [3519] [3520] [3521] [3522] [3523] [3524] [3525] [3526] [3527] [3528] [3529] [3530] [3531] [3532] [3533] [3534] [3535] [3536] [3537] [3538] [3539] [3540] [3541] [3542] [3543] [3544] [3545] [3546] [3547] [3548] [3549] [3550] [3551] [3552] [3553] [3554] [3555] [3556] [3557] [3558] [3559] [3560] [3561] [3562] [3563] [3564] [3565] [3566] [3567] [3568] [3569] [3570] [3571] [3572] [3573] [3574] [3575] [3576] [3577] [3578] [3579] [3580] [3581] [3582] [3583] [3584] [3585] [3586] [3587] [3588] [3589] [3590] [3591] [3592] [3593] [3594] [3595] [3596] [3597] [3598] [3599] [3600] [3601] [3602] [3603] [3604] [3605] [3606] [3607] [3608] [3609] [3610] [3611] [3612] [3613] [3614] [3615] [3616] [3617] [3618] [3619] [3620] [3621] [3622] [3623] [3624] [3625] [3626] [3627] [3628] [3629] [3630] [3631] [3632] [3633] [3634] [3635] [3636] [3637] [3638] [3639] [3640] [3641] [3642] [3643] [3644] [3645] [3646] [3647] [3648] [3649] [3650] [3651] [3652] [3653] [3654] [3655] [3656] [3657] [3658] [3659] [3660] [3661] [3662] [3663] [3664] [3665] [3666] [3667] [3668] [3669] [3670] [3671] [3672] [3673] [3674] [3675] [3676] [3677] [3678] [3679] [3680] [3681] [3682] [3683] [3684] [3685] [3686] [3687] [3688] [3689] [3690] [3691] [3692] [3693] [3694] [3695] [3696] [3697] [3698] [3699] [3700] [3701] [3702] [3703] [3704] [3705] [3706] [3707] [3708] [3709] [3710] [3711] [3712] [3713] [3714] [3715] [3716] [3717] [3718] [3719] [3720] [3721] [3722] [3723] [3724] [3725] [3726] [3727] [3728] [3729] [3730] [3731] [3732] [3733] [3734] [3735] [3736] [3737] [3738] [3739] [3740] [3741] [3742] [3743] [3744] [3745] [3746] [3747] [3748] [3749] [3750] [3751] [3752] [3753] [3754] [3755] [3756] [3757] [3758] [3759] [3760] [3761] [3762] [3763] [3764] [3765] [3766] [3767] [3768] [3769] [3770] [3771] [3772] [3773] [3774] [3775] [3776] [3777] [3778] [3779] [3780] [3781] [3782] [3783] [3784] [3785] [3786] [3787] [3788] [3789] [3790] [3791] [3792] [3793] [3794] [3795] [3796] [3797] [3798] [3799] [3800] [3801] [3802] [3803] [3804] [3805] [3806] [3807] [3808] [3809] [3810] [3811] [3812] [3813] [3814] [3815] [3816] [3817] [3818] [3819] [3820] [3821] [3822] [3823] [3824] [3825] [3826] [3827] [3828] [3829] [3830] [3831] [3832] [3833] [3834] [3835] [3836] [3837] [3838] [3839] [3840] [3841] [3842] [3843] [3844] [3845] [3846] [3847] [3848] [3849] [3850] [3851] [3852] [3853] [3854] [3855] [3856] [3857] [3858] [3859] [3860] [3861] [3862] [3863] [3864] [3865] [3866] [3867] [3868] [3869] [3870] [3871] [3872] [3873] [3874] [3875] [3876] [3877] [3878] [3879] [3880] [3881] [3882] [3883] [3884] [3885] [3886] [3887] [3888] [3889] [3890] [3891] [3892] [3893] [3894] [3895] [3896] [3897] [3898] [3899] [3900] [3901] [3902] [3903] [3904] [3905] [3906] [3907] [3908] [3909] [3910] [3911] [3912] [3913] [3914] [3915] [3916] [3917] [3918] [3919] [3920] [3921] [3922] [3923] [3924] [3925] [3926] [3927] [3928] [3929] [3930] [3931] [3932] [3933] [3934] [3935] [3936] [3937] [3938] [3939] [3940] [3941] [3942] [3943] [3944] [3945] [3946] [3947] [3948] [3949] [3950] [3951] [3952] [3953] [3954] [3955] [3956] [3957] [3958] [3959] [3960] [3961] [3962] [3963] [3964] [3965] [3966] [3967] [3968] [3969] [3970] [3971] [3972] [3973] [3974] [3975] [3976] [3977] [3978] [3979] [3980] [3981] [3982] [3983] [3984] [3985] [3986] [3987] [3988] [3989] [3990] [3991] [3992] [3993] [3994] [3995] [3996] [3997] [3998] [3999] [4000] [+10]
[+100]
[+500]
[+1000]

Канарские острова  free hosted forums  форум вебмастеров  бесплатный хостинг