Ayuda con la POO - página 6 123456789 Nuevo comentario Aliaksandr Hryshyn 2021.09.29 16:29 #51 No olvides eliminar la estática PapaYozh 2021.09.29 16:29 #52 fxsaber #:No veo el problema. Tienes que quitar "static" antes de "union u_Data_t". static union u_Data_t fxsaber 2021.09.29 16:32 #53 PapaYozh #:Así que tienes que eliminar "static" antes de "union u_Data_t". Release: 12487.905 Debug: 9357.236 b3062. De hecho, la divergencia va en la dirección equivocada. Aliaksandr Hryshyn 2021.09.29 16:32 #54 Las cifras son así, después de la prueba anterior el código fue ligeramente optimizado: Sin depuración y liberación estática, por último con liberación estática 174.326 13513.946 46.408 Aliaksandr Hryshyn 2021.09.29 16:34 #55 fxsaber #:b3062. De hecho, la discrepancia está en la dirección equivocada. Así que tienes una pequeña diferencia fxsaber 2021.09.29 16:36 #56 Aliaksandr Hryshyn #:Así que tienes una pequeña diferencia Escribe en la rama de la última compilación con el código completo y los resultados. Tal construcción no pasará por los desarrolladores. Vasiliy Sokolov 2021.09.29 17:00 #57 fxsaber #:La respuesta es preferiblemente inmediata. No siempre hay tiempo para experimentar. #define ARRAY_SIZE int(100) #include <Arrays\ArrayObj.mqh> class Test : public CObject { public: int a; double b; datetime c; Test(){}; Test(int ai){this.a = ai;} }; int COUNT = 1000000; void OnStart() { FooV3(); } void FooV1() { long t = GetMicrosecondCount(); Test array[]; ArrayResize(array, COUNT); for(int i = 0; i < COUNT; i++) array[i] = Test(MathRand()); long delta = GetMicrosecondCount() - t; printf(delta); } void FooV2() { long t = GetMicrosecondCount(); Test* array[]; ArrayResize(array, COUNT); for(int i = 0; i < COUNT; i++) array[i] = new Test(MathRand()); long delta = GetMicrosecondCount() - t; printf(delta); } void FooV3() { long t = GetMicrosecondCount(); Test* array[]; ArrayResize(array, COUNT); for(int i = 0; i < COUNT; i++) array[i] = new Test(MathRand()); for(int i = 0; i < COUNT; i++) delete (array[i]); long delta = GetMicrosecondCount() - t; printf(delta); } En resumen: es más rápido sin punteros. Tengo 1,2 segundos sin punteros (V1), 1,4 con punteros (V2). 1.6 - con punteros y eliminación (V3). Dmitry Fedoseev 2021.09.29 17:18 #58 Los objetos creados con new y las llamadas a métodos son más lentos... por si no lo sabías))))) fxsaber 2021.09.29 17:45 #59 Vasiliy Sokolov #:En resumen: es más rápido sin punteros. Tengo 1,2 segundos sin punteros (V1), 1,4 con punteros (V2). 1.6 - con punteros y eliminación (V3). La comparación es incorrecta porque no tiene en cuenta el tiempo que se tarda en eliminar automáticamente los objetos. Modificado. #include <Arrays\ArrayObj.mqh> class Test : public CObject { public: int a; double b; datetime c; Test(){}; Test(int ai){this.a = ai;} }; int COUNT = 1000000; #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279 void OnStart() { Print(MQLInfoInteger(MQL_MEMORY_USED)); _BV(FooV1(), 1); Print(MQLInfoInteger(MQL_MEMORY_USED)); _BV(FooV3(), 1); Print(MQLInfoInteger(MQL_MEMORY_USED)); } void FooV1() { Test array[]; ArrayResize(array, COUNT); for(int i = 0; i < COUNT; i++) array[i] = Test(MathRand()); } void FooV3() { Test* array[]; ArrayResize(array, COUNT); for(int i = 0; i < COUNT; i++) array[i] = new Test(MathRand()); for(int i = 0; i < COUNT; i++) delete (array[i]); } 1 Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 532 in OnStart: FooV1()] = 108805 mcs. 1 Alert: Bench_Stack = 0, 1 <= Time[Test19.mq5 534 in OnStart: FooV3()] = 116705 mcs. 123 De dónde salen los 123 megabytes después de la V3, no lo sé. Dmitry Fedoseev 2021.09.29 18:28 #60 Aquí están las funciones idénticas para comparar: void f1(){ CX x[10]; } void f2(){ CX * x[10]; for(int i=0;i<10;i++){ x[i]=new CX(); } for(int i=0;i<10;i++){ delete x[i]; } } 123456789 Nuevo comentario
No veo el problema.
Tienes que quitar "static" antes de "union u_Data_t".
Así que tienes que eliminar "static" antes de "union u_Data_t".
b3062. De hecho, la divergencia va en la dirección equivocada.
Las cifras son así, después de la prueba anterior el código fue ligeramente optimizado:
Sin depuración y liberación estática, por último con liberación estática
b3062. De hecho, la discrepancia está en la dirección equivocada.
Así que tienes una pequeña diferencia
Así que tienes una pequeña diferencia
Escribe en la rama de la última compilación con el código completo y los resultados. Tal construcción no pasará por los desarrolladores.
La respuesta es preferiblemente inmediata. No siempre hay tiempo para experimentar.
En resumen: es más rápido sin punteros. Tengo 1,2 segundos sin punteros (V1), 1,4 con punteros (V2). 1.6 - con punteros y eliminación (V3).
En resumen: es más rápido sin punteros. Tengo 1,2 segundos sin punteros (V1), 1,4 con punteros (V2). 1.6 - con punteros y eliminación (V3).
La comparación es incorrecta porque no tiene en cuenta el tiempo que se tarda en eliminar automáticamente los objetos.
Modificado.
De dónde salen los 123 megabytes después de la V3, no lo sé.
Aquí están las funciones idénticas para comparar: