2012-07-31 19 views
8

He estado buscando en las diferentes bibliotecas de registro Scala últimamente, y la gran mayoría de ellos ejecutar sus funciones de registro comorendimiento en las bibliotecas de registro Scala llamada por valor vs llamada por nombre

def debug(s: => String) 

De modo que si tiene el registro de depuración desactivado, no ejecutará la declaración. Sin embargo, me encontré con logula que establezca específicamente como uno de sus beneficios

A diferencia de una gran cantidad de bibliotecas registro de Scala, Logula no utiliza pase por nombre de la semántica (por ejemplo, f: => A) por sus declaraciones de registro, lo que significa dos cosas:

  • El compilador Scala no tiene que crear una sola vez los objetos de cierre para cada declaración de registro. Esto debería reducir la cantidad de basura presión de la colección.

que en realidad hace total sentido para mí. Entonces, mi pregunta es, ¿hay algún punto de referencia/datos de rendimiento del mundo real que compare los 2 enfoques? ¿Idealmente algo de un proyecto en vivo versus puntos de referencia artificiales?

Respuesta

8

Que es más rápido depende completamente de los casos de uso. Si está registrando cadenas estáticas, entonces es más rápido pasar esa cadena constante e ignorarla. De lo contrario, si está creando cadenas, debe crear al menos un objeto de todos modos. Los objetos de función son pequeños y baratos: es mejor crear uno de esos que la cadena si va a ignorarlo.

Personalmente, creo que este tipo de comprensión de los principios básicos de las compensaciones es aún más valioso que un caso de estudio de una aplicación particular que puede haber usado una u otra, porque le permite entender por qué elegiría uno o el otro (y usted siempre querrá comparar su propia aplicación).

(Nota: lo caro creación de objetos es depende de cómo fuertemente impactado es el recolector de basura, en general, objetos de corta duración puede ser creado y desecharse a una velocidad de en el orden de 10 por segundo, que no debería ser una preocupación, excepto en bucles interiores apretados. Si está poniendo declaraciones de registro en bucles interiores apretados, creo que algo está mal. Debería escribir pruebas de unidad para eso en su lugar.)

+1

'Personalmente, creo que este tipo de comprensión de los principios básicos de las concesiones es aún más valioso que un estudio de caso de una aplicación en particular. Aunque definitivamente estoy de acuerdo con el principio aquí, la realidad puede ser una bestia completamente diferente a la tuya prever. Es por eso que estoy buscando casos de la vida real en lugar de puntos de referencia, porque cualquiera puede escribir un punto de referencia que hace que una forma parezca un millón de veces más rápida. Principalmente por mi propia curiosidad, porque, sinceramente, ¿qué aplicación está registrando realmente el cuello de botella? – Falmarri

+0

@Falmarri - Puede ser diferente de lo que esperas _especialmente_ si piensas en ejemplos. Es por eso que expliqué las desventajas fundamentales. Estoy de acuerdo en que la registración no debería ser el cuello de botella en la mayoría de las aplicaciones. –

+0

@Falmarri Bueno ... ¿Mides todo? Hay personas que juran al medir cada paso de su aplicación, incluido el tamaño de la cola, el rendimiento y el tiempo de respuesta.Si realiza esa ruta, no desea que su registro se agregue al tiempo total. De hecho, quieres que sea asincrónico. –

3

Saldré en una extremidad y decir que las discusiones filosóficas sobre las concesiones son más útiles cuando hay una compensación interesante que se hará, es decir, no aquí.

class A { 
    var debugging = true 
    @inline final def debug(msg: => String) = if (debugging) println(msg) 

    def f = { debug("I'm debugging!") ; 5 } 
} 
% scalac292 -optimise a.scala 
% ls -l *.class 
-rw-r--r-- 1 paulp staff 1503 Jul 31 22:40 A.class 
% 

Contar los objetos de cierre.

+1

¡Muy bueno saber! Aunque puede ser más difícil lograr la elisión si está tratando de usar el método de registro de una biblioteca externa para hacer el registro ... pero esto solo argumenta que debe tener su propia '' desinfección de defina final en línea 'envolviendo la llamada de la biblioteca en esos lugares que lo necesitas. –

Cuestiones relacionadas