- 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
TarasB 24.12.2010 12:06 # 0
inkanus-gray 24.12.2010 14:39 # 0
P. S. А в PHP после $has_letter = true; нельзя сделать преждевременный выход из цикла?
MoLe-X 24.12.2010 14:41 # 0
Uchkuma 24.12.2010 15:52 # +1
Your K.O.
Lure Of Chaos 24.12.2010 18:55 # 0
interested 24.12.2010 12:57 # 0
Или может в лист, там... десять -- двадцать... по какому-нибудь ещё параметру выплёвывалось?
inkanus-gray 24.12.2010 13:19 # +2
interested 24.12.2010 13:54 # +4
На самом же деле мы можем построить заранее карту для одного из множеств, то есть отображение из AxB либо в A, либо в B, тогда совершив только либо B, либо A действий, соответственно.
Потому построив карту для списка алгоритм можно ускорить в 126, 000 раз.
В 26 раз он ускоряется, если построена карта для букв (какой-нибудь hashMap в виде ассоциативного массива).
inkanus-gray 24.12.2010 14:36 # 0
interested 24.12.2010 14:50 # +2
Я пояснил, что если в 26 раз именно очевидно, то и в сто тысяч очевидно.
Автор кода, боюсь, вообще не имеет понятия об отображениях, картах, индексах и т.п.
Вот я как подумал...
TarasB 24.12.2010 14:58 # +1
Каждому элементу списка соответствует одна буква, причём очевидно, какая.
Но каждой букве соответствует дохрена элементов, то есть карта неочевидна, её нужно строить и... данный ГК это и делает.
interested 24.12.2010 22:18 # 0
Можно заранее построить некоторую "функцию отображения" букв во множество ссылок. Такая функция задаст "карту". Ещё эти функции называют хеш-функциями, по ключу они находят значение. Ключ -- буква, значение -- наличие ссылки. И за одну операцию можно будет выполнить получение ссылки из записи.
Так в 26 раз ускоряется.
Но можно такую же карту построить и для записей.
Так же, как заранее создаётся карта букв, можно заранее создать таблицу, например, в базе данных (такая таблица может носить название "индексной таблицы"), которая будет хранить информацию о том, сколько записей начинается на данную букву. Эта таблица будет содержать всего 26 записей. И для построения ссылок нужно будет пройтись по этой таблице всего один раз, тем самым получив ускорение в 126 000 раз.
Операция построения этих карт совершенно симметрична относительно того на чём её строить (на буквах или на записях) с точки зрения математики. С точки зрения диспетчеризации, конечно не одно и тоже. Ибо: алфавит статичен, а записи меняются, и карту записей придётся чаще обновлять. Но разве столь существенное ускорение не стоит того?
TarasB 24.12.2010 22:36 # 0
Что и делает данный код!
interested 24.12.2010 22:47 # 0
И вот ускорить его можно, если: либо шерстить записи и, выбирая первую букву, по карте (выраженной ассоциативным массивом, например) сразу создавать ссылку, либо шерстить буквы и по предвычисленной карте уже для записей (выраженной, например, индексной таблицей) получать сразу ссылку.
Возможно, я не могу правильно мысль преподнести...
interested 24.12.2010 22:51 # 0
Главное -- построить её один раз и далее ей пользоваться (обновляя при необходимости). Но не строить её каждый раз, когда нужно получить множество ссылок.
TarasB 24.12.2010 23:03 # 0
interested 24.12.2010 23:13 # 0
Естественно, что при составлении карты записей вполне прилично воспользоваться картой букв. Да.
UPD: когда у тебя 126 тыс. записей, то даже небольшие действия внутри одной из них, вообще-то, сложатся в макроскопическую величину, потому кажется мне, что логичнее ускоряться по записям, чем по буквам.
interested 24.12.2010 23:20 # 0
Это просто... Не поддаётся никакому осознанию...
Какие уж там 26 букв... Тут катастрофа просто...
Это вот так у меня в голове помутилось, когда я по ссылке прочитал.
UPD: Хотя я так и не понял, действительно ли там шерстят тысячи записей или их там выбирают по дополнительному условию. Если по доп. условию, то составление карты записей уже не есть возможно. Да и ускорение будет сравнимое с картой по буквам.
guest 25.12.2010 00:26 # +2
Вы это дайте компренде. Он это выполнит. Ему все непочем. Упоротый напроч. Притом не в коде, а вручную.
guest 25.12.2010 00:54 # 0
interested 25.12.2010 16:41 # +1
:-(
telnet 24.12.2010 13:20 # +1
interested 24.12.2010 13:28 # +2
Боюсь, что в коде этого CMS могут содержаться ещё более ужасные вещи.
3.14159265 24.12.2010 14:44 # +3
после вот этого
$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');
наверно и не стоило дальше читать
Lure Of Chaos 24.12.2010 14:51 # 0
vksee 24.12.2010 17:31 # +1
А потом уже выводить буквы. И не требуется ни какая доп.обработка кодом.
lstem 24.12.2010 19:48 # −3
lstem 24.12.2010 19:48 # −3
lstem 24.12.2010 19:48 # −3
lstem 24.12.2010 19:48 # −3
lstem 24.12.2010 19:48 # −3
lstem 24.12.2010 19:48 # −4
guest 24.12.2010 20:48 # +6
3.14159265 24.12.2010 22:35 # +8
@
БИОРЕАКТОР