› Foros › PC › Software libre
lovechii5 escribió:Tambien depende de que quieras hacer. Hay cosas que son claramente más sencillas con PE que con POO y dan mucho mejor rendimiento. Todo depende del tipo de programa.
Guantanamera escribió:Yo no creo que en la práctica se note la diferencia de rendimiento, si es que la hay... Pero a mi me es más fácil entener la PE que la POO... No sé, debo ser un bicho raro.
Ferdy escribió:No es por joder... pero lo más determinante son los algoritmos y las estructuras de datos. No los lenguajes, paradigmas, compiladores; que son solo las herramientas.
Os estais perdiendo el bosque de tanto mirar las hojas que caen de ese árbol.
HTH, HAND.
oMega_2093 escribió:En los lenguajes en los que hay orientación a objeto como PHP, Python, etc... Sí hay diferencia de rendimiento.
tMK escribió:oMega_2093 escribió:En los lenguajes en los que hay orientación a objeto como PHP, Python, etc... Sí hay diferencia de rendimiento.
Si quieres rendimiento en POO no usas un lenguaje interpretado como los que dices, usas C++. Cualquier algoritmo que uses que no esté bien optimizado te va a penalizar mucho más que el hecho de usar o no POO. Por mi parte a estas alturas me cuesta pensar en proyectos grandes que no estén orientados a objetos, deformación profesional supongo...
Yo lo dejaría en: "Si quieres rendimiento no usas un lenguaje interpretado". Pero esos lenguajes son para lo que son, claro, y se ve que POO sí penaliza. Es absurdo pero está ahí.
Ferdy escribió:Yo lo dejaría en: "Si quieres rendimiento no usas un lenguaje interpretado". Pero esos lenguajes son para lo que son, claro, y se ve que POO sí penaliza. Es absurdo pero está ahí.
Y estarías MUY equivocado.
No obstante, lo digo una vez más, más importante es un buen diseño y algoritmos que un paradigma. El paradigma solo es una de las muchas herramientas que hay que usar.
- ferdy
Ferdy escribió:Yo lo dejaría en: "Si quieres rendimiento no usas un lenguaje interpretado". Pero esos lenguajes son para lo que son, claro, y se ve que POO sí penaliza. Es absurdo pero está ahí.
Y estarías MUY equivocado.
kek_500 escribió:Pues a mi en la carrera me han dicho que si existe diferencia entre ambos paradigmas, y esta reside principalmente en el principio de cercanía. Este principio de cercanía en el que tan ciegamente cree y se basa nuestro hardware. La orientación a objetos no lo "respeta" al pie de la letra, provocando un uso más ineficiente de los recursos: Fallo de página, voy al disco... ¿Qué marco escogo para eliminar de memoria principal en el peor de los casos?¿debo copiar alguna página de memoria principal a disco? Bueno y todo la teoría que podemos esconder detrás. Un ejemplo clásico de esto que os estoy comentado lo podéis encontrar en cualquier interfaz gráfica, donde la ejecución del modelo se entrelaza con la de la vista, y no precisamente en el orden secuencial de un lenguaje estructurado.
Ir al disco es un par de órdenes de magnitud más lento que ir a memoria principal y eso en las aplicaciones si que puede llegar a notarse. Sin embargo, estoy de acuerdo que para que este principio deje de cumplirse, la aplicación debe ser algo elaborada, y probablemente se noten más otros aspectos como los compiladores empleados, o el lenguaje de programación. Sin ir más lejos la anécdota de estos lenguajes orientados objetos venía acompañada de como la máquina virtual de java se demoraba bastante más en realizar unas operaciones no demasiado costosas sobre una gran cantidad de objetos, si en lugar de utilizar arrays (Object[]) se empleaba la clase ArrayList.
+1oMega_2093 escribió:tMK, no creo que te vaya a discutir nadie sobre lo que dices porque considero que es cierto.
Ahora, estábamos hablando de una hipotética diferencia de rendimiento al cambiar de paradigma y esa diferencia está ahí, dejando aparte el hecho de que merezca o no la pena considerarla, que coincido con que NO vale la pena.
Por otro lado, "Ferdy", has indicado en dos ocasiones que alguien se equivoca, que le han engañado o que no tiene claras las cosas. Podrías indicar por qué, por lo menos en mi caso, porque me quedo con la duda de si es que lo has hecho por tocar las pelotas o si había algo en lo que de verdad estaba equivocado, en cuyo caso me gustaría saberlo, para dejar de estar equivocado más que nada.
En el ejemplo de la interfaz gráfica, ¿qué es lo que se repite?¿dónde pasamos mayor cantidad del tiempo?
Cuando se carga la misma efectivamente será como siempre, cuando esperamos que un evento ocurra ¿qué hay detrás?
for (;;) {
if (hay_eventos_sin_atender)
atender_eventos();
lanzar_tareas_idle();
}
Cuando se dispare cargaremos la función manejadora para que esa función probablemente no nos vuelva a interesar.
Ejemplo: En un menú el botón cargar tiene pocos usos, probablemente cuando se pulse no tengamos esa página en memoria, y no sólo nos traeremos la que necesitamos por el principio del que veníamos hablando.
Ferdy escribió:Y sobre lo de kek_500: Realmente creo que estás confundiéndote mucho. Entiendo que te refieres al principio de localidad de la información relacionada con los conceptos de caché y memoria virtual. Bien, aquí hay dos cosas: datos y código. La parte de código es interesante que esté cerca pero, siendo prácticos, está todo muy cerca. El código de un software es interrumpido por el planificador para ejecutar otras tareas muchas veces por segundo así que esto no es un gran problema. La localidad de los datos es una cosa completamente distinta. Aquí si que es importante que los datos estén bien colocados; pero el cómo estén colocados no depende ni del paradigma ni, en principio, del lenguaje. Es todo, o casi todo, tarea del diseño/implementación.
Como veo que haces algunas preguntas, te voy a contestar a las que pueda:
[...]
- ferdy
Para el SO, el código es la JVM y los datos nuestros propios programas. ¿Esto se encuentra relativamente cerca (los datos)? No.
- Accedemos al objeto círculo. Dado que el objeto no se almacena en la propia clase dibujo, sino que únicamente tenemos un puntero, vamos a buscar nuestra instancia. ¡Aquí no tenemos certeza de que esté en memoria! Peor de los casos (y probable): Fallo de página. Si a lo que intentamos acceder son a variables estáticas de una clase, tendremos que cargar la información relativa a esa clase. Y en el peor de los casos si el código de esa clase no está cargado peor suerte aún. Tras estas operaciones a bajo nivel, ya estamos listos para ejecutar nuestro método.
¿Y si lo único que necesito es mi variable TAMANO_FUENTE porque decido ignorar el color? ¿No he tirado mi tiempo yendo a buscar información que no quería? Porque de estos campos no se realiza una copia en cada objeto, son comunes a todos las instancias y he necesitado cargar en memoria la página con la información de esa clase. Podríamos crear una copia de TAMANO_FUENTE en cada instancia, como solución chapucera. Pero, ¿qué ocurre si esa variable estática es la base de datos antes mencionada? Es inviable.
¿Qué ocurre en la programación estructurada? Evidentemente el problema de acceder a un dato que no tenemos en memoria puede ocurrir (queremos acceder al círculo). Pero todos esos fallos por acceder a los datos de una clase en particular no se producen. Nuevamente vuelvo al caso de mi interfaz gráfica pese a que algunos insistan en que puedo confundir cosas. Si tengo una ventana cualquiera, es bastante probable que tenga ciertas constantes definidas sobre como los objetos se distribuyen en pantalla. Si en un determinado momento debo repintar la memoria tengo que acceder a las clases involucradas en dicha acción (posibles botones, tablas, o widget en general), obtener los datos de sus respectivas clases, además de conseguir tales objetos.
En el primer post indiqué que cualquiera de estos fallos eran tonterías comparados con un mal diseño o un código poco optimizado. Simplemente preguntaron por las diferencias entre ambos paradigmas, a lo que respondí que la OO no respeta el principio de cercanía en la misma forma que lo hace la PE. Fuiste tú el primero que llegó y dijo que eso no era cierto, diciéndome que estaba muy equivocado. En estos mensajes, simplemente intentaba dar cierta información, ciertos argumentos que intentaran "justificar" los hechos.
Ferdy escribió:Cuando dije que oMega_2093 estaba MUY equivocado es por esto: 'Si quieres rendimiento no usas un lenguaje interpretado'. Realmente no tiene mucho sentido la frase. Hay lenguajes interpretados como prolog o Erlang que pueden proporcionarte mucho rendimiento en ciertas tareas. Incluso los lenguajes que a veces se llaman semi-interpretados como Java utilizan técnicas de compilación Just-In-Time que pueden llegar a ofrecer rendimientos superiores a otras aplicaciones según qué casos.
Ferdy escribió:Es que no es cierto que la OO no respete el principio de cercanía. Lo hace IGUAL de bien o mal que la PE. Te recomiendo que mires cómo se implementa un lenguaje como C++; verás que no hay ninguna diferencia.
- ferdy