Ayuda con la POO - página 5

 

Yo también tengo que escribir algo aquí...

Tengo una cosa así en mi código:

   union u_Data_t
     {
      T value;
      ulong data[sizeof(T)/8+1];
     } data_t;

T es de tipo int.

Tiempo de ejecución de la función 10*1024*1024 veces bajo depuración: 214,659 milisegundos.

Sin depuración: 13190,941 milisegundos

Aquí no hay ningún error, la versión de lanzamiento es mucho más lenta.

Cambiemos un poco la declaración de la variable:

   static union u_Data_t
     {
      T value;
      ulong data[sizeof(T)/8+1];
     } data_t;

Aparece estática.

En la depuración: 213,045 milisegundos.

Sin: 70,237milisegundos

 
Vasiliy Sokolov #:
Dmitry, perdona, ¿conoces algún otro lenguaje de programación que no sea mukl? No, no es así. Y todavía no has aprendido a trabajar con objetos y punteros, se ve claramente en esos pocos códigos e incluso artículos que has publicado. Por eso ni siquiera puedo responder seriamente a este comentario sin talento y francamente estúpido. Lee por fin la wikipedia, aprende lo que es un recolector de basura y cómo se organiza, por último lee al menos una vez a lo que te quieres referir. Hasta ahora, todo parece un perro ladrando a una caravana: sin sentido y sin piedad.

Ocúpate primero de tus propias cucarachas. Es gracioso, eres demasiado inadecuado. Y ese soy yo siendo modesto))

No puedes responder nada con seriedad porque no puedes responder nada con seriedad, porque estás embarrado.

Vasily, realmente eres inadecuado. Al fin y al cabo, esta charla sobre el recolector de basura fue hace un año, si no más. Todavía está ahí,

no has descubierto lo que es en un año. Quiero decir, no sé si tienes una idea de lo que es, pero has demostrado aquí

que no entiendes, banalmente, el tema de la conversación, y te contradices. Y lo más sorprendente es que parece saber al menos

dos idiomas, uno de ellos con un recolector de basura, y aun así, no sabes la diferencia entre un idioma con un recolector de basura

y una lengua sin basurero.

Y responde a tus palabras: enséñame cómo no sé trabajar con objetos y punteros.

 
Aliaksandr Hryshyn #:

la versión de lanzamiento es significativamente más lenta.

¿Código listo para la reproducción?

 
fxsaber #:

¿Código listo para jugar?

//+------------------------------------------------------------------+
//|                                                        cBool.mqh |
//|                                               Aliaksandr Hryshyn |
//|                          https://www.mql5.com/ru/users/greshnik1 |
//+------------------------------------------------------------------+
#property copyright "Aliaksandr Hryshyn"
#property link      "https://www.mql5.com/ru/users/greshnik1"

//Битовый поток
class cBit_thread
  {
private:
   ulong             _bit_thread[];//Битовый поток данных
   uint              _bit_thread_size;//Количество записанных бит в потоке
   uint              _bit_thread_pos;//Текущя позиция для чтения/записи
public:
   //Запись последовательности бит
   //Размер увеличивается динамически
   template<typename T>
   int               Write(
      const T value,//Простая структура или переменная
      uint pos_bit_read=0,//С какой позиции начать считывание из структуры/переменной.Указывается в битах
      int bits_count=-1//Количество бит. -1=все до конца
   );//Возвращает количество записанных бит -1=ошибка
  };

template<typename T>
int cBit_thread::Write(const T value,uint pos_bit_read=0,int bits_count=-1)
  {
   static union u_Data_t
     {
      T value;
      ulong data[sizeof(T)/8+1];
     } data_t;
   ZeroMemory(data_t.data);
   data_t.value=value;

   if(pos_bit_read>=sizeof(T)*8)
      return -1;
   if(bits_count<0)
      bits_count=int(sizeof(T)*8-pos_bit_read);
   else
      if(pos_bit_read+bits_count>sizeof(T)*8)
         return -1;

   uint shift=int(pos_bit_read&63);
   int read_from=int(pos_bit_read>>6);

   int read_end=int(pos_bit_read+bits_count);
   uint write_to=0;
   ulong l1=0;
   for(int i1=read_from; i1<(read_end>>6)+1; i1++,write_to++)
     {
      l1=data_t.data[i1];
      data_t.data[write_to]=l1>>shift;
      if(write_to>0)
         data_t.data[write_to-1]|=l1<<(64-shift);
     }

   uint len1=ArrayRange(_bit_thread,0);
   uint len2b=_bit_thread_pos+bits_count;
   if(len2b+128>(len1<<6))
     {
      len2b=(len2b>>6)+2;
      ArrayResize(_bit_thread,len2b+1024);
      len2b+=1024;
      for(uint i1=len1; i1<len2b; i1++)
         _bit_thread[i1]=0;
     }
   int pos_end=(bits_count>>6)+((bits_count&63)!=0);
   shift=_bit_thread_pos&63;
   write_to=(_bit_thread_pos>>6);
   if(shift==0)
     {
      for(int i1=0; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=l1;
        }
     }
   else
     {
      for(int i1=0; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=(l1<<shift);
         _bit_thread[write_to+1]|=l1>>(64-shift);
        }
     }
   _bit_thread_pos+=bits_count;
   _bit_thread_size=MathMax(_bit_thread_size,_bit_thread_pos);
   return bits_count;
  }
//+------------------------------------------------------------------+

Y un guión:

#include <cBool.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   cBit_thread thread;
   ulong mcs=GetMicrosecondCount();
   int num=1;
   for(int i1=0; i1<10*1024*1024; i1++)
     {
      thread.Write(num,0,1);
     }
   Print((GetMicrosecondCount()-mcs)/1000.0);
  }
 
¿Alguien ha hecho esto?
 
Aliaksandr Hryshyn #:

Y el guión:

Release: 81.003
Debug: 295.312

No veo el problema.

 
fxsaber #:

No veo el problema.

Última beta 3062

 
Mi 229 y 225 son exactamente iguales.
 
Dmitry Fedoseev #:
Tengo 229 y 225 - exactamente lo mismo.

¿Es la versión del terminal la misma?

 
Aliaksandr Hryshyn #:

¿Es la versión del terminal la misma?

3061