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?
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?
Respostas:
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".
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:
malloc
possui 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).
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.
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.
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).
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".
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 .
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.
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.
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.
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.
é outra coisa senão os dados em si, ou seja, sinalizadores tcp, cabeçalhos, crc, fcs etc.