Компиляторам разрешается предполагать, что базовое значение bool
не испорчено, поэтому оптимизирующие компиляторы могут избежать ветвления.
Если мы посмотрим на сгенерированный код для этого искусственного теста,
int with_if_bool(bool a, int b) {
if(a){b++;}
return b;
}
int with_if_char(unsigned char a, int b) {
if(a){b++;}
return b;
}
int without_if(bool a, int b) {
b += a;
return b;
}
clang воспользуется этим фактом и сгенерирует точно такой же код без ветвей, который суммирует a
и b
для версии bool
и вместо этого генерировать фактические сравнения с нулем в случае unsigned char
(хотя это все еще код без ветвей):
with_if_bool(bool, int): # @with_if_bool(bool, int)
lea eax, [rdi + rsi]
ret
with_if_char(unsigned char, int): # @with_if_char(unsigned char, int)
cmp dil, 1
sbb esi, -1
mov eax, esi
ret
without_if(bool, int): # @without_if(bool, int)
lea eax, [rdi + rsi]
ret
gcc вместо этого будет обрабатывать bool
так же, как если бы он был unsigned char
, не используя его свойства, генерируя код, аналогичный случаю unsigned char
clang.
with_if_bool(bool, int):
mov eax, esi
cmp dil, 1
sbb eax, -1
ret
with_if_char(unsigned char, int):
mov eax, esi
cmp dil, 1
sbb eax, -1
ret
without_if(bool, int):
movzx edi, dil
lea eax, [rdi+rsi]
ret
Наконец, Visual C ++ будет обрабатывать версии bool
и unsigned char
одинаково, точно так же, как gcc, хотя и с более наивным кодовым кодом (он использует условное перемещение вместо выполнения арифметики с регистром флагов, который IIRC Традиционно был менее эффективным, не знаю, для нынешних машин).
a$ = 8
b$ = 16
int with_if_bool(bool,int) PROC ; with_if_bool, COMDAT
test cl, cl
lea eax, DWORD PTR [rdx+1]
cmove eax, edx
ret 0
int with_if_bool(bool,int) ENDP ; with_if_bool
a$ = 8
b$ = 16
int with_if_char(unsigned char,int) PROC ; with_if_char, COMDAT
test cl, cl
lea eax, DWORD PTR [rdx+1]
cmove eax, edx
ret 0
int with_if_char(unsigned char,int) ENDP ; with_if_char
a$ = 8
b$ = 16
int without_if(bool,int) PROC ; without_if, COMDAT
movzx eax, cl
add eax, edx
ret 0
int without_if(bool,int) ENDP ; without_if
Во всех случаях ветви не генерируются; единственное отличие состоит в том, что на большинстве компиляторов генерируется более сложный код, который зависит от cmp
или test
, создавая более длинную цепочку зависимостей.
При этом я бы беспокоился об этом виде микрооптимизации только в том случае, если вы фактически выполняете свой код под профилировщиком, а результаты указывают на этот конкретный код (или на какой-то жесткий цикл, который его включает); в общем, вы должны написать разумный, семантически правильный код и сосредоточиться на использовании правильных алгоритмов / структур данных. Микрооптимизация наступает позже.
В моей программе это не сработает, поскольку на самом деле это операция типа:
blockquote>b+=(a==c)
Это должно быть еще лучше для оптимизатора Так как у него даже нет никаких сомнений относительно того, откуда исходит
bool
- он может просто принять решение прямо из регистра флагов. Как вы можете видеть , здесь gcc производит довольно схожий код для двух случаев, clang точно такой же, в то время как VC ++, как обычно, создает нечто более условное (acmov
) вif
случай. [тысяча сто тридцать-один]
Расширять ответ @yogman.
Memcached является чистым великолепием! Это - высокопроизводительный и распределенный объектный кэш.
И даже при том, что я упомянул, распределил, это в основном столь же просто как запуск одного экземпляра на одном из Ваших запасных/неактивных серверов, Вы настраиваете его как в IP, порте и насколько поршень для использования и Вы сделаны.
memcached -d -u www -m 2048 -l 10.0.0.8 -p 11211
(Выполнения memcached в режиме демона, как пользователь www, 2 048 МБ (2 ГБ) RAM на IP 10.0.0.8 с портом 11211.)
С тех пор Вы просите у memcached данные и если данные еще не кэшируются, Вы вытягиваете его от первоисточника и храните его в memcached. Я уверен, что Вы знакомы с основами кэша.
В кластерной среде можно соединить memcached's в кластер и копировать кэш через узлы. Memcached работает на Linux, Unix и Windows, запустите его где угодно, Вы имеете запасную RAM и начинаете использовать свои ресурсы.
API для memcached должны быть общедоступными. Я говорю, должен, потому что я только знаю о Perl, Java и PHP. Но я уверен, что, например, у людей Python имеют средства усилить его также. Существует memcached Wiki, в случае, если Вы нуждаетесь в указателях или сообщаете мне в комментариях, если я бредил слишком много.;)
Существует 3 способа сохранить состояние сеанса в ASP.NET. Первое в процессе, где переменные хранятся в памяти. Второе должно использовать сервис состояния сеанса путем помещения следующего в web.config файл:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;password="
cookieless="false"
timeout="20" />
Как Вы видите в атрибуте stateConnectionString, сервис состояния сеанса может быть расположен на другом компьютере.
Третья опция состоит в том, чтобы использовать централизованную базу данных SQL. Чтобы сделать это, Вы помещаете следующее в свой web.config:
<sessionState
mode="SQLServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString=
"data source=SERVERHAME;user id=sa;password="
cookieless="false"
timeout="20"
/>
Больше деталей обо всех этих опциях описано здесь: http://www.ondotnet.com/pub/a/dotnet/2003/03/24/sessionstate.html
С Hazelcast можно или использовать распределенную карту Hazelcast, чтобы сохранить и совместно использовать сессии через кластер или позволить менеджеру по Веб-приложению Hazelcast сделать все для Вас. Проверьте документы для деталей. Hazelcast является распределением/делить, супер облегченным и легким, бесплатным решением для распределения данных для Java.
С уважением,
- talip
Получите машину Linux и настройте http://www.danga.com/memcached. Его скорость непобедима по сравнению с другими подходами. (например, cookie, сформируйте скрытые переменные, базы данных),
Как со всеми видами вещи, "это зависит".
Существуют различные решения и подходы.
Как упомянуто, существует понятие централизованного хранилища для состояния сеанса (база данных, memcached, совместно используемая файловая система, и т.д.).
Существуют также кластерные широкие системы кэширования, доступные, которые делают локальные доступные данные ко всем машинам в кластере. Концептуально это подобно централизованному хранилищу состояния сеанса, но эти данные не являются персистентными. Скорее это живет в отдельных узлах и копируется с помощью некоторого механизма, обеспеченного поставщиком.
Другой метод является прикреплением сервера. Когда клиент поражает кластер в первый раз, некоторый механизм (обычно подсистема балансировки нагрузки, выходящая на кластер), прикрепляет клиент к определенному серверу. В типичной клиентской продолжительности жизни тот клиент проведет их все время на единственной машине.
Для механизма обработки отказа каждая машина кластера соединяется с другой машиной, и таким образом, любые изменения сессии совместно используются с парной машиной. Если клиенты прикрепили обнаружение машины проблема, клиент поразит другую машину. На данном этапе, возможно, из-за cookie, новая машина видит, что это не исходная машина для клиента, таким образом, это проверяет с помощью ping-запросов и исходную машину и парную машину для клиентских данных сессии.
В той точке клиент может быть прикреплен к новой машине.
Различные платформы делают это по-разному, включая наличие никакого состояния сеанса вообще.
В ASP.NET можно сохранить данные сессии к базе данных SQL Server, которая характерна для всех веб-серверов в кластере.
После того, как настроенный (в web.config для Вашего сайта), платформа обрабатывает все постоянство для Вас, и можно получить доступ к данным сессии как нормальным.
Как Will сказал, большинство подходов выравнивания нагрузки будет использовать своего рода неподвижность в пути распределение предстоящих запросов от того же клиента, значения, уникальный клиент поразит тот же сервер, если тот фактический сервер не понизится.
Это минимизирует потребность распределения данных сессии, означая, что только в возможном отказе сервера, клиент освободил бы свою сессию. В зависимости от Вашего приложения это более или менее очень важно. В большинстве случаев это не большая проблема.
Даже самый простой способ выравнивания нагрузки (вокруг - rubin поиски DNS) сделает своего рода неподвижность, так как большинство браузеров будет кэшировать фактический поиск и для этого продолжать идти в первую запись, которую это получило, AFAIK.
Это обычно - время выполнения, которое ответственно за sessiondata, в для примера PHP возможно определить Ваш собственный обработчик сессии, который может сохранить данные в базу данных, например. По умолчанию PHP хранит sessiondata на файлах, и могло бы быть возможно совместно использовать эти файлы на SAN или эквиваленте для совместного использования данных сессии. Это было просто теорией, которую я имел, но никогда не обходил для тестирования, так как мы решили, что выпуск сессий не был очень важен и не хотел ту единую точку отказа.
Для достижения выравнивания нагрузки для классического ASP можно сохранить пользователя определенные значения в базе данных и передать ссылочный уникальный идентификатор в URL следующим образом.
Поддержите таблицу сессии в базе данных, которая генерирует уникальный идентификатор для каждой записи. В первый раз Вы хотите сохранить сессию определенные данные, генерировать запись в Вашей таблице сессии и сохранить значения сессии в нем. Получите уникальный идентификатор новой сессии, записывают и переписывают все ссылки в Вашем веб-приложении для отправки уникального идентификатора как части querystring.
На каждой последующей странице, где Вам нужны данные сессии, запросите таблицу сессии с уникальным идентификатором, переданным в querystring.
Пример:
Полагайте, что Ваш веб-сайт имеет 4 страницы: Login.asp, welcome.asp, taskList.asp, newtask.asp
То, когда пользователь входит в систему с помощью страницы login.asp после проверки пользователя, создайте запись в таблице сессии и сохраните необходимую сессию определенные значения (позволяет, говорят что дата/время входа в систему пользователя этого примера). Получите новый уникальный идентификатор записи сессии (позволяет, говорят, что уникальный идентификатор является abcd).
Добавьте все ссылки в своем веб-сайте с уникальным идентификатором как указано ниже:
Теперь, если в какой-либо из вышеупомянутых веб-страниц Вы хотите показать дату/время входа в систему пользователя, просто необходимо запросить таблицу сессии с sessionID параметром (abcd в этом случае) и дисплей пользователю.
Так как уникальное значение, определяющее сессию, является частью URL, любой из Ваших веб-серверов, служащих пользователю, сможет отобразить корректную дату/временную стоимость входа в систему.
Надеюсь, это поможет.