Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Однако наш пример не настолько сложен, в чём мы сейчас и убедимся, не только усовершенствовав оптимизацию и ускорив процедуру сортировки, но и сэкономив память.
Воспользуемся соображением, что номер версии и подверсии не может быть больше 999. Тогда мы можем преобразовать версию и подверсию в одно число по формуле:
[версия]*1000+[подверсия]
То есть 1.1 превратится в 1001, а 1.10 – в 1010. Сортировка таких чисел, очевидно, аналогична правильной сортировке версий.
Новый код будет выглядеть так:
Листинг 11
# Сортировка списка версий с дополнительной оптимизацией
@sorted=map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { m/(d+).(d+)/;
[$_, $1*1000+$2]; } @unsorted;
Обратите внимание, как упростилась процедура сравнения. Это стоило нам небольшого усложнения (и замедления выполнения) кодирующего (второго по тексту) map. Но зато теперь память используется более экономно и, что самое главное, сравнение двух элементов в блоке оператора sort происходит гораздо быстрее.
Какова же производительность этих кодов? Как
показывают тесты, наш успех не всегда можно назвать головокружительным
При сортировке списка из 1000 элементов: первая оптимизация (листинг 10) даёт выигрыш в 4 раза (здесь и далее будем сравнивать с неоптимизированным кодом из листинга 9); дополнительная оптимизация (листинг 11) даёт ещё больший выигрыш – в 4.7 раза.
При сортировке списка из 100 элементов: первая оптимизация даёт выигрыш в 3.8 раза, вторая оптимизация уже не способна дать дополнительный выигрыш, она работает чуть медленнее первой и даёт выигрыш в 3.7 раза.
Такая же ситуация, только более ярко выраженная, наблюдается при сортировке списка из десяти элементов: первая оптимизация – выигрыш в два раза, вторая оптимизация – выигрыш только в 1.7 раза.
Для списка из пяти элементов тестирование даёт следующие результаты: первая оптимизация по-прежнему даёт заметный выигрыш в 1.34 раза, вторая оптимизация продолжает себя дискредитировать, давая выигрыш всего в 1.19 раза.
Мораль, я думаю, уже понятна: чем продуманнее оптимизация, тем она, без сомнения, эффективнее; но её эффективность начинает проявляться только при сортировке достаточно длинных списков. Причём эта критическая длина возрастает с ростом продуманности оптимизации.