Ajuda com o OOP - página 5

 

Eu também preciso escrever algo aqui...

Eu tenho uma coisa assim em meu código:

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

T é do tipo int.

Tempo de execução da função 10*1024*1024 vezes sob depuração: 214.659 milissegundos.

Sem depuração: 13190.941 milissegundos

Não há erro aqui, a versão de lançamento é muito mais lenta.

Vamos mudar um pouco a declaração variável:

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

Parece estático.

Sob depuração: 213.045 milissegundos.

Sem: 70.237milissegundos

 
Vasiliy Sokolov #:
Dmitry, desculpe-me, você conhece alguma outra linguagem de programação além do mukl? Não, você não tem. E você ainda não aprendeu a trabalhar com objetos e indicações, está claro a partir daqueles poucos códigos e até mesmo artigos que você publicou. É por isso que não posso sequer responder seriamente a este comentário sem talento e francamente estúpido. Leia finalmente a wikipedia, aprenda o que é um coletor de lixo e como ele é organizado, finalmente leia pelo menos uma vez o que você está tentando consultar. Até agora, tudo parece um cão latindo em uma caravana: sem sentido e sem piedade.

Lidar primeiro com suas próprias baratas. É engraçado, você é muito inadequado. E isso sou eu sendo modesto))

Você não pode responder nada sério porque não pode responder nada sério, porque é lamacento.

Vasily, você é realmente inadequado. Afinal, esta conversa sobre o catador de lixo foi há um ano atrás, se não mais. Ainda está lá,

você ainda não descobriu o que é em um ano. Quero dizer, não sei se você tem uma pista do que é, mas você demonstrou aqui

que você não entende, banalmente, o tema da conversa, e se contradiz. E o mais incrível é que você parece saber pelo menos

dois idiomas, um deles com um coletor de lixo, e mesmo assim, você não sabe a diferença entre um idioma com um coletor de lixo

e uma linguagem sem um coletor de lixo.

E responda por suas palavras - mostre-me como eu não sei trabalhar com objetos e indicações?

 
Aliaksandr Hryshyn #:

a versão de lançamento é significativamente mais lenta.

Código pronto para reprodução?

 
fxsaber #:

Código pronto para jogar?

//+------------------------------------------------------------------+
//|                                                        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;
  }
//+------------------------------------------------------------------+

E um roteiro:

#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);
  }
 
Alguém já fez isso?
 
Aliaksandr Hryshyn #:

E o roteiro:

Release: 81.003
Debug: 295.312

Eu não vejo o problema.

 
fxsaber #:

Eu não vejo o problema.

Último beta 3062

 
Meus 229 e 225 são exatamente os mesmos.
 
Dmitry Fedoseev #:
Eu tenho 229 e 225 - exatamente o mesmo.

A versão terminal é a mesma?

 
Aliaksandr Hryshyn #:

A versão terminal é a mesma?

3061