Layout de memória em Javascript - design orientado a dados versus design orientado a objetos [fechado]

StackOverflow https://stackoverflow.com//questions/25041236

Pergunta

Vindo de uma experiência em C/C++, o layout de memória de objetos no que diz respeito à redução de perdas de cache é algo crucial, especialmente quando se trabalha em consoles.O design orientado a dados é frequentemente preferido ao design orientado a objetos, para ajudar a manter objetos relacionados próximos uns dos outros na memória (especialmente em áreas críticas de desempenho).

Recentemente, tenho desenvolvido algum desenvolvimento em Javascript e estou me perguntando qual é o consenso geral dentro da comunidade Javascript.

Com minha experiência limitada em Javascript, muitas vezes fico surpreso ao ver resultados completamente inesperados durante a criação de perfil.O layout da memória interna e a implementação de objetos/estruturas Javascript variam tanto de navegador para navegador que me pergunto se vale a pena o esforço de tentar otimizar.

Criei um caso de teste simples (http://jsperf.com/object-vs-data) no jsPerf para comparar o desempenho dos dois métodos e, embora mostre ganhos de desempenho no Chrome, não há aceleração perceptível no Safari.

Em Javascript, devo me preocupar com o layout da memória dos objetos?Ou é mais do tipo 'implementar de uma maneira e depois otimizar se necessário'?

Esta segunda opção parece um desperdício (em termos de tempo de desenvolvimento), especialmente se houver alguma boa orientação a seguir.

Obrigado ~

Informação complementar:É basicamente assim que eu implementaria as duas abordagens em Javascript.O caso de teste jsPerf acima é implementado assim.

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
Foi útil?

Solução

Você está trabalhando com a suposição fundamental de que objetos em Javascript funcionam como em C++.Eles não.

Em C++, o objetivo principal de um tipo é atuar como uma “lente” sobre um pedaço de memória.O layout da classe define diretamente o conteúdo da memória que o objeto descreve, de forma bem definida.Matrizes C/C++ exigem especificamente um layout linear e contínuo de tipos homogêneos.

Em JavaScript, um objeto é uma coleção de pares nome/valor.Um array é apenas um objeto com uma propriedade especial de “comprimento”.Observe que NÃO há descrição ou definição de layout de memória aqui.Não há nada que impeça um interpretador Javascript de implementar arrays como uma tabela hash em vez de um pedaço linear de memória;na verdade, tenho certeza de que são implementações JS que fazem exatamente isso.

As implementações de JavaScript são livres para organizar a memória da maneira que desejarem e não há correspondência entre o que você faz no código-fonte e o que realmente acaba na máquina.

Além disso, os arrays JavaScript são heterogêneos, não homogêneos.Ou seja, assumindo que foi disposto em memória contígua, seu tipo equivalente em C seria JSObject **, não int ** (ou float ** ou qualquer outro).Um array JS é uma coleção de referências a dados armazenados em outro lugar, portanto, mesmo que as referências estivessem na sua linha de cache, seus dados não estarão.

Então, em resumo – esse tipo de pensamento não lhe trará nada além de dor.JavaScript é uma linguagem de nível muito superior ao C++, e parte disso é abrir mão do controle com o qual você está acostumado.Esse tipo de otimização de baixo nível, se possível, será feita pelo intérprete.Concentre-se em escrever código com algoritmos eficientes que expressem naturalmente sua solução;isso já é bastante difícil.:-)

Outras dicas

OK.Brinquei com alguns números e casos de teste.

Primeiramente criei este caso de teste http://jsperf.com/object-vs-array-creation-for-soNeste caso, criar Object é muito mais rápido então criando um Array

Em segundo lugar, criei este caso de teste http://jsperf.com/accessing-speedNisso, quase não havia diferença entre eles.

Então, o que deduzo desse perfil é que usar mais objetos do que arrays será mais rápido se o projeto for realmente enorme..pois, desde o primeiro caso, fica claro que a criação de objetos é mais rápida que a criação de arrays.

Mas..

Javascript é uma linguagem altamente desenvolvida e de alto desempenho e você não deve se preocupar com essas micro-otimizações.Tudo que você deve focar é no semântica.Você deve escolher a estrutura que melhor descreve sua intenção.

Teste no Chrome 36.0.1985.125 no Windows NT 6.3

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