Pergunta

Eu tenho bateu em cima deste problema sobre se deve usar bignums na minha língua como um tipo de dados padrão quando há números envolvidos. Eu já avaliou este mim e reduziu a um -Pergunta desempenho vs. comodidade e conforto. A resposta a essa pergunta depende sobre quão grande o impacto no desempenho é em programas que não estão sendo otimizadas.

Como pequena é a sobrecarga de usar bignums em lugares onde um fixnum ou inteiro iria bastara? Quão pequeno ele pode estar em melhores implementações? Que tipo de implementações atingir o menor sobrecarga e que tipo de compensações adicionais que resultam em?

Que tipo de hit posso esperar para os resultados no desempenho geral do idioma, se eu vou colocar minha língua dar calote em bignums?

Foi útil?

Solução

Para ser honesto, a melhor resposta é "tentar e ver".

Claramente bignums pode não ser tão eficiente como tipos nativos, que normalmente se encaixam em um cadastro único CPU, mas cada aplicação é diferente -. Se o seu não fazer toda uma carga de aritmética inteira, em seguida, a sobrecarga poderia ser insignificante

Outras dicas

Você pode, talvez, olhar como Lisp faz. É quase sempre fará o exatamente direito coisa e implicitamente converter os tipos, uma vez que se torna necessário. Tem Fixnums (inteiros "normal"), bignums, rácios (fracções apropriadas reduzidas representada como um conjunto de dois inteiros) e os flutuadores (em tamanhos diferentes). Somente carros alegóricos ter um erro de precisão, e eles são contagiosas, ou seja, uma vez por cálculo envolve um float, o resultado é um float, também. "Lisp Prática Comum" tem uma boa descrição desse comportamento.

Venha para pensar sobre isso ... Eu não acho que ele terá muito sucessos de desempenho em tudo.

Porque bignums por natureza, terá um muito grande base, digamos, uma base de 65536 ou maior para que normalmente é um valor máximo possível para fixnum e inteiros tradicional.

Eu não sei o quão grande você deve definir a base do bignum ser, mas se você defini-lo suficientemente grande o suficiente para que, quando ele é usado no lugar de Fixnums e / ou inteiros, seria nunca excede seu primeiro bignum dígitos assim, a operação será quase idêntica à Fixnums normais / int.

Isso abre uma oportunidade para otimizações onde por um bignum que nunca cresce ao longo do seu primeiro bignum dígitos, você poderia substituí-los com operação super-rápido de um bignum dígitos.

E, em seguida, passar a algoritmos n dígitos quando a segunda bignum dígitos é necessário.

Esta poderia ser implementado com uma bandeira bit e uma operação de validação em todas as operações aritméticas, cerca de pensar, você poderia usar o bit de mais alta ordem para significar bignum, se um bloco de dados tem o seu conjunto de bits de mais alta ordem a 0, em seguida, processá-los como se fossem normais Fixnum / ints mas se for definida como 1, em seguida, analisar o bloco como uma estrutura bignum e algoritmos uso bignum a partir daí.

Isso deve evitar acessos de desempenho de variáveis ??iteradoras loop simples que eu acho que é a primeira fonte possível de visitas de desempenho.

É apenas o meu pensamento rústica embora, uma sugestão, uma vez que você deve saber melhor do que eu: -)

P.S. desculpe, esqueci o que os termos técnicos de bignum dígitos e bignum base foram

sua redução é correta, mas a escolha depende das características de desempenho do seu idioma, que não podemos possivelmente saber !

Depois de ter sua linguagem implementada, você pode medir a diferença de desempenho e, talvez, oferecer ao programador uma directiva para escolher o padrão

Você nunca vai saber o impacto no desempenho real até que você crie o seu próprio parâmetro de referência como os resultados irão variar por idioma, por revisão linguagem e por CPU e. Não há nenhuma maneira independente de linguagem para medir isso, exceto para o fato óbvio de que um 32bit inteiro usos o dobro da memória de um número inteiro de 16 bits.

Como pequena é a sobrecarga de usar bignums em lugares onde um fixnum ou inteiro iria bastara? Mostrar pequena lata que estar em melhores implementações?

A má notícia é que, mesmo no melhor implementação de software possível, bignum vai ser mais lento do que os arithmetics embutidas por ordens de magnitude (tudo isto é, de fator de 10 até fator de 1000).

Eu não tenho números exatos, mas eu não acho que os números exatos vai ajudar muito em tal situação: Se você precisar de grandes números, usá-los. Se não, não. Se os seus usos da linguagem eles por padrão (o idioma que faz? Algumas linguagens dinâmicas fazer ...), acho que se a desvantagem de mudar para outra língua é compensado pelo ganho de desempenho (o que raramente deve ser).

(que poderia aproximadamente ser traduzido para:. Há uma enorme diferença, mas não deve importar Se (e somente se) é importante, usar outra língua porque mesmo com a melhor execução possível, este linguagem, evidentemente, não é adequado para a tarefa.)

I totalmente dúvida de que seria vale a pena, a menos que seja de domínio específico muito.

A primeira coisa que vem à mente são todos os pouco para loops ao longo de programas , são os pequenos iteradoras variáveis ??todos vai ser bignums? Isso é assustador!

Mas se o seu idioma é bastante funcional ... então talvez não.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top