Необходимо поглядеть в Allegro, это быстро для изучения и большая библиотека для разработки прототипа идей, даже если Вы принимаете решение использовать его для заключительной разработки, это - большая библиотека для игр.
я начал использовать его пара несколько лет назад, и недавно я читал книга , которая принесла мне совершенно новую партию идей, и я начал работать над ним снова.
Да. Извлечение с помощью substr
, вероятно, будет самым быстрым способом сделать это. То есть:
$FIELDS::transaction_date = substr $_, 0, 8;
$FIELDS::customer_id = substr $_, 8, 20;
скорее всего будет быстрее. Если бы я писал этот код от руки, я бы не отказался от unpack
, но если вы генерируете код, вы могли бы также попробовать и измерить.
См. Также ответы на Perl unpack () когда-либо быстрее, чем substr ()?
Что касается удаления начальных пробелов, s / ^ \ s + //
, вероятно, будет самый быстрый метод.
Обновление: Трудно сказать что-либо определенное, не имея возможности запускать тесты. Однако как насчет:
my $x = substr $_, 0, 8;
для полей, которые не нуждаются в обрезке, и
my ($y) = substr($_, 8, 20) =~ /\A\s+(.+?)\s+\z/;
, которые нужно обрезать?
Я действительно сталкивался с этой проблемой снова и снова. Распаковать лучше, чем substr .
Что касается пространства для раздевалки, вы в значительной степени облажались. Этот хак с регулярным выражением - «официальный» способ сделать это. Возможно, вам удастся повысить эффективность, улучшив операторы распаковки (если длина данных не превышает 4 цифр, зачем распаковывать полные 12 цифр поля?), Но в остальном синтаксический анализ - это просто лаваш.
Удачи с ваши плоские данные. Чертовски устаревший хлам, как я его ненавижу.
Вы уверены, что ваш процессор привязан к этой задаче? Вычисления достаточно просты, чтобы заподозрить, что весь процесс, вероятно, связан с вводом-выводом. В этом случае оптимизация для более быстрой распаковки не принесет вам много времени.
Если вы действительно ограничены процессором, описанная проблема кажется в значительной степени распараллеливаемой, но, конечно, дьявол кроется в деталях ваших бизнес-вычислений .
Simply make it go in parallel. It's trivial, and on any even remotely modern machine it will be faster.
Тестирование версии нашего кода на основе substr показало, что она может быть примерно на 50% быстрее, чем наша существующая распаковка. Сравнивая коды в реальном приложении, версия substr дала нам сокращение времени выполнения на 16%. Это близко к тому, на что мы надеялись, основываясь на тесте и профилировании, упомянутом в вопросе.
Эта оптимизация может быть полезна для нас. Но у нас на горизонте миграция на новую ОС, поэтому мы подождем и посмотрим, как там работают коды, прежде чем продолжить. Мы добавили тест, чтобы следить за сравнительными тестами.
Идиома, которая у нас сейчас есть:
$FIELDS::transaction_date = substr( $_, 0, 8 ) || '';
$FIELDS::transaction_date =~ s/\s+\z//;
$FIELDS::customer_id = substr( $_, 8, 20 ) || '';
$FIELDS::customer_id =~ s/\s+\z//;
Далее следует выборочное удаление ведущего пробела, как и раньше.
Спасибо за все ответы. Я приму предложение Синан, потому что оно сработало для нас, несмотря на то, что казалось «просто неправильным».
Это тоже может быть что-то для XS - так что вы используете функцию C для изменения данные. Процесс сборки станет более сложным, так как вы зависим от компилятора C и потребуете дополнительных шагов интеграции.