Вопросы по ООП в MQL5 - страница 65

 
Sergey Dzyublik:

Что-то вы о структурах и классах (без new) забыли - они оба на стеке выделяются.

не путайте с С++, тут всё ближе к шарпу

 
Maxim Kuznetsov:

не путайте с С++, тут всё ближе к шарпу

Это ваши фантазии, а не реальность.
Не стоит доказывать то, что сами не проверяли...
Создание локальных переменных в виде объектов структур и классов (без new) происходит на стеке.
Как +- устроены работают массивы в МТ5 описывал ранее.

 
Dmitry Fedoseev:

Какой обломс! 

1 - через создание объект. 2 - просто через обычный вызов функции. Первое число - время в миллисекундах, на второе не надо обращать внимания.

Аж чуть ли не в 10 раз быстрее (а иногда и более, чем в 10 раз). Печалька какая... стек... куча... ***ча

Ну почему же, не обращать внимание? Дай угадаю: INT_MAX раз выполнили действие через создание временного объекта, а потом то же действие через вызов функции?

В общем-то, ожидаемый результат, учитывая то, что в рантайме еще и танцы с бубном вокруг создания класса идут (надо же этот handle, который очень смахивает на индекс в некоем контейнере получить).

PS. Исходники для воспроизведения где?

PPS. А Вы уверены, что функция вызывалась? Все таки, оптимизатор есть и в этом коде, не факт, что будет вызов функции в run-time:

for (int i=0;i<500;++i){
   int x=Get(i);}

int Get(int x) {return -x;}

То, что UB в mql есть - доказывает этот код:

void OnStart(){
   Print(Test()?"Ok":"No");
}

bool Test (void)
{
  const int MAX = 1000;
  int a=1,b=1,c=1;
  while (1) {
    if (((a*a*a) == ((b*b*b)+(c*c*c)))) return true;
    a++;
    int x=Get(a);
    if (a>MAX) {
      a=1;
      b++;
    }
    if (b>MAX) {
      b=1;
      c++;
    }      
    if (c>MAX) {
      c=1;
    }
  }
  return false;
}
 
Vladimir Simakov:

То, что UB в mql есть - доказывает этот код:

Ловко вы обвели компилятор вокруг пальца:
- false ветка выбрасывается, так как нет break из while(1) цикла.
- true возвращается, так как операции выполняются с локальными переменными без какого-либо взаимодействия с "внешним миром" и выполнения данного кода тоже выбрасывается.

 
Sergey Dzyublik:

Ловко вы обвели компилятор вокруг пальца:
- false ветка выбрасывается, так как нет break из while(1) цикла.
- true возвращается, так как операции выполняются с локальными переменными без какого-либо взаимодействия с "внешним миром" и выполнения данного кода тоже выбрасывается.

Это не я - это один из примеров на просторах инета. Один в один с плюсов.

 
Vladimir Simakov:

Ну почему же, не обращать внимание? Дай угадаю: INT_MAX раз выполнили действие через создание временного объекта, а потом то же действие через вызов функции?

В общем-то, ожидаемый результат, учитывая то, что в рантайме еще и танцы с бубном вокруг создания класса идут (надо же этот handle, который очень смахивает на индекс в некоем контейнере получить).

PS. Исходники для воспроизведения где?

PPS. А Вы уверены, что функция вызывалась? Все таки, оптимизатор есть и в этом коде, не факт, что будет вызов функции в run-time:

То, что UB в mql есть - доказывает этот код:

Не угадал. Здесь не гадать надо, а достаточно помнить вчерашний день, в случая проблем с памятью, можно по цитатам посмотреть о чем разговор. С чего вдруг результат стал ожидаемым, если до этого вы утверждали обратное?

Да, уверен, функция вызывалась. А вам все так нравится мечтать, что я идиот? Почему вопрос только про функцию, а может и объект тоже не создавался? Или вы так прям уверены, что знаете как устроены все компиляторы?

 
Sergey Dzyublik:

Можете объяснить о чем речь, а то я чуть-чуть туповат, трижды прочитал - но ни чего так и не понял...

Посмотрите по цитатам о чем разговор. Что я процитировал, и в ответ на что я получал этот ответ из цитаты.

 
и любой разговор вы в такой бред уводите... про стек, про массив-стринг... Не работает ваше объяснение через "на стеке".
 

Раз Дмитрий застеснялся свой код выложить, то пришлось самому 15 мин. тестам уделить.

Упс. При идентичных действиях, разница всего 30% получилась.

class CTest{
   static uint count;
   static double temp;
   int i;
public:
   CTest(int _x):i(_x){++count; temp+=(double)GetMicrosecondCount(); temp/=count;}
   ulong Get() {return GetMicrosecondCount()+i;}
   static uint Count()  {return count;}
   static double Temp() {return temp;}
};

int i=1;
double temp;

uint CTest::count=0;
double CTest::temp=0.0;

void OnStart(){
   ulong t=GetMicrosecondCount();
   for (;i<1000001;++i){
      temp+=(double)CTest(i).Get();
      temp/=i;}
   ulong _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(CTest::Count());
   Print(CTest::Temp());
   t=GetMicrosecondCount();
   for (;i<2000001;++i){
      temp+=(double)Test(i);
      temp/=i;}
   _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(temp);
}

ulong Test(int x) {
   static uint count=0;
   static double _temp=0.0;
   ++count;
   _temp+=(double)GetMicrosecondCount();
   _temp/=count;
   return GetMicrosecondCount()+x;}

Разница во времени выполнения сохраняется и без всех этих телодвижений со статическими переменными и полями. Именно разница в микросекундах, а не процентное соотношение.

Вывод: затраты на создание временного объекта на стеке достаточно малы, на моем, не самом быстром компе, составили порядка 30-40 нс/шт (наносекунда), что бы на них, в подавляющем большинстве случаев, обращать внимание.

PS. А я плохо про разработчиков подумал, ан нет, надо просто не верить людям на слово и проверять их)))

 
Vladimir Simakov:

Раз Дмитрий застеснялся свой код выложить, то пришлось самому 15 мин. тестам уделить.

Упс. При идентичных действиях, разница всего 30% получилась.

Разница во времени выполнения сохраняется и без всех этих телодвижений со статическими переменными и полями. Именно разница в микросекундах, а не процентное соотношение.

Вывод: затраты на создание временного объекта на стеке достаточно малы, на моем, не самом быстром компе, составили порядка 30-40 нс/шт (наносекунда), что бы на них, в подавляющем большинстве случаев, обращать внимание.

PS. А я плохо про разработчиков подумал, ан нет, надо просто не верить людям на слово и проверять их)))

А еще больше сделай всяких разных вычислений внутри, разница еще меньше будет. Да и вообще, это тест сложно назвать тестом идентичного функционала.

Да еще и сами тесты не идентичны.

Причина обращения: