2011-04-03 6 views
11

¿cuál prefiere? (Por supuesto getSize no tiene ningún conteo complicado, que acaban de volver valor de miembro)llamadas repetidas - práctica de codificación

void method1(Object & o) 
{ 
    int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

o

void method2(Object & o) 
{ 
    someAction(o.getSize()); 
    someOtherAction(o.getSize()); 
} 

Sé que puedo medir cuál es el más rápido, pero quiero algunos comentarios ... No simplemente ejecutando el tiempo relacionado ... ej. si prefieres el método2, ¿cuántas veces utilizas o.getSize y cuál es el número que te hace usar method1 way? ¿Alguna de las mejores prácticas? (imagina incluso tipos diferentes, entonces int) TY

+5

Si tuviera que usar method1, usaría un const int para indicar que no estoy cambiando el valor a través de la función. – Kleist

Respuesta

10

Me decantaría por el método 1 no solo porque es probablemente un poco más rápido, sino principalmente porque significa que no tengo que preocuparme si el método llamado tiene algún efecto secundario.

Además, si esto se llama en un programa multiproceso, esto asegura que siempre estoy usando mi valor de tamaño; de lo contrario, podría haber cambiado entre las dos llamadas. Por supuesto, puede haber casos donde explícitamente quiera notar ese cambio, en cuyo caso use el método 2.

(y sí, por otras respuestas, haga size a const int para asegurarse de que no se modifique si se pasa por referencia a algo más).

0

Llamar repetidamente a cualquier función cuando el resultado no cambia es un desperdicio, así que siempre elegiría el primer método.

1

Preferiría el primer enfoque. Llamar a una función repetidamente no me parece bien, especialmente si el valor devuelto es el mismo cada vez. El primer enfoque también evita la sobrecarga de llamar a una función repetidamente.

1

Cuando llamo a una función que devuelve algo varias veces (más de 2 ó 3 veces), generalmente guardo el valor devuelto en una variable local. Eso es porque aprecio la velocidad del programa más que el ahorro de memoria. No es que la memoria no sea importante. Solo depende de las situaciones. Llamar a una función que no requiere mucho tiempo para ejecutarla no consume mucho tiempo, pero una función con varios ciclos invocados un gran número de veces enviaría a su programa a largas esperas.

+0

Es un hábito desarrollarse, porque de lo contrario perderá un desperdicio evidente de tiempo de computación, porque nunca lo piensa. p.ej.llamando a sqrt (myvar) 3 veces, porque lo necesita 3 veces en su fórmula –

1

El primero eliminará las llamadas innecesarias a una función, por lo tanto prefiero method1() ya que el código también se ve un poco más limpio.

Sin embargo, debe tener en cuenta que, según el contexto, pueden producir resultados diferentes. Digamos que si el tamaño cambia en alguna Acción() y usa el valor almacenado en la variable de tamaño, es posible que no obtenga el resultado deseado.

9

Puesto que usted no desea size a cambiar cuando se llama someAction() o someOtherAction() (ya que no puede cuando es el valor de retorno de una función), considere:

void method3(const Object& o) 
{ 
    const int size = o.getSize(); 

    someAction(size); 
    someOtherAction(size); 
} 

getSize() puede ser simple, o se puede estar haciendo un cálculo costoso. Además, el tamaño de o puede cambiarse por otro hilo entre sus llamadas a someAction() y someOtherAction().

+1

Y a medida que pasa el tiempo, la función getSize() puede volverse más complicada. –

+1

o una referencia constante si no es un tipo de POD. –

+0

'o' debería ser un' const & ', sí. 'size' debe ser' const', incluso si no es POD, ya que no queremos que cambie entre llamadas a 'someAction()' y 'someOtherAction()'. – Johnsyweb

Cuestiones relacionadas