Aiuto con OOP - pagina 5

 

Devo scrivere qualcosa anche qui...

Ho una cosa del genere nel mio codice:

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

T è il tipo int.

Tempo di esecuzione della funzione 10*1024*1024 volte sotto debug: 214,659 millisecondi.

Senza debug: 13190.941 millisecondi

Non c'è nessun errore qui, la versione di rilascio è molto più lenta.

Cambiamo un po'la dichiarazione della variabile:

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

Appare statico.

Sotto debug: 213,045 millisecondi.

Senza: 70,237millisecondi

 
Vasiliy Sokolov #:
Dmitry, mi scusi, conosce qualche altro linguaggio di programmazione oltre a mukl? No, non è vero. E non hai ancora imparato a lavorare con oggetti e puntatori, è chiaro da quei pochi codici e persino articoli che hai pubblicato. Ecco perché non posso nemmeno rispondere seriamente a questo commento senza talento e francamente stupido. Leggi finalmente wikipedia, impara cos'è un raccoglitore di rifiuti e come è organizzato, infine leggi almeno una volta a cosa stai cercando di fare riferimento. Finora, tutto sembra come un cane che abbaia a una carovana: senza senso e senza pietà.

Occupatevi prima dei vostri scarafaggi. È divertente, sei troppo inadeguato. E questo sono io che faccio il modesto))

Non puoi rispondere seriamente a niente perché non puoi rispondere seriamente a niente, perché sei infangato.

Vasily, sei davvero inadeguato. Dopo tutto, questo discorso sul raccoglitore di rifiuti risale a un anno fa, se non di più. È ancora lì,

non hai capito cos'è in un anno. Voglio dire, non so se hai un'idea di cosa sia, ma hai dimostrato qui

che non capisci, banalmente, l'argomento della conversazione, e ti contraddici. E la cosa sorprendente è che lei sembra conoscere almeno

due lingue, una delle quali con un raccoglitore di rifiuti, e anche così, non conosci la differenza tra una lingua con un raccoglitore di rifiuti

e una lingua senza spazzatura.

E rispondi alle tue parole - mostrami come non so lavorare con oggetti e puntatori?

 
Aliaksandr Hryshyn #:

la versione di rilascio è significativamente più lenta.

Codice pronto per la riproduzione?

 
fxsaber #:

Codice pronto per giocare?

//+------------------------------------------------------------------+
//|                                                        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 un copione:

#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);
  }
 
Qualcuno l'ha fatto?
 
Aliaksandr Hryshyn #:

E la sceneggiatura:

Release: 81.003
Debug: 295.312

Non vedo il problema.

 
fxsaber #:

Non vedo il problema.

Ultima beta 3062

 
I miei 229 e 225 sono esattamente gli stessi.
 
Dmitry Fedoseev #:
Ho 229 e 225 - esattamente lo stesso.

La versione del terminale è la stessa?

 
Aliaksandr Hryshyn #:

La versione del terminale è la stessa?

3061

Motivazione: