Construido en la biblioteca Scala lento?

8

Encontré esta pregunta y acepté la respuesta en StackOverflow. Está relacionado con el lento analizador JSON en la biblioteca estándar de Scala.

El consenso, por así decirlo, es que la biblioteca JSON incorporada es lenta y, en palabras de DMC: "es así, y así son las cosas".

Tal vez solo estoy siendo ingenuo aquí, pero eso parece un mal enfoque para hacer crecer el idioma. ¿No deberían ser perfectas las bibliotecas integradas ? No tienen que ser todo para todos, y acepto que Scala es extensible. Pero, si hay una biblioteca incorporada, entonces seguramente debería ser sólida como una roca y tan rápida como el lenguaje tiene para ofrecer.

Estoy presentando una queja con Star Command ;-)

¿Alguien sabe dónde o cómo un tipo normal como yo puede expresar mi opinión sobre esto, es decir, dónde podemos ir para ayudar a dar forma al lenguaje Scala?

Actualizar:

Esta pregunta no fue pensada de ninguna manera negativa. Scala, son creadores y la comunidad Scala está llena de bondad. Simplemente me sorprendió ver que algo así como el analizador JSON incorporado estaba lejos de ser óptimo (según la pregunta en el enlace proporcionado)

Jack
fuente
Oh, qué lindo sería si pudiera aceptar todas estas respuestas inteligentes. Gracias a todos.
Jack
Actualización: los combinadores del analizador se han dividido en un archivo jar separado y el analizador JSON ha quedado en desuso.
soc

Respuestas:

13

Las bibliotecas integradas deberían ser perfectas.

En un mundo ideal, sí. Pero lo perfecto es enemigo de lo bueno. Cualquier creación real es siempre una especie de compensación. Puede ser una compensación entre rendimiento y flexibilidad, por ejemplo. O rendimiento versus el esfuerzo de escribir la biblioteca. Si es "lo suficientemente bueno por ahora" y hay problemas más críticos para trabajar, entonces es mejor enfocarse en esos problemas más críticos. La optimización solo para la velocidad suele ser una falsa economía.

Un punto importante en las compensaciones de lenguaje / biblioteca / API es que cambiar las interfaces más adelante es difícil porque generalmente rompe el código antiguo construido en la parte superior de la interfaz. Pero la implementación (es decir, la velocidad) se puede mejorar más adelante, por lo que inicialmente puede escatimar en ella, si ayuda a centrar el esfuerzo en obtener la interfaz correcta. El orden de importancia es:

  1. Interfaz. Sintaxis. Formatos de archivo. Difícil de modificar después del lanzamiento. Debe esforzarse por acertar inicialmente.
  2. Estabilidad, corrección. Por supuesto, las cosas deberían funcionar como se supone que deben hacerlo. Pero si no, se puede arreglar.
  3. Rendimiento, velocidad. A veces crucial, la mayoría de las veces no. Definitivamente se puede mejorar más adelante.

¿Alguien sabe dónde o cómo un tipo normal como yo puede expresar mi opinión sobre esto, es decir, dónde podemos ir para ayudar a dar forma al lenguaje Scala?

Creo que la palabra clave aquí es "cuello de botella". Si tiene un caso de uso real donde el rendimiento de la biblioteca JSON es el cuello de botella, entonces podría plantear el problema en la lista de correo de Scala. Si puede mejorarlo usted mismo, bien, pero si se supone que alguien más debe mejorarlo, al menos debe existir una verdadera necesidad.

Joonas Pulakka
fuente
+1 para perfecto es el enemigo del bien. Al recordarme lo que ya sé, me acabas de salvar un par de horas. Gracias
Jack
9

El analizador JSON que viene con la biblioteca estándar se basa en los combinadores del analizador. Los combinadores del analizador permiten crear analizadores que son fáciles de entender y modificar, y lo hacen muy rápidamente. La gramática completa para JSON se define en las líneas 134 a 140 aquí . Si echas un vistazo a Lift JSON , ni siquiera puedes elegir un grupo de líneas que representen la gramática.

Sin embargo, los combinadores de analizador sintáctico, al menos la biblioteca Scala (Haskell también los tiene), son lentos. Tal vez el analizador Packrat presentado en Scala 2.8 funcionaría mejor, pero ese analizador JSON es mucho más antiguo y, si tengo mis datos claros, se creó principalmente como un ejemplo.

Ahora, ¿debería Scala solo hacer disponibles bibliotecas perfectas? Bueno, dados los recursos limitados disponibles, la alternativa es no tener una biblioteca JSON. Hoy, eso estaría bien, después de todo, hay muchas alternativas. Pero en el momento en que JSON se agregó a la biblioteca, y antes de que la adopción generalizada de JSON lo hiciera crítico para el rendimiento, era algo agradable de tener.

Daniel C. Sobral
fuente
+1 Respuesta sólida como siempre D. Gracias por el enlace a la fuente JSON.
Jack
3

Si los creadores de Scala no lanzaran ningún código hasta que esté perfectamente optimizado para un rendimiento superior, Scala probablemente estaría en la versión 0.1, no en la 2.9.

Prácticamente todos los idiomas nuevos tienen problemas de rendimiento inicialmente . Piense en Java 1 (si tiene alguna experiencia con él). Esto se debe a que inicialmente, los creadores se centran más en las características e interfaces del lenguaje que en los detalles de implementación, y es razonable de esta manera. Nadie puede predecir cómo (y si) un lenguaje y sus bibliotecas de clases se utilizarán en el futuro (aparte de los casos triviales como la biblioteca de cadenas, etc.). Por lo tanto, es mejor optimizar solo cuando hay una necesidad apremiante de ello, que dedicar tiempo a optimizar un fragmento de código que en realidad no hará ninguna diferencia visible en la vida de los desarrolladores.

Además, Scala es especial porque está construido sobre la JVM, por lo que todas las bibliotecas Java existentes están disponibles directamente desde él. Si prefiere el rendimiento sobre la pureza del lenguaje, siempre puede elegir y usar una clase / biblioteca Java adecuada.

Péter Török
fuente
2

Su software de código abierto. Entonces, en comparación con el software propietario, los autores tienden a ser más sinceros sobre cualquier falla. Tampoco hay pretensiones de que tiene alguna forma de influir en el desarrollo que no sean solicitudes educadas o escribir las mejoras usted mismo y enviar respetuosamente el código mejorado para su inclusión en la versión general.

Dada la naturaleza de Scala y el nicho que ocupa (procesamiento paralelo a gran escala), los desarrolladores probablemente tengan razón al dar prioridad al rendimiento interno del código que puede ejecutarse varias miles de veces para una sola solicitud frente a un analizador JSON que se ejecutará solo una vez por solicitud

James Anderson
fuente
"Entonces, en comparación con el software patentado, los autores tienden a ser más sinceros acerca de cualquier falla". XP, es decir, muchos años después).
Giorgio
Ah, los viejos tiempos: MS ya no escucha, solo considere el fiasco del botón de inicio de Windows 8.
James Anderson
Si tiene el monopolio, no necesita escuchar demasiado: son sus clientes los que deben escucharlo.
Giorgio
2

Dada la abundancia de analizadores rápidos JSON de código abierto para la JVM, este parece un ejemplo perfecto de no inventado aquí . Una característica incorporada que es de magnitud más lenta que las implementaciones ya existentes es una indicación de que los creadores del lenguaje no se preocupan demasiado por el uso en el mundo real, al menos en lo que respecta a esta característica.

usuario281377
fuente
0

Así que arréglalo. Así es como funciona el código abierto, mi hombre. Tienes picazón, te rascas. Sabes que puedes ejecutar analizadores Java JSON en Scala, ¿verdad?

SnoopDougieDoug
fuente