Как я могу ускорить мою программу Perl?

Вы считали «блокировку экрана», когда пользователь не работает на стороне клиента? Конечно, вы должны обрабатывать конец сеанса на стороне сервера, но на самом деле это кажется более чистым и более безопасным решением, чем ожидание действия с клиентской стороны (особенно если пользователь ушел и оставил на экране некоторые конфиденциальные данные).

Проверьте эту директиву ng-idle .

29
задан Community 23 May 2017 в 11:46
поделиться

11 ответов

Эта единственная половина касается Вашего вопроса - но в интересах документации я отправлю его здесь.

А, недавний , CentOS/Perl bugfix увеличил скорость нашего приложения больше, чем вдвое. Это - необходимость для любого рабочий CentOS Perl и использование благословлять/перегружать функции.

9
ответ дан Grey Panther 23 May 2017 в 11:46
поделиться
  • 1
    @Goz предположим я хочу использовать 5x5 ядро фильтра, как я вычисляю веса, которые должны войти в фильтр? – Moeb 8 November 2009 в 12:18

Представьте свое приложение - использующий, например, упомянул выше профилировщик. Вы будете тогда видеть, где движение времени

, Если время будет проведено, делая вещи кроме использования ЦП, необходимо уменьшить тех сначала - ЦП легко масштабировать, другие вещи не.

Несколько операций являются особенно медленными, я нашел:

  • keys() на большом хеше очень плох
  • Использование Data::Dumper для отладки. Используя эту функцию на большой структуре является очень медленным. Избегайте его, если Вы можете. Мы видели код, который делает:

    use Data::Dumper; 
    $debugstr = Dumper(\%bighash); 
    if ($debugflag_mostlyoff) { log($debugstr); } 
    
  • Большинство модулей имеет альтернативы с различными рабочими характеристиками - некоторые буквально сосут невероятно плохо.

  • Некоторые регулярные выражения могут быть очень медленными (много.* и т.д.) и могут быть заменены эквивалентными, которые быстрее. Регулярные выражения довольно легки к модульному тесту, и тест производительности (просто пишут программу, которая выполняет его в цикле против большого моделируемого набора данных). Лучшие регулярные выражения запускаются с чего-то, что может быть протестировано очень быстро, такие как литеральная строка. Иногда лучше не искать вещь, которую Вы ищете сначала сначала и делаете "оглядывание", чтобы проверить, является ли это действительно вещью, которую Вы ищете. Оптимизация regexps действительно является чем-то вроде черной магии, в которой я не очень хорош.

не рассматривают перезапись чего-то в C за исключением последнего средства. Вызов C от Perl (или наоборот) имеет относительно большие издержки. Если можно получить быструю реализацию Perl, это лучше.

при перезаписи чего-то в C попытайтесь сделать это способом, который минимизирует вызов наверху и звонит во время выполнения жемчуга (SV*, функции, например, главным образом копируют строки вокруг). Один способ достигнуть этого путем создания функции C, которая делает больше и вызов его меньше раз. Копирование строк вокруг в памяти не прохладно.

, С другой стороны, переписывая что-то в C несет большой риск, потому что можно представить новые виды отказа, например, утечки памяти, катастрофические отказы, проблемы безопасности.

9
ответ дан Xaerxess 23 May 2017 в 11:46
поделиться

Метод и вызовы подпрограммы не являются бесплатными в Perl. Они являются относительно дорогими. Так, если Ваше профилирование оказывается расходами довольно большого блока времени выполнения в небольших методах доступа которые могли бы быть микрооптимизацией, которая стоит посмотреть на.

Однако, что Вы должны не , делают заменяет средства доступа, такие как get_color () здесь:

package Car;
# sub new {...}

sub get_color {
   my $self = shift;
   return $self->{color};
}

package main;
#...
my $color = $car->get_color();

с повреждающими инкапсуляцию прямыми доступами:

my $color = $car->{color};

можно было бы думать, что это само собой разумеется, но каждый также видит сделанный повсеместно. Вот то, что можно сделать, с помощью Класс:: XSAccessor

package Car;
# sub new {...}
use Class::XSAccessor
  getters => {
    get_color => 'color',
  },
  setters => {
    set_color => 'color',
  };

Это создает новые методы, добирается - и set_color (), которые реализованы в XS и таким образом о дважды с такой скоростью, как Ваша скрученная вручную версия. Мутаторы (т.е. "$car-> цвет ('красный')"), также доступны, как цепочечные методы.

В зависимости от Вашего приложения, это может дать Вам очень крошечное (но чрезвычайно свободный) повышение. Не ожидайте больше чем 1-2%, если Вы не делаете что-то специфическое.

8
ответ дан szabgab 23 May 2017 в 11:46
поделиться
  • 1
    @Bitterblue: Действительно. Как? Нейронные сети являются алгоритмом машинного обучения. Это о 2D фильтрации пространства изображения. – Goz 11 March 2015 в 16:59

Самый экономически эффективный метод мог бы быть, для рассмотрения более быстрых аппаратных средств (=> соответствующая аппаратная архитектура). Я не говорю более быстрые центральные процессоры, а скорее более быстрые диски, быстрее объединяясь в сеть.. быстрее что-либо, действительно, который ускоряет ввод-вывод.

я испытал это много лет назад, когда мы переместились, XML-парсинг основывал приложение (новейшая технология в этом time< g>) от (быстрый и надежный!) Windows Server к специализированному, хотя несколько устаревший, платформе SUN с более быстрым вводом-выводом все вокруг.

Как всегда, рассмотрите

  • производительность разработчика (сколько времени занимает кодировать, насколько сложный проблема, удобный в сопровождении результат),
  • Аппаратная производительность,
  • Производительность программного обеспечения

, и улучшитесь, где большинство (стоил!) эффективный для проблемы под рукой...

2
ответ дан Peter Mortensen 23 May 2017 в 11:46
поделиться
  • 1
    Я полагаю, что эта строка: sqrtTwoPiTimesRadiusRecip * Exp(-x * sqrtTwoPiTimesRadiusRecip); должен быть: sqrtTwoPiTimesRadiusRecip * Exp(-x * twoRadiusSquaredRecip); – ashagi 30 June 2011 в 06:07

Если Ваши потребности кода, ускоряющие тогда возможности, состоят в том, что Ваш набор тестов делает также. Этот разговор затрагивает ключевые пункты:

Турбо Заряженные Наборы тестов

1
ответ дан EvdB 23 May 2017 в 11:46
поделиться
  • 1
    Умножение sqrtTwoPiTimesRadiusRecip не нужно вообще, потому что Вы нормализуете ядро так или иначе. – Emily L. 21 October 2014 в 17:52

Эссе, которое определенно стоит прочитать на предмете, является разговором Nicholas Clark , Когда жемчуг достаточно не совсем быстр (PDF). Некоторые точки немного датированы, такие как ссылка на Devel:: DProf, но имеют в виду, что он был записан в 2002.

, Тем не менее, большая часть покрытого материала остается релевантной.

9
ответ дан Lizardx 23 May 2017 в 11:46
поделиться

Andy уже упомянул Devel:: NYTProf. Это является потрясающим. Действительно, действительно потрясающий. Используйте его.

, Если по некоторым причинам Вы не можете использовать Devel::NYTProf, тогда можно отступить к старому доброму Devel:: DProf, который прибыл стандарт с Perl в течение долгого времени теперь. Если Вы имеете верный функции (в математическом смысле), которые занимают много времени для вычисления (например, Числа Фибоначчи), то можно найти , Memoize обеспечивает некоторое улучшение скорости.

Много низкой производительности прибывает из несоответствующих структур данных и алгоритмов. Хороший курс в информатике может помочь очень здесь. Если бы Вы имеете два способа сделать вещи и хотели бы сравнить их производительность, Сравнительный тест , модуль может также оказаться полезным.

следующий Советы по Perl могут также оказаться полезными здесь:

: Я записал некоторые ресурсы выше, таким образом, я могу склоняться к ним.

34
ответ дан szabgab 23 May 2017 в 11:46
поделиться
  • 1
    Слишком плохо исходный код является GPLv3. – Dustin Kingen 28 March 2013 в 10:10

Помните правила Клуба Оптимизации:

  1. первое правило Клуба Оптимизации, Вы не Оптимизируете.
  2. второе правило Клуба Оптимизации, Вы не Оптимизируете без измерения.
  3. , Если Ваше приложение работает быстрее, чем протокол базовой передачи, оптимизация закончена.
  4. Один фактор за один раз.
  5. Никакие маркетиры, никакие расписания маркетира.
  6. Тестирование продолжится, пока оно имеет к.
  7. , Если это - Ваша первая ночь в Клубе Оптимизации, необходимо записать тестовый сценарий.

Так, принимая Вы на самом деле имеете рабочий код, запускаете Вашу программу под Devel:: NYTProf.

Находят узкие места. Тогда возвратитесь сюда, чтобы сказать нам, каковы они.

, Если Вы не делаете , имеют рабочий код, получают его работающий сначала. Единственная самая большая оптимизация, которую Вы будете когда-либо делать, идет от нерабочего до работы.

155
ответ дан szabgab 23 May 2017 в 11:46
поделиться
  • 1
    Я can' t используют его на работе, так как программное обеспечение является собственным (can' t распределяют источник). По крайней мере, если бы это был LGPL или двойная лицензия с Apache2/MS-PL/MIT/BSD, то я мог бы использовать его. – Dustin Kingen 28 March 2013 в 22:54

Не имея необходимость переписывать большие блоки, можно использовать Встроенный:: C для преобразования любой единственной, медленной подпрограммы в C. Или непосредственно используйте XS. Также возможно инкрементно преобразовать нижние индексы с XS. PPI/PPI:: XS делает это, например.

, Но перемещающийся в другой язык всегда последнее средство. Возможно, необходимо ли заставить опытного программиста Perl смотреть код? Более вероятно, чем не, (s) он определил бы некоторую особенность, это серьезно повреждает Вашу производительность. Кроме этого, представьте свой код. Помните, нет никакой серебряной пули.

Относительно психо и пирекс: Нет, нет никакого эквивалента для Perl.

14
ответ дан szabgab 23 May 2017 в 11:46
поделиться
  • 1
    Положительные стороны @Virtlink - наши определения очень отличаются, и, вероятно, необходимо записать собственный ответ, который очень хорошо мог быть намного более интересным/полезным. Мое понимание Array ' s единственная цель быть реализацией T[] и я вижу, как это отличается от Вашего " Array, оказывается, используются для реализации T[] ". и для " массивы как основной concept" отличается от - " индексируемая последовательность elements" по сравнению с " непрерывный блок памяти фиксированного size"... – Alexei Levenkov 27 March 2013 в 17:01

Существует много вещей, которые Вы могли бы изменить к лучшему, таким образом, сначала необходимо выяснить то, что является медленным. Другие уже ответили на тот вопрос. Я говорю об этом немного в Perl Освоения также.

неполный список вещей думать о том, поскольку Вы пишете новый код:

  • Профиль с чем-то как Devel:: NYTProf для наблюдения, где Вы проводите большую часть своего времени в коде. Иногда это удивительно и легко зафиксировать. Perl Освоения имеет большой совет об этом.

  • Perl должен скомпилировать источник, каждый раз и компиляция могут быть медленными. Это должно найти все файлы и так далее. Посмотрите, например, "Своевременный Запуск" , Jean-Louis Leroy, где он ускоряет все только путем оптимизации местоположений модуля в @INC. Если Ваши затраты на запуск являются дорогими и неизбежными, Вы могли бы также посмотреть на персистентный жемчуг, как pperl, mod_perl, и так далее.

  • Взгляд на некоторые модули Вы используете. У них есть длинные цепочки зависимостей только, чтобы сделать простые вещи? Несомненно, нам не нравится переизобретение, но если колесо, Вы хотите поставить свой автомобиль также, идет с тремя лодками, пятью козами и чизбургером, возможно, Вы хотите создать свое собственное колесо (или найти различное).

  • Вызовы метода могут быть дорогими. В Perl:: набор тестов Критика, например, его вызовы к isa замедляют вещи. Это не что-то, чего можно действительно избежать во всех случаях, но это - что-то для учета. У кого-то была большая кавычка, которая пошла что-то как "Никакой умы, бросив фактор 2; именно, когда у Вас есть десять человек, делающих его, это плохо".:) Perl v5.22 имеет некоторые повышения производительности для этого.

  • , Если Вы называете те же дорогие методы много раз, но получаете те же ответы, что-то как , Memoize мог бы быть для Вас. Это - прокси для вызова метода. Если это - действительно функция (значение, тот же вход дает тот же вывод без побочных эффектов), Вы не должны действительно неоднократно называть его.

  • Модули такой как Apache:: DBI может снова использовать дескрипторы базы данных для Вас для предотвращения дорогого открытия соединений с базой данных. Это - действительно простой код, таким образом смотреть внутри может показать Вам, как сделать это, даже если Вы не используете Apache.

  • Perl не делает оптимизации хвостовой рекурсии для Вас, не происходите из Lisp, думая, что Вы собираетесь сделать эти супер быстрые рекурсивные алгоритмы. Можно превратить тех в повторяющиеся решения легко (и мы говорим об этом в [1 110] Промежуточный Perl.

  • Взгляд на Ваш regexes. Много открытых законченных кванторов (например, .*) может привести к большому отслеживанию в обратном порядке. Проверьте Jeffrey Freidl Регулярные выражения Освоения для всех окровавленных деталей (и через несколько языков). Также выезд его regex веб-сайт .

  • Знают, как Ваш жемчуг компилируется. Вам действительно нужна поточная обработка и DDEBUGGING? Те замедляют Вас немного. Проверьте perlbench утилиту для сравнения различных двоичных файлов жемчуга.

  • Сравнительный тест Ваше приложение против различного Perls. Некоторые более новые версии имеют ускорения, но также и некоторые более старые версии могут быть быстрее для ограниченных наборов операций. У меня нет особого совета, так как я не знаю то, что Вы делаете.

  • Распространенный работа. Можно ли сделать некоторую асинхронную работу в других процессах или на удаленных компьютерах? Позвольте своей программе работать над другими вещами, поскольку кто-то еще выясняет некоторые подпроблемы. Perl имеет несколько асинхронные и модули смещения загрузки. Остерегайтесь, тем не менее, что леса, чтобы сделать тот материал хорошо могли бы потерять любое преимущество для выполнения его.

31
ответ дан brian d foy 23 May 2017 в 11:46
поделиться
  • 1
    T[] универсальный массив с ковариантным параметром типа T (хотя отличающийся от дженериков, поскольку они используются в today' s C#), но Array не релевантно здесь. Это работало бы точно также, если все массивы T[] наследовались от Object непосредственно. Они не эквивалентны. И массивы являются фундаментальным понятием, которое предоставляет Вам непрерывную область памяти. То, что это приводит к O (1) индексация и что список также происходит для имения O (1) индексация, не делает их эквивалентными, и конечно doesn' t входят в список, эквивалентный массивам фиксированного размера. – Daniel A.A. Pelsmaeker 27 March 2013 в 16:45

Лучший способ сделать Ваш прогон программы быстрее состоит в том, чтобы сделать Вашу программу, действительно меньше работают. Выберите правильный алгоритм для задания. Я видел много медленных приложений, потому что они выбирают немой алгоритм в некоторой области кода, который получает названные миллионы времен. При выполнении миллиона * миллион операций вместо всего миллиона операций программа собирается выполнить миллион раз медленнее. Буквально.

, Например, вот некоторый код, я видел, что вставляет элемент в отсортированный список:

while(my $new_item = <>){
    push @list, $new_item;
    @list = sort @list;
    ... use sorted list
}

вид является O (n, регистрируют n). Вставка в отсортированный список является O (зарегистрируйте n).

Фиксируют алгоритм.

6
ответ дан jrockway 23 May 2017 в 11:46
поделиться
  • 1
    @Bitterblue: Справедливое замечание, можно использовать фильтры для извлечения функций машинного обучения. Его все еще совершенно не важный этому вопросу, однако... – Goz 23 March 2015 в 09:59
Другие вопросы по тегам:

Похожие вопросы: