1. Perl / Говнокод #13127

    −172

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    sub company_stuff_add_array_elems
    {
            my $list = shift;
    
            my $count = 0;
    
            foreach ( @$list )
            {
                    $count += $_;
            }
    
            return $count;
    }

    List::Util::sum
    http://perldoc.perl.org/List/Util.html

    Запостил: kainwinterheart, 07 Июня 2013

    Комментарии (20) RSS

    • $@list
      Ответить
    • >@$list
      Но зачем?
      Ответить
    • в List::Util::sum массив передается на стэке параметров. что есть слегка медленне чем передача массива по ссылке.

      но все равно, код скорее всего говно.
      Ответить
      • Разыменование ссылок в перле довольно дорогое. Иногда быстрее выходит, если передавать обычный список.
        Ответить
        • это объяснит многое.

          но тем не менее, передача по стеку всего списка отностительно дорогая операция.

          я когда то находил на перле писаный merge sort использующий ссылки на массив + индексы. чисто для сравнения сделал тривиальный merge sort. тривиальная реализация была всего лишь где-то на 10% медленее.
          Ответить
        • vanished
          Ответить
      • vanished
        Ответить
    • Код нормальный и читабельный. Кто не понимает почему используется ссылка на массив, то рекомендую поиграться с закидыванием массивов в несколько сотен метров. Невозрващаемая память в систему в перле это одно из самых неприятных черт.

      Не, я не стану спорить, что память дешевая, что у вас не крутится никаких других жрущих память процессов и из ваших 8гб у вас всегда "свободны" все 7гб и удвоенное потребление памяти из-за того что вы тупо копируете массивы для вас ничего не значит. А потеря производительности на разыменовывания в обмен на двойное потребление озу (да на нее надо тоже потратить время на malloc/realloc) смотрится куда более предпочтительной.
      Ответить
      • И совершенно не имеет значения, например, вот это:
        azazel:list-util-sum kain$ cat xs.pl
        use strict;

        use List::Util 'sum';

        my @a = ( 1 .. 10**6 );

        use Time::HiRes 'time';

        my $t = time();

        &sum( @a );

        printf( '%.6f' . "\n", time() - $t );

        azazel:list-util-sum kain$ perl xs.pl
        0.015808
        azazel:list-util-sum kain$ cat pp.pl
        use strict;

        sub company_stuff_add_array_elems
        {
        my $list = shift;

        my $count = 0;

        foreach ( @$list )
        {
        $count += $_;
        }

        return $count;
        }

        my @a = ( 1 .. 10**6 );

        use Time::HiRes 'time';

        my $t = time();

        &company_stuff_add_array_elems( \@a );

        printf( '%.6f' . "\n", time() - $t );

        azazel:list-util-sum kain$ perl pp.pl
        0.098781
        Ответить
        • Еще раз, стоимость ОЗУ vs скорость разыменовывания в общих задачах отдана памяти. Ибо сейчас модно использовать перл, при этом приложения запускаются в 10-20 процессах, каждый из которых жрет по 1-2 гб. Вот и думайте, что будет если у меня всего 24гб ОЗУ, 10 процессов и я использую массивы размеров по 2гб. Как скоро ваш вариант уйдет в своп и затормозит вообще полностью всю систему?
          Ответить
        • (лучше поздно чем никогда)

          разница производительности тут из-за того что List::Util это XS модуль писаный на С.
          Ответить
        • vanished
          Ответить
      • >> А потеря производительности на разыменовывания в обмен на двойное потребление озу
        царское байтоёбство в моем перле, лол
        Ответить
      • 😨
        Ответить

    Добавить комментарий