Pull to refresh
-25
0
Send message
А я никогда не заморачивался со шпорами. Их нужно както досать потом еще долго переписывать. Я обычно просто делал бомбы на все вопросы, если позволяло время ну или хотя бы на половину вопросов. Заодно в процессе создание бомб много чего запоминалось и я был в общем то в теме всего курса. А листы тупо клал стопкой с чистыми на край стола и не парился вообще. Хотя бомбы не всегда спасали )
Как я понял, автор имеет ввиду, что для реализации ассоциативного массива используется бинарное дерево, а коллизии возникают, опять же по моим догадкам, код я не смотрел, некоторые ключи видимо имеют одинаковый результат хэш-функции, который используется для доступа к элементам в дереве и поэтому возникают коллизии.
memcached написан на С, а не на С++. Ну еще один велосипед. Автор получит много скилла в разработке сетевых многопоточных приложений.
Как вариант сделать массив из n деревьев, каждое со своим rwlock-ом. То есть при запроси put считаем индекс в этом от ключа массиве, лочим на запись все дерево, записываем элемент, олочиваем. А при чтении сответственно лочим на чтение. уменьшение столкновений в n-раз практически.
А как память считать можно обертку тупо написать вокруг malloc и free, ну или как там оно в паскале называется. И в некоторый счетчик добавлять/вычитать чиселки через mutex, конечно. И в некоторых точках его выводить. Это самый простой вариант.
Распарсивать его конечно нужно, но я думаю, что скорость упрется все равно не в разбор HTTP.
Ну да. Либо память, либо время. Нужно искать нечто среднее, удовлетворяющее запросам.
А при чем тут md5? Чтоб считать индекс от строки? Можно взять проще, да хоть тупо остаток от деления суммы всех символов в ключе на размер таблицы. А в дереве вы сравниваете строки просто или как? Ну можно сделать на 10М и на 20М таблицу — разницы нет, такого размера, чтобы коллизий не было. А при добавлении/удаленнии в дерево, разве не происходит его перебалансировки?
И еще как вариант не изобретать своего протокола, а взять HTTP или добавить его поддержку. Если считывание и запись в сокеты происходит в отдельных потоках, зачем тогда неблокирующие? Или у вас там очереди на отправку, примем и обработку в каждом потоке и при неудачном чтении/записи происходит переход к poll-у?
А почему не просто хэшом, а деревом? Создать, например, таблицу на 4М и более элементов. В большинстве случаев будет работать значительно быстрее чем дерево. Когда элементов будет меньше чем в хэш-таблице и при относительно равном распределении ключей, вставка и выборка будет происходить за O(1) а не за O(log(n)). Как способ для блокировок, можно все пространство ключей разбить на n частей и лочить только соответствующую часть, а не все.
Там же недавно их расширили. В русской википедии есть статья ru.wikipedia.org/wiki/%D0%A1%D0%BC%D0%B5%D1%80%D1%82%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B5%D1%85. Так что все религиозные фанатики пытаются подстраиваться под современные технологии и как то сдерживать их развитие.
Вроде в валгринде есть такая штука как отслеживание гонок и дедлоков, но мне как то не приходилось с его помощью этим заниматься. А вообще, конечно, нужно изначально это планировать параллельность.
Это, кстати интересный вариант. Никогда почему то не додумывался использовать сигналы в С, только обработку некоторых типа SIGTERM, делал корректной. Выходит почти как исключения в C++.
Как вариант можно сделать.
char const msg[] = «Hello World!\n»;

char const * end = begin + sizeof(msg)-1;

Таким образом не нужно будет вызывать strlen, и длина строки будет посчитана на этапе компиляции.
Вообще ВСЕГДА нужно проверять, что возвращаяет malloc, но его тут нет. А использовать exit как в случае про xmalloc, как мне кажется странно. А если нужно завершить соединения, сделать shutdown сокетам, записать в файл, что еще не записал и тд. В более-менее сложной программе нельзя использовать exit.
А кем вы работаете в intel, если не секрет?
Общего да. А на самом деле их много как раз для переименовывания. То есть внешне выглядит работа с регистром eax, например. А на самом деле это будет с каким-нить R12 или как он там внутренне называется.
Вообще 2 кратного роста потребления памяти я не замечал. Довольно странно. Указатели все таки это не весь код. Возможно в апаче используется много типов вроде size_t. Кроме возможности адресовать больше памяти, вообще должны быстрее выполняться 64х битные операции, тк код компилятор будет генерить зная о 64х битных регистрах. Регистров стало около 100 штук, что позволяет процессору генерить более эффективое внеочередное выполнение команд, тк возможностей переименовывания регистров больше. Думаю так же всегда происходит компиляция с поддержкой SEE. Короче плюсов масса. Из реально наблюдаемых стал значительно шустрее работать mysql. Сравнением выполнения своих программ я не занимался, но по памяти не сильная разница, думаю 30% верхних предел. Возможно в программах где кучи указателей и кода и мало данных разница будет больше. Плюсов на самом деле больше. Это только то что я вспомнил.
Удачи в суде! Нужно остаивать свою правоту! Еслиб они вернули деньги без разговоров в итоге покупатель был бы доволен, что не вина магазина в левом телефоне и магазин повел сбея правильно и вполне возможно следующий раз бы покупал в этом же магазе. По крайней мере не былоб этого поста, который отпугнет много потенциальных клиентов. Меня, например.
Согласен. Пользователь точно не виновен.

Information

Rating
5,714-th
Registered
Activity