- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
function getAlphabetList($list = null)
{
$alphabet = split(' ', 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z');
foreach($alphabet as $letter)
{
$has_letter = false;
if(is_array($list))
{
foreach ($list as $value)
{
if(substr(strtoupper($value),0,1) == strpos($letter,$value,1))
{
$has_letter = true;
}
}
}
if($has_letter)
{
$output .= '<a href="?letter='.$letter.'">'.$letter.'</a> ';
} else {
$output .= $letter.' ';
}
}
return $output;
}
Шерстим список записей, определяем, на какие буквы они начинаются, и для имеющихся букв генерируем гиперссылки. Мужика попросили разобраться, почему каталог на 126000 записей тормозит при отображении, и он увидел в коде это.
http://thedailywtf.com/Articles/Thorough-Letter-Checking.aspx
P. S. А в PHP после $has_letter = true; нельзя сделать преждевременный выход из цикла?
Your K.O.
Или может в лист, там... десять -- двадцать... по какому-нибудь ещё параметру выплёвывалось?
На самом же деле мы можем построить заранее карту для одного из множеств, то есть отображение из AxB либо в A, либо в B, тогда совершив только либо B, либо A действий, соответственно.
Потому построив карту для списка алгоритм можно ускорить в 126, 000 раз.
В 26 раз он ускоряется, если построена карта для букв (какой-нибудь hashMap в виде ассоциативного массива).
Я пояснил, что если в 26 раз именно очевидно, то и в сто тысяч очевидно.
Автор кода, боюсь, вообще не имеет понятия об отображениях, картах, индексах и т.п.
Вот я как подумал...
Каждому элементу списка соответствует одна буква, причём очевидно, какая.
Но каждой букве соответствует дохрена элементов, то есть карта неочевидна, её нужно строить и... данный ГК это и делает.
Можно заранее построить некоторую "функцию отображения" букв во множество ссылок. Такая функция задаст "карту". Ещё эти функции называют хеш-функциями, по ключу они находят значение. Ключ -- буква, значение -- наличие ссылки. И за одну операцию можно будет выполнить получение ссылки из записи.
Так в 26 раз ускоряется.
Но можно такую же карту построить и для записей.
Так же, как заранее создаётся карта букв, можно заранее создать таблицу, например, в базе данных (такая таблица может носить название "индексной таблицы"), которая будет хранить информацию о том, сколько записей начинается на данную букву. Эта таблица будет содержать всего 26 записей. И для построения ссылок нужно будет пройтись по этой таблице всего один раз, тем самым получив ускорение в 126 000 раз.
Операция построения этих карт совершенно симметрична относительно того на чём её строить (на буквах или на записях) с точки зрения математики. С точки зрения диспетчеризации, конечно не одно и тоже. Ибо: алфавит статичен, а записи меняются, и карту записей придётся чаще обновлять. Но разве столь существенное ускорение не стоит того?
Что и делает данный код!
И вот ускорить его можно, если: либо шерстить записи и, выбирая первую букву, по карте (выраженной ассоциативным массивом, например) сразу создавать ссылку, либо шерстить буквы и по предвычисленной карте уже для записей (выраженной, например, индексной таблицей) получать сразу ссылку.
Возможно, я не могу правильно мысль преподнести...
Главное -- построить её один раз и далее ей пользоваться (обновляя при необходимости). Но не строить её каждый раз, когда нужно получить множество ссылок.
Естественно, что при составлении карты записей вполне прилично воспользоваться картой букв. Да.
UPD: когда у тебя 126 тыс. записей, то даже небольшие действия внутри одной из них, вообще-то, сложатся в макроскопическую величину, потому кажется мне, что логичнее ускоряться по записям, чем по буквам.
Это просто... Не поддаётся никакому осознанию...
Какие уж там 26 букв... Тут катастрофа просто...
Это вот так у меня в голове помутилось, когда я по ссылке прочитал.
UPD: Хотя я так и не понял, действительно ли там шерстят тысячи записей или их там выбирают по дополнительному условию. Если по доп. условию, то составление карты записей уже не есть возможно. Да и ускорение будет сравнимое с картой по буквам.
Вы это дайте компренде. Он это выполнит. Ему все непочем. Упоротый напроч. Притом не в коде, а вручную.
:-(
Боюсь, что в коде этого CMS могут содержаться ещё более ужасные вещи.
после вот этого
$alphabet = split(' ', 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z');
наверно и не стоило дальше читать
А потом уже выводить буквы. И не требуется ни какая доп.обработка кодом.
@
БИОРЕАКТОР