Помогите с ООП - страница 5

 

Надо и мне что-нибудь тут написать...

Есть у меня такая штука в коде:

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

T является типом int

Время выполнения функции 10*1024*1024 раз под отладкой  214.659 миллисекунд

Без отладки:  13190.941   миллисекунд

Тут ошибки нету, релизная версия значительно медленнее.

Немного меняем объявление переменной:

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

Появился static

Под отладкой: 213.045  миллисекунд

Без: 70.237 миллисекунд

 
Vasiliy Sokolov #:
Дмитрий, извините, вы хоть один язык программирования знаете кроме мукля? Нет, не знаете. И работать с объектами и указателями до сих пор не научились, - это ясно по тем немногим кодам и даже статьям, что вами опубликованы. Поэтому я даже не могу серьезно что-то ответить на этот бездарный и откровенно глупый комментарий. Ну почитайте наконец википедию что ли, почитайте что такое сборщик мусора и как он устроен, почитайте хоть раз наконец то, на что пытаетесь ссылаться. Пока же, это все выглядит как лай собаки на караван: бессмысленный и беспощадный.

Разберись сначала со своими тараканами. Смешно ведь, ты слишком запредельно неадекватен. И это я скромно выразился))

Ничего серьезно ответить ты не можешь, потому что ты вообще не можешь ничего серьезно ответить, потому что ты мутный.

Василий, ты реально неадекват. Ведь этот разговор про сборщик мусора был еще год назад, если не больше. А воз и ныне там,

ты за год не вкурил, что это такое. Ладно бы не вкурил что-то такое научное запредельное, но ведь ты здесь продемонстрировал

что не вкуривашь, банально, тему разговора, и сам себе противоречишь. И потрясающе то, что ты, вроде как знаешь как минимум

два языка, один из них со сборщиком мусора, и даже при этом ты не прокуриваешь разницы межу языком со сборщиком мусора

и языком без сборщика мусора.

И ответь за свои слова - покажи, в каком это месте я не умею работать с объектами и указателями?

 
Aliaksandr Hryshyn #:

релизная версия значительно медленнее.

Готовый код для воспроизведения?

 
fxsaber #:

Готовый код для воспроизведения?

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

И скрипт:

#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);
  }
 
Может кто делал такое?
 
Aliaksandr Hryshyn #:

И скрипт:

Release: 81.003
Debug: 295.312

Не вижу проблемы.

 
fxsaber #:

Не вижу проблемы.

Последняя бетта 3062

 
У меня 229 и 225 - совсем одинаково.
 
Dmitry Fedoseev #:
У меня 229 и 225 - совсем одинаково.

Версия терминала та же?

 
Aliaksandr Hryshyn #:

Версия терминала та же?

3061