понедельник, 25 января 2010 г.

Рекурсивное копирование сложных структур данных


Модуль Storable
Классический вариант - это использования функции dclone со стандартного модуля Storable, который предзначен для сериализации данных, и невероятно быстрый. Реализован на 'C' с низкоуровневыми оптимизациями, работающими с внутренней реализацией Perl( инкапсуляция отдданна в жертву в обмен на скорость)
Функция  dclone на самом деле сначала просто сериализирует в память данные, а потом десериализирует в новую структуру( dclone(.) = thaw(freeze(.)) ).
В документации по модулю Storable мы можем найти следующую информацию: 
"There is a Clone module available on CPAN which implements deep cloning natively, i.e. without freezing to memory and thawing the result.  It is aimed to replace Storable's dclone() some day.  However, it does not currently support Storable hooks to redefine the way deep cloning is performed."

Модуль Clone
Модуль Clone позиционирует себя как более производительное решение для клонирования сложных структур данных чем Storable, что прямо написанов документации "For a slower, but more flexible solution see Storable's dclone()."

Результат тестирования(бенчмарк приатачен)
Модуль clone имеет преимущество на простых структурах данных(с минимальным количеством элементов), на сложных структурах - он проигрывает. 
Уже массив с 15 элементов({foo=>'bar', bar=>'foo' })  копируется практически с одинаковой скоростью. При увеличение количества элементов Clone начинает проигрывать. 

                    Rate storable_simple    clone_simple
storable_simple  59644/s              --            -82%
clone_simple    331579/s            456%              --

                     Rate storable_standart    clone_standart
storable_standart 30914/s                --               -3%
clone_standart    31870/s                3%                --

                   Rate    clone_complex storable_complex
clone_complex    3543/s               --             -47%
storable_complex 6719/s              90%               --

Выводы
Практически всегда стандартный модуль Storable явлеется более удачным решением для клонирования структур.

Использование Clone может быть оправдано только в очень ограниченных случаях и при соблюдение следующих условий: 
  1. Копируются очень простые структуры данных 
  2. Эти структуры не являются частью одной сложной структуры( если их много, то скорее всего они в массиве, тогда имеет смысл скопировать весь массив при помощи Storable и это будет однозначно быстрее чем копировать поэлементно или весь массив сразу при помои Clone
  3. Время их копирования является узким местом при выполнении программы.

0 коммент.:

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)