OOP ile ilgili yardım - sayfa 5

 

Buraya bir şeyler yazmam gerekiyor...

Kodumda şöyle bir şey var:

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

T tipi int

İşlev yürütme süresi 214.659 milisaniye hata ayıklama altında 10*1024*1024 kez

Hata ayıklama olmadan: 13190.941 milisaniye

Burada hata yok, yayın sürümü çok daha yavaş.

Değişken bildirimini biraz değiştiriyoruz:

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

statik göründü

Hata ayıklama altında: 213.045 milisaniye

Olmadan: 70.237 milisaniye

 
Vasiliy Sokolov # :
Dmitry, afedersiniz, mukl dışında en az bir programlama dili biliyor musunuz? Hayır, yapmazsın. Ve hala nesneler ve işaretçilerle nasıl çalışacaklarını öğrenmediler - bu, yayınladığınız birkaç koddan ve hatta makaleden açıkça görülüyor. Dolayısıyla bu vasat ve açıkçası aptalca yoruma ciddi anlamda cevap bile veremiyorum. Sonunda Wikipedia'yı falan okuyun, çöp toplayıcının ne olduğunu ve nasıl çalıştığını okuyun, en az bir kez atıfta bulunmaya çalıştığınız şeyi okuyun. Bu arada, her şey bir kervanda havlayan bir köpek gibi görünüyor: anlamsız ve acımasız.

Önce hamamböceklerinizle uğraşın. Komik, aşırı derecede yetersizsin. Ve mütevazı bir şekilde koydum))

Hiçbir şeye ciddi cevap veremezsin çünkü hiçbir şeye ciddi cevap veremezsin çünkü çamurlusun.

Vasili, gerçekten yetersizsin. Ne de olsa çöp toplayıcıyla ilgili bu konuşma, daha fazla değilse bile bir yıl önceydi. Ve hiçbir şey değişmedi,

ne olduğunu bir yıldır sigara içmedin. Bilimsel olarak aşkın bir şeyi içmezdim ama burada gösterdin

sarhoş olmaman, basmakalıp, konuşmanın konusu ve kendinle çelişiyorsun. Ve şaşırtıcı olan şu ki, en azından biliyor gibisin

iki dil, bunlardan biri çöp toplayıcılı ve o zaman bile çöp toplayıcılı bir dil arasındaki farkı içmiyorsunuz

ve çöp toplayıcısı olmayan bir dil.

Ve sözlerine cevap ver - bana nesnelerle ve işaretçilerle nerede çalışamayacağımı göster?

 
Aliaksandr Hryshyn # :

yayın sürümü çok daha yavaştır.

Oynamak için hazır kod?

 
fxsaber # :

Oynamak için hazır kod?

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

Ve senaryo:

 #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 );
  }
 
Belki birisi bunu yaptı?
 
Aliaksandr Hryshyn # :

Ve senaryo:

Release: 81.003
Debug: 295.312

Ben bir problem görmüyorum.

 
fxsaber # :

Ben bir problem görmüyorum.

En yeni beta 3062

 
229 ve 225'im var - tamamen aynı.
 
Dmitry Fedoseev # :
229 ve 225'im var - tamamen aynı.

Terminal versiyonu aynı mı?

 
Aliaksandr Hryshyn # :

Terminal versiyonu aynı mı?

3061