Construído na biblioteca Scala lento?

8

Encontrei esta pergunta e aceitei a resposta no StackOverflow. Está relacionado ao analisador JSON lento na biblioteca Scala padrão.

O consenso é que a biblioteca JSON embutida é lenta e, nas palavras da DMC: "é assim, e é assim que é"

Talvez eu esteja apenas sendo ingênuo aqui, mas isso parece uma péssima abordagem para aumentar o idioma. Não devem os embutidos bibliotecas ser perfeito? Eles não precisam ser tudo para todos, e eu aceito que Scala é extensível. Mas, se houver uma biblioteca embutida, certamente ela deve ser sólida e tão rápida quanto a linguagem tem a oferecer.

Estou apresentando uma reclamação com o Star Command ;-)

Alguém sabe onde ou como um cara normal como eu pode expressar minha opinião sobre isso, ou seja, onde podemos ajudar a moldar a linguagem Scala?

Atualizar:

Esta questão não foi planejada de maneira negativa. Scala, seus criadores e a comunidade Scala é uma espécie de bondade. Fiquei surpreso ao ver que algo como o analisador JSON embutido estava longe de ser o ideal (de acordo com a pergunta no link fornecido)

Jack
fonte
Oh, como seria adorável se eu pudesse aceitar todas essas respostas inteligentes. Obrigado a todos.
Jack
Atualização: os combinadores do analisador foram divididos em um arquivo jar separado e o analisador JSON foi preterido.
soc 14/07

Respostas:

13

As bibliotecas internas devem ser perfeitas.

Em um mundo ideal, sim. Mas perfeito é o inimigo do bem. Qualquer criação real é sempre algum tipo de troca. Pode ser uma troca entre desempenho e flexibilidade, por exemplo. Ou desempenho versus esforço para escrever a biblioteca. Se for "bom o suficiente por enquanto" e houver problemas mais críticos para trabalhar, é melhor focar nesses problemas mais críticos. Otimizar apenas a velocidade geralmente é uma economia falsa.

Um ponto importante nas trocas de idioma / biblioteca / API é que alterar as interfaces posteriormente é difícil, porque geralmente quebra o código antigo criado na parte superior da interface. Mas a implementação (ou seja, velocidade) pode ser aprimorada posteriormente, portanto, inicialmente, você pode economizar, se ajudar a concentrar o esforço em obter a interface correta. A ordem de importância é:

  1. Interface. Sintaxe. Formatos de arquivo. Difícil de modificar após o lançamento. Deve se esforçar para acertar inicialmente.
  2. Estabilidade, correção. Obviamente, as coisas devem funcionar como deveriam. Mas se não, pode ser corrigido.
  3. Desempenho, velocidade. Às vezes crucial, na maioria das vezes não. Definitivamente pode ser melhorado mais tarde.

Alguém sabe onde ou como um cara normal como eu pode expressar minha opinião sobre isso, ou seja, onde podemos ajudar a moldar a linguagem Scala?

Eu acho que a palavra-chave aqui é "gargalo". Se você tiver um caso de uso real em que o desempenho da biblioteca JSON é o gargalo, poderá apresentar o problema na lista de correspondência Scala. Se você pode melhorá-lo, é bom, mas se alguém deve melhorá-lo, deve haver pelo menos uma necessidade genuína.

Joonas Pulakka
fonte
+1 para perfeito é o inimigo do bem. Ao me lembrar o que eu já sei, você me salvou algumas horas. Obrigado
Jack
9

O analisador JSON que acompanha a biblioteca padrão é baseado nos combinadores do analisador. Os combinadores de analisadores permitem criar analisadores fáceis de entender e modificar, e o fazem muito rapidamente. A gramática inteira para JSON é definida nas linhas 134 a 140 aqui . Se você der uma olhada no Lift JSON , não poderá nem escolher um grupo de linhas como representando a gramática.

No entanto, os combinadores de analisadores - pelo menos a biblioteca Scala (Haskell também os possui) - são lentos. Talvez o analisador de packrat introduzido no Scala 2.8 tenha um desempenho melhor, mas esse analisador JSON é muito mais antigo e, se eu entendi direito, foi criado principalmente como exemplo.

Agora, o Scala deve apenas disponibilizar bibliotecas perfeitas? Bem, dados os recursos restritos disponíveis, a alternativa não é nenhuma biblioteca JSON. Hoje, isso seria bom - afinal existem muitas alternativas. Mas na época em que o JSON foi adicionado à biblioteca, e antes que a ampla adoção do JSON o tornasse crítico para o desempenho, era algo bom de se ter.

Daniel C. Sobral
fonte
+1 Resposta sólida como sempre D. Obrigado pelo link para a fonte JSON.
6122 Jack
3

Se os criadores do Scala não lançassem nenhum código até que ele estivesse perfeitamente otimizado para obter o melhor desempenho, o Scala provavelmente estaria na versão 0.1, não na 2.9.

Praticamente todos os novos idiomas apresentam problemas de desempenho inicialmente . Pense novamente no Java 1 (se você tiver alguma experiência com ele). Isso ocorre porque, inicialmente, os criadores se concentram mais nos recursos e interfaces da linguagem do que nos detalhes da implementação, e é razoável assim. Ninguém pode prever como (e se) uma linguagem e suas bibliotecas de classes serão usadas no futuro (além dos casos triviais, como a biblioteca de strings, etc.). Portanto, é melhor otimizar apenas quando houver uma necessidade real e urgente, do que gastar tempo otimizando um pedaço de código que na verdade não fará nenhuma diferença visível na vida dos desenvolvedores.

Além disso, o Scala é especial por ser construído sobre a JVM, portanto, todas as bibliotecas Java existentes estão diretamente disponíveis a partir dela. Se você preferir desempenho ao invés da pureza da linguagem, sempre poderá escolher e usar uma classe / biblioteca Java adequada.

Péter Török
fonte
2

Seu software de código aberto. Então, em comparação com o software proprietário, os autores tendem a ser mais sinceros sobre quaisquer falhas. Também não há pretensão de que você tenha outra maneira de influenciar o desenvolvimento além de solicitações educadas ou escrevendo as melhorias e enviando respeitosamente o código aprimorado para inclusão na liberação geral.

Dada a natureza do Scala e o nicho que ele ocupa (processamento paralelo em larga escala), os desenvolvedores provavelmente estão certos em dar prioridade ao desempenho interno do código que pode ser executado milhares de vezes para uma única solicitação versus um analisador JSON que será executado apenas uma vez por solicitação.

James Anderson
fonte
"Então, em comparação com o software proprietário, os autores tendem a ser mais sinceros sobre qualquer falha.": Eu não consideraria isso uma regra, por exemplo, o Windows 95 era muito instável e a Microsoft era muito sincera sobre isso (o Windows só ficou realmente estável com o Windows XP, ou seja, muitos anos depois).
Giorgio
Ah, os bons velhos tempos - a MS não ouve mais, considere o fiasco do botão Iniciar do Windows 8.
James Anderson
Se você tem o monopólio, não precisa ouvir muito: são seus clientes que devem ouvi-lo.
Giorgio
2

Dada a abundância de analisadores JSON de código aberto rápidos para a JVM, esse parece um exemplo perfeito de não inventado aqui . Um recurso interno com magnitudes mais lentas do que as implementações já existentes é uma indicação de que os criadores da linguagem não se importam muito com o uso no mundo real, pelo menos no que diz respeito a esse recurso.

user281377
fonte
0

Então conserte. É assim que o código aberto funciona, cara. Você está com coceira, coça. Você sabe que pode executar analisadores Java JSON no Scala, certo?

SnoopDougieDoug
fonte