2010-12-28 8 views
7

Mi jefe acaba de decirme que aprendió sobre los rápidos algoritmos VB6 de un libro y que la forma más corta de escribir cosas no es necesariamente la más rápida (por ejemplo, los métodos integrados a veces son mucho más lentos que los autoescritos, ya que hacen todo tipo de conversiones de comprobación o unicode que podrían no ser necesarias en su caso).Velocidad de construcciones diferentes en lenguajes de programación (Java/C#/C++/Python/...)

Ahora me pregunto, ¿hay un sitio web con información sobre construcciones rápidas diferentes en varios idiomas, esp. Java/C#/Python/... (también C++ pero hay tantos compiladores que probablemente difieren mucho).

E.g. ¿hay una diferencia entre

if (a()) b(); 

y

a() && b(); 

Otro ejemplo: se a = a * 4 tal vez compilado para el mismo código que a <<= 2?

Podría probar esto yo mismo, por supuesto, escribir ambos, ejecutarlos 100000 veces y comparar el tiempo de ejecución, pero también me gustaría aprender nuevas formas de escribir cosas, tal vez incluso cosas que no había considerado antes. . ¡Gracias por tus respuestas!

+3

a menos que esté trabajando en un tipo de hardware muy especial (como una pequeña tarjeta inteligente Java incorporada) o algoritmos muy especiales (como, por ejemplo, API criptográficas) no tiene mucho sentido preocuparse por esto. – SyntaxT3rr0r

+5

Además de las respuestas hasta ahora: La forma más limpia, más corta y más fácil de escribir ES la mejor manera de escribir, a pesar de cualquier diferencia de rendimiento hipotética, a menos que tenga características de rendimiento realmente horribles (por ejemplo, el ingenuo sistema de navegación rápida en Haskell) , que hace montones y montones de concatenaciones de listas). – delnan

+4

Hay mucho más en un lenguaje que el álgebra booleana y las construcciones básicas de decisión. El marco para .NET 4 es lo suficientemente aterrador, mucho menos comparado con otros 2-3. ¿Estás hablando de C++ administrado o no? jajaja, la gente escribe esto, no las máquinas. Tendría la suerte de encontrar la documentación correcta, y mucho menos los cuadros cruzados Big-O. Bienvenido a la realidad amigo mío. –

Respuesta

9

¿hay una diferencia entre if (a()) b(); y a() && b();?

Sí, legibilidad. El primero es mucho más claro sobre la intención.

¿Se compila a = a * 4 con el mismo código que a <<= 2?

Probablemente sí. Pero incluso si terminaran como diferentes instrucciones de la CPU, la diferencia de tiempo sería muy pequeña y dependería de las instrucciones anteriores y posteriores.

Micro-Optimización de la CPU moderna es de

  • sobre todo inútil
  • muy difícil
  • menudo al contrario de lo que solía ser una 'optimización' hace 5 o 10 años.

En conclusión, escriba legible código primero. Cuando tienes un problema de rendimiento, primero perfila y mide.

Debería preocuparse por usar los algoritmos correctos, no leer una colección más de la necesaria, etc. Pero en el nivel instrucción/declaración, hay demasiadas capas (compilador, fluctuación, CPU interconectada) entre usted y lo que realmente se ejecuta .

+0

@Ben: Tiene razón, pasé por alto eso (: Pero realmente no afecta el núcleo de la Pregunta o Respuesta. –

+0

Bueno, ahora al menos un futuro lector hipotético no vendrá y aplicará una optimización errónea porque vieron usted estuvo de acuerdo. –

11

Yo diría que es probable que sean el tipo de micro-optimizaciones que no marcarían la diferencia y que no valen la pena.

La elección del algoritmo es importante, pero los libros que debería leer deberían ser más como this o this.

Si realmente desea ver si los hacks de bits que ha citado hacen una diferencia, recomendaría obtener primero una línea base de rendimiento en el código que desea cambiar. Realice los cambios y vuelva a medir el rendimiento de la misma manera. Si obtienes un resultado que dice que vale la pena, continúa por todos los medios.

Será mejor que perfile su código y descubra dónde vive la parte más lenta de su código y dónde se realiza la mayor parte del trabajo. Adivinar rara vez funciona al optimizar.

+0

I Don ' Creo que su jefe se estaba refiriendo a estas optimizaciones. – SLaks

+5

El jefe podría haber estado pensando en otra cosa, pero ha plantado una mala semilla con esta sugerencia. La respuesta sigue siendo "no lo hagas". – duffymo

+0

Sí, soy el dueño del libro de Cormen. También sé que la legibilidad es lo primero. Aún ... mira esto, por ejemplo: http://graphics.stanford.edu/~seander/bithacks.html ¡Hay algoritmos absolutamente increíbles! La pregunta fue más para mi aprendizaje y comprensión ... –

8

No se moleste con tales microoptimizaciones. No te darán nada en aspecto de rendimiento.

Si tiene un problema de rendimiento, encuentre el cuello de botella y optimícelo.

+0

algún comentario para (-1)? –

+0

¿Por qué demonios obtendría un -1? Lo voté. – duffymo

+0

También votando para contrarrestar el estúpido -1 – JeremyP

4

Siempre haga lo posible para crear un código bueno, limpio y eficiente. Esto puede significar micro optimizaciones (como usar stringbuilder en lugar de agregar cadenas, no usar expresiones regulares si no son necesarias, cosas así, no escuchar a las personas que dicen que no tienen sentido: si escribes código incorrecto y no lo haces). incluso te importa, el JITter no te ayudará) o las optimizaciones de cuello de botella (no selecciones * de una tabla completa, use multihilo). El entorno administrado hará el resto. El uso intensivo de la CPU nunca será tan eficaz como el código no administrado, pero también existen muchas ventajas, por eso a la mayoría de las personas les gusta usarlas. Si quieres piezas de código realmente rápidas, hazlo en C, ensamblaje o hardware. La mayoría de las aplicaciones de negocios actuales no requieren una gran cantidad de CPU, como las GUI, los servicios web, las bases de datos, el uso del disco, todas involucran una gran cantidad de CPU en espera y inactivas.

En cuanto a su pregunta: if (a()) b(); y a() & & b(); son completamente iguales, no hay optimización aquí. a * a y < < 2 no son lo mismo, este último es un * 4.

+0

Elegir usar un constructor de cadenas/búfer en lugar de copiar esa concatenación y no usar expresiones regulares son diferencias en la complejidad algorítmica amortiguada, no micro optimizaciones. –

+0

@Pete Kirkham En realidad, esta elección de StringBuilder es a menudo un ejemplo de una microoptimización en algunos entornos. Java moderno, por ejemplo, convertirá los concats en un SB por debajo si siente que es importante. I * solo * usa StringBuilder donde usar tal * haría realmente el código más limpio * o donde * simplemente tiene sentido * - por ejemplo, algo que "se ajusta" como un generador de plantillas. De lo contrario, * nunca he notado * un problema con "cadena normal concat." enation ". –

+0

@pst No he probado 7, pero no es el caso hasta Java 6 que el compilador haría eso para concatenar una cadena en varias sentencias, almacenando las intermedias, que es el caso en que se aplica la optimización. Para una instrucción simple 'String z = a + b + c', muy a menudo lo haría, pero' String z = a + b; if (x) z = z + c; 'no. –

Cuestiones relacionadas