2010-11-24 13 views
5

Me pregunto acerca de la eficiencia computacional. Voy a usar Java en este ejemplo, pero es una pregunta informática general. Digamos que tengo una cadena y quiero obtener el valor de la primera letra de la cadena, como una cadena. Por lo que puedo hacerEficiencia de la computación Pregunta

String firstletter = String.valueOf(somestring.toCharArray()[0]); 

O podría hacer:

char[] stringaschar = somestring.toCharArray(); 
char firstchar = stringaschar[0]; 
String firstletter = String.valueOf(firstchar); 

Mi pregunta es, son las dos formas esencialmente el mismo, computacionalmente? Quiero decir, la segunda forma en que explícitamente tuve que crear 2 variables intermedias, para almacenarlas en la memoria (¿la pila?) Temporalmente. Pero la primera manera, también, la computadora tendrá que crear las mismas variables, implícitamente, ¿verdad? Y el número de operaciones no cambia. Mi pensamiento es que las dos formas son iguales. Pero me gustaría saberlo con certeza.

+1

Por supuesto, si esta es una pregunta práctica, para eso sirve 'String.charAt (int)'. – Actorclavilis

Respuesta

1

Las respuestas anteriores son coincidentes y correctas, AFAIK.

Sin embargo,, creo que hay algunas consideraciones adicionales y generales que debe tener en cuenta cada vez que se pregunte acerca de la eficiencia de cualquier activo computacional (código, por ejemplo).

En primer lugar, si todo está bajo su estricto control, en principio podría contar los ciclos de reloj uno por uno desde el código de ensamblaje. O a partir de un razonamiento más abstracto, encuentre el costo computacional de una operación/algoritmo.

Hasta ahora todo bien. Pero no se olvide de medida después. Puede encontrar que medir los tiempos de ejecución no es tan fácil y sencillo, y algunas veces es difícil de alcanzar (Cómo contabilizar interrupciones, espera de E/S, cuellos de botella de red ...). Pero vale la pena Pides aquí un consejo, pero TU compilador/intérprete/generador de código P/Lo que sea que se pueda configurar con ese interruptor en la tercera capa de tus scripts de configuración.

La otra consideración, más a su punto actual es la existencia de Black Boxes. No estás solo en el mundo y Black Box es cualquier pieza utilizada para ejecutar tu código, que está fuera de tu control. Los compiladores, los sistemas operativos, las redes, los sistemas de almacenamiento y el mundo en general entran en esta categoría.

Lo que hacemos con Black Boxes (son negras, ya sea porque su código no es público o porque usamos nuestra pesca en tiempo libre en lugar de cavar el código fuente de la biblioteca) está estableciendo modelos mentales para ayudarnos a entender cómo trabajo. (Por cierto, This es un libro extraordinario sobre cómo los humanos forjamos nuestros modelos mentales). Pero siempre debe tener cuidado de que son modelos, no es el caso real. Los modelos nos ayudan a explicar las cosas ... hasta cierto punto.La Mecánica clásica reinó hasta que la Relatividad y la Mecánica Cuántica fluyeron. Ninguno de ellos está mal Tienen límites, y también lo tienen todos nuestros modelos.

Incluso si es amigo del sistema operativo del enrutador o de su kernel de Linux cuando enfrenta un problema de eficiencia, diseñe un buen experimento y mida.

HTH!

NB: Por diseñe un buen experimento Quiero decir, tenga cuidado con los pozos de alquitrán. Ejemplos: medir tu código de medición en lugar del objetivo del experimento, ser influenciado por factores externos, olvidar los factores externos que influirán en el código de producción, probar con datos cuya cardinalidad, ortogonalidad o cualquier otra cosa sea diferente al "mundo real", mapear erróneamente la producción y las pruebas de los caballos de batalla cliente/servidor, et c, et c, et c.

Vaya, y mida su código. Tus resultados serán lo más interesante en esta página.

4

En la mayoría de los casos, las dos formas deben producir el mismo código de objeto, o casi el mismo. La optimización de compiladores generalmente detecta que las variables intermedias en la segunda opción no son necesarias para obtener el resultado correcto, y colapsará el gráfico de llamadas en consecuencia.

+0

+1 para el gráfico de llamadas. – Fred

2

Todo esto depende de cómo el intérprete de Java decide traducir el código a un lenguaje intermedio para la ejecución del tiempo de ejecución. En realidad, puede tener optimizaciones que traducen los dos enfoques para ser el mismo código de bytes exacto.

+1

No recuerdo si hay una herramienta Java para inspeccionar el código de bytes compilados; sé que existe en C#. –

+0

por supuesto, hay http://www.google.com.vn/search?q=java+bytecode+viewe – phunehehe

2

Los dos deberían ser esencialmente iguales. En ambos casos, realiza las mismas llamadas convirtiendo la cadena en una matriz, buscando el primer carácter y obteniendo el valor del carácter. Puede haber diferencias menores en la forma en que el compilador las maneja, pero deben ser insignificantes.

Cuestiones relacionadas