O que é "overhead"?


149

Sou estudante de Ciência da Computação e estou ouvindo muito a palavra "sobrecarga" quando se trata de programas e tipos. o que isso significa, exatamente?


27
quanta "coisa extra" você precisa fazer para conseguir algo. Por exemplo, se eu tiver que carregar um projeto de 37 classes apenas para imprimir "Hello World", consideraria isso muito caro.
Scunliffe 18/05/10

1
@ doug65536 Na verdade, é o contrário. =)
Yukio Fukuzawa

Respostas:


177

São os recursos necessários para configurar uma operação. Pode parecer não relacionado, mas necessário.

É como quando você precisa ir a algum lugar, pode precisar de um carro. Mas, seria muito caro conseguir um carro para dirigir na rua, então você pode querer andar. No entanto, a sobrecarga valeria a pena se você estivesse atravessando o país.

Na ciência da computação, às vezes usamos carros para andar na rua porque não temos um caminho melhor, ou não vale a pena "aprender a andar".


84
Uma analogia semelhante estaria voando. Os aviões são muito mais rápidos que os carros, mas a sobrecarga do check-in, segurança etc. do aeroporto faz dos carros uma opção melhor para distâncias mais curtas.
FogleBird 18/05/10

s / drive / go / (Se você precisa dirigir para algum lugar, geralmente não decide andar ...
RCIX

1
@ inf3rno A ironia? Como chegamos ao nosso carro? Nos andamos. E podemos andar totalmente ... até o nosso carro. Não podemos caminhar até o nosso destino, mesmo que seja mais perto do que o nosso carro.
precisa saber é o seguinte

Se eu dissesse que escrevo código java com pouca sobrecarga, como você interpretaria isso em termos da definição de "recursos necessários para configurar uma operação". Meu código não requer muita configuração?
committedandroider

Bem, você precisa ligar o computador ou o servidor, carregar o sistema operacional e todos os drivers, iniciar o processo Java, ativar a JVM, carregar todas as classes, carregar você precisa sincronizar o buffer de entrada / saída no console para poder fazer seu "olá mundo". Mas, por favor, conte-me mais sobre a baixa sobrecarga de codificação.
corsiKa

40

O significado da palavra pode diferir muito com o contexto. Em geral, são os recursos (geralmente a memória e o tempo da CPU) utilizados, que não contribuem diretamente para o resultado pretendido, mas são exigidos pela tecnologia ou método que está sendo usado. Exemplos:

  • Sobrecarga de protocolo : quadros Ethernet, pacotes IP e segmentos TCP têm cabeçalhos, as conexões TCP requerem pacotes de handshake. Portanto, você não pode usar toda a largura de banda que o hardware é capaz para seus dados reais. Você pode reduzir a sobrecarga usando tamanhos de pacotes maiores e o UDP possui um cabeçalho menor e nenhum aperto de mão.
  • Sobrecarga de memória da estrutura de dados : uma lista vinculada requer pelo menos um ponteiro para cada elemento que contém. Se os elementos tiverem o mesmo tamanho de um ponteiro, isso significa 50% de sobrecarga de memória, enquanto uma matriz pode potencialmente ter 0% de sobrecarga.
  • Sobrecarga de chamada de método : um programa bem projetado é dividido em vários métodos curtos. Mas cada chamada de método requer a configuração de um quadro de pilha, parâmetros de cópia e um endereço de retorno. Isso representa a sobrecarga da CPU em comparação com um programa que faz tudo em uma única função monolítica. Obviamente, a manutenção adicional faz com que valha a pena, mas em alguns casos, chamadas de método excessivas podem ter um impacto significativo no desempenho.

Soa como a palavra tem o mesmo significado em todos esses exemplos (necessárias para executar a tarefa, mas nem sempre relacionada a fazê-lo diretamente)
RCIX

Re sobrecarga de memória da estrutura de dados: com a maioria dos alocadores de memória, é ainda pior do que isso. Cada valor retornado por mallocpossui uma sobrecarga interna de 8 bytes devido ao alocador (assumindo a máquina clássica de 32 bits) que consiste no tamanho do bloco mais os valores de guarda. E isso é antes de você pensar em granularidade de alocação. Uma lista isolada de números inteiros simples de 4 bytes terá, portanto, uma sobrecarga de 75%; matrizes são muito melhores (a menos que você precise de inserção rápida no meio) porque elas podem ter a sobrecarga uma vez (ou menos, se a matriz não for alocada dinamicamente).
Donal Fellows

19

Você está cansado e não pode mais trabalhar. Você come comida. A energia gasta procurando comida, recebendo e consumindo realmente consome energia e é sobrecarga!

A sobrecarga é algo desperdiçado para realizar uma tarefa. O objetivo é tornar as despesas gerais muito, muito pequenas.

Em ciência da computação, digamos que você queira imprimir um número, essa é sua tarefa. Mas armazenar o número, configurar o visor para imprimi-lo e chamar rotinas para imprimi-lo e acessar o número da variável estão todos sobrecarregados.


17

A Wikipedia nos cobriu :

Na ciência da computação, a sobrecarga geralmente é considerada qualquer combinação de tempo de computação em excesso ou indireto, memória, largura de banda ou outros recursos necessários para atingir um objetivo específico. É um caso especial de despesas gerais de engenharia.


4
Mas, se não, você consertaria o WikiPedia e faria o mesmo post aqui.
SamGoody

11

A sobrecarga normalmente se refere à quantidade de recursos extras (memória, processador, tempo etc.) que diferentes algoritmos de programação utilizam.

Por exemplo, a sobrecarga de inserção em uma Árvore Binária balanceada pode ser muito maior que a mesma inserção em uma Lista Vinculada simples (a inserção levará mais tempo, use mais poder de processamento para equilibrar a Árvore, o que resulta em um tempo de operação mais longo percebido por o usuário).


5

Para um programador, a sobrecarga refere-se aos recursos do sistema que são consumidos pelo seu código quando ele é executado em uma plataforma de doação em um determinado conjunto de dados de entrada. Geralmente, o termo é usado no contexto da comparação de diferentes implementações ou possíveis implementações.

Por exemplo, podemos dizer que uma abordagem específica pode resultar em sobrecarga considerável da CPU, enquanto outra pode gerar mais sobrecarga de memória e ainda outra ponderada na sobrecarga da rede (e implicar uma dependência externa, por exemplo).

Vamos dar um exemplo específico: Calcule a média (média aritmética) de um conjunto de números.

A abordagem óbvia é fazer um loop sobre as entradas, mantendo um total e uma contagem contínuos. Quando o último número é encontrado (sinalizado por EOF "final de arquivo", ou algum valor de sentinela, ou algum botão da GUI, o que seja), simplesmente dividimos o total pelo número de entradas e pronto.

Essa abordagem gera quase nenhuma sobrecarga em termos de CPU, memória ou outros recursos. (É uma tarefa trivial).

Outra abordagem possível é "ingerir" a entrada em uma lista. itere sobre a lista para calcular a soma e divida-a pelo número de itens válidos da lista.

Em comparação, essa abordagem pode gerar quantidades arbitrárias de sobrecarga de memória.

Em uma implementação ruim em particular, podemos executar a operação de soma usando recursão, mas sem eliminação de cauda. Agora, além da sobrecarga de memória da nossa lista, também estamos introduzindo a sobrecarga de pilha (que é um tipo diferente de memória e geralmente é um recurso mais limitado do que outras formas de memória).

Ainda outra abordagem (sem dúvida mais absurda) seria postar todas as entradas em alguma tabela SQL em um RDBMS. Em seguida, basta chamar a função SOMA SQL na coluna dessa tabela. Isso transfere nossa sobrecarga de memória local para outro servidor e incorre em sobrecarga de rede e dependências externas em nossa execução. (Observe que o servidor remoto pode ou não ter uma sobrecarga de memória específica associada a esta tarefa - pode transferir todos os valores imediatamente para o armazenamento, por exemplo).

Hipoteticamente, pode-se considerar uma implementação em algum tipo de cluster (possivelmente para viabilizar a média de trilhões de valores). Nesse caso, qualquer codificação e distribuição necessárias dos valores (mapeando-os para os nós) e a coleta / agrupamento dos resultados (redução) contariam como sobrecarga.

Também podemos falar sobre a sobrecarga incorrida por fatores além do código do próprio programador. Por exemplo, a compilação de algum código para processadores de 32 ou 64 bits pode acarretar uma sobrecarga maior do que se poderia ver em uma arquitetura antiga de 8 ou 16 bits. Isso pode envolver uma sobrecarga de memória maior (problemas de alinhamento) ou sobrecarga da CPU (onde a CPU é forçada a ajustar a ordem de bits ou usar instruções não alinhadas etc.) ou ambas.

Observe que o espaço em disco ocupado pelo seu código e suas bibliotecas, etc. geralmente não é chamado de "sobrecarga", mas é chamado de "pegada". Além disso, a memória base que seu programa consome (sem levar em consideração qualquer conjunto de dados que está sendo processado) também é chamada de "pegada".


3

A sobrecarga é simplesmente o maior consumo de tempo na execução do programa. Exemplo; quando chamamos uma função e seu controle é passado onde é definido e então seu corpo é executado, isso significa que fazemos com que nossa CPU execute um longo processo (primeiro passando o controle para outro lugar na memória e depois executando lá e depois passando o controle de volta à posição anterior) e, consequentemente, leva muito tempo de desempenho, daí a sobrecarga. Nossos objetivos são reduzir essa sobrecarga usando o inline durante a definição da função e o tempo de chamada, que copia o conteúdo da função na chamada de função, portanto, não passamos o controle para outro local, mas continuamos nosso programa em uma linha, portanto, inline .


2

Você poderia usar um dicionário. A definição é a mesma. Mas, para economizar tempo, o Overhead é um trabalho necessário para realizar o trabalho produtivo. Por exemplo, um algoritmo executa e executa um trabalho útil, mas requer memória para fazer seu trabalho. Essa alocação de memória leva tempo e não está diretamente relacionada ao trabalho que está sendo realizado; portanto, é uma sobrecarga.


1

Você pode conferir a Wikipedia . Mas principalmente quando mais ações ou recursos são usados. Por exemplo, se você estiver familiarizado com o .NET, poderá ter tipos de valor e tipos de referência. Os tipos de referência têm sobrecarga de memória, pois requerem mais memória que os tipos de valor.


1

Um exemplo concreto de sobrecarga é a diferença entre uma chamada de procedimento "local" e uma chamada de procedimento "remota".

Por exemplo, com o RPC clássico (e muitas outras estruturas remotas, como EJB), uma chamada de função ou método parece a mesma para um codificador, seja uma chamada de rede local, na memória ou distribuída.

Por exemplo:

service.function(param1, param2);

Esse é um método normal ou remoto? Pelo que você vê aqui, você não pode dizer.

Mas você pode imaginar que a diferença nos tempos de execução entre as duas chamadas é dramática.

Portanto, embora a implementação principal "custe o mesmo", a "sobrecarga" envolvida é bem diferente.


1

Pense na sobrecarga como o tempo necessário para gerenciar os threads e coordenar entre eles. É um fardo se o encadeamento não tiver tarefa suficiente para fazer. Nesse caso, o custo indireto excede o tempo economizado através do uso da segmentação e o código leva mais tempo que o seqüencial.


-2

é outra coisa senão os dados em si, ou seja, sinalizadores tcp, cabeçalhos, crc, fcs etc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.