Будет ли использование глобальных переменных давать ускорение? В Руководстве разработчика программного обеспечения Intel по архитектуре (о микропроцессоре) рекомендуется использовать локальные переменные вместо глобальных. Но, рассмотрим следующий код:стек (локальный) или глобальные переменные?
void process_tcp_packets(void) {
char tcp_data[128];
do some stuff with the tcp_data[]....
}
void process_udp_packets(void) {
char udp_data[128];
do some stuff with the udp_data[]
}
void main_event_loop(void) {
while(1) {
if (pending_tcp_requests) {
process_tcp_packets();
}
if (pending_udp_requests) {
process_udp_packets();
}
}
}
Когда main_event_loop() выполняется, контроль потока зависит от переменных «pending_tcp_requests» и «pending_udp_requests». Обе функции process_tcp_packets() и process_udp_packets() при вызове будут выделять локальные переменные в указателе текущего стека. Это означает, что если код постоянно переключает обе функции, локальные переменные будут распределены по одному и тому же адресу памяти. Совместное использование адреса памяти между обеими функциями будет вытеснять данные из текущего кеша L1 и медленного выполнения. Итак, используя глобальные переменные вместо локальных, мы можем ускорить выполнение. Правильно это или нет?
Если да, есть ли недостаток для использования глобальной переменной в этом случае?
Зачем передавать данные памяти из базы данных из кэша? –
«если код постоянно переключает обе функции, локальные переменные будут распределены по одному и тому же адресу памяти» <- hmmm, я не уверен в этом ... Конечно, это не будет через два исполнения программы на современных системах с рандомизацией адресного пространства, но даже в одном и том же контексте выполнения я не знаю, правда ли это. – fge
Вы, кажется, используете сеть. Озабоченность по поводу адресов памяти совершенно незначителен по сравнению с производительностью сети. –