5 Знаков - страница 5

 
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double point=0.0;
   ulong t1=0,t2=0,startTickCnt,endTickCnt;

   startTickCnt=GetMicrosecondCount();
   for(int i=0;i<1000000;i++)
     {
      point=_Point;
     }
   endTickCnt=GetMicrosecondCount();
   t1=endTickCnt-startTickCnt;

   startTickCnt=GetMicrosecondCount();
   for(int i=0;i<1000000;i++)
     {
      point=Point();
     }
   endTickCnt=GetMicrosecondCount();
   t2=endTickCnt-startTickCnt;

   string str1 = "_Point: " + (string)(t1);
   string str2 = "Point(): " + (string)(t2);
   Alert(str1," | ",str2);
  }
//+------------------------------------------------------------------+

Так вроде правильно.

double point = _Point;

Обьявление переменной - тоже требует времени.

 
Aleksey Lebedev:

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

Согласен. Вообще какую-то странность в вакууме мы тут разобрали. В реальных программах тормоза привносятся совсем другими частями :)

У меня предварительный вывод такой:

Если хотите, чтобы ваши программы работали быстрее в профилировщике, то всегда пишите в духе "_Point". Если интересует реальная работа, то почти без разницы (и в моём случае это "почти" против стиля "_Point").

 
Aleksey Lebedev:

Так вроде правильно.

Обьявление переменной - тоже требует времени.

Вы не даёте мне шансов успокоиться! Про объявление переменной не подумал, сейчас протестирую (но на последнем своём варианте).

 
Sergey Eremin:

А вот это уже просто такой стандарт стиля принят в стилизаторе MetaEditor'а. Если он не нравится, то можно его не использовать. Но уж лучше такой "принудительный" стиль, чем его отсутствие, ИМХО :)

Никакого отношения к скорости работы конечного исполняемого файла это не имеет.


P.S. насчёт 50 линий - у всех разное разрешение мониторов. Лично у меня на одном мониторе 54, на втором 59 помещается. И это ещё довольно "дохлые" мониторы. У кого-то и все 200+ могут помещаться (4К).

Опять эта привычка "мериться"! Кстати, по скобочным лестницам точно выиграете! А в Сервисе Эдитора, надо бы сделать ещё опцию персональной стилизации для фиксации! И удобно было бы, кому надо, перенастроить для сдачи в Маркет и в Кодобазу по принятому Администрацией стандарту, несмотря на его неудобства!
 
Boris:
Опять эта привычка "мериться"!

Вы ошибаетесь. Я лишь про то, что "50 линий" это не у всех так. А у людей, которые используют мониторы посовременней наших с Вами, так и в несколько раз может отличаться.


Aleksey Lebedev:

Так вроде правильно.

Обьявление переменной - тоже требует времени.

Убрал все объявления переменных в "измеряемых" зонах (включая счётчики циклов):

#property strict

void OnStart()
{
   Alert("-------");
   for(int k = 0; k < 10; k++)
   {
      string text = "";
      int equalCnt = 0;
      int fasterCnt = 0;
      int slowerCnt = 0;
      double point = 0.0;
      ulong startTickCnt = 0;
      ulong endTickCnt = 0;
      ulong startTickCnt2 = 0;
      ulong endTickCnt2 = 0;
      int i = 0;
      for(int j = 0; j < 10; j++)
      {
         startTickCnt = GetMicrosecondCount();
         for(i = 0; i < 1000000000; i++)
         {                  
            point = _Point;
         }
         endTickCnt = GetMicrosecondCount();
         
         
         startTickCnt2 = GetMicrosecondCount();
         for(i = 0; i < 1000000000; i++)
         {
            point = Point();
         }
         endTickCnt2 = GetMicrosecondCount();
         
         ulong v1 = endTickCnt - startTickCnt;
         ulong v2 = endTickCnt2 - startTickCnt2;
         if(v1 == v2)
         {
            equalCnt++;
         }
         else if(v1 < v2)
         {
            fasterCnt++;
         }
         else if(v1 > v2)
         {
            slowerCnt++;
         }      
         
         string str1 = "_Point: " + (string)v1;
         string str2 = "Point(): " + (string)v2;
         
         text = text + (string)j + ")" + str1 + " | " + str2 + "\r\n";
      }
      
      string equalCntStr = "_Point равно Point() " + (string)equalCnt + " раз";
      string fasterCntStr = "_Point быстрее Point() " + (string)fasterCnt + " раз";
      string slowerCntStr = "_Point медленнее Point() " + (string)slowerCnt + " раз";
      
      Alert(k, ")", text, "\r\n\r\n", equalCntStr,"; ",fasterCntStr,"; ",slowerCntStr);
   }
}


Теперь результаты вернулись к "блуждающим" (обычный режим, не профилировщик):

_Point равно Point() 0 раз; _Point быстрее Point() 3 раз; _Point медленнее Point() 7 раз
_Point равно Point() 0 раз; _Point быстрее Point() 8 раз; _Point медленнее Point() 2 раз
_Point равно Point() 0 раз; _Point быстрее Point() 4 раз; _Point медленнее Point() 6 раз
_Point равно Point() 0 раз; _Point быстрее Point() 6 раз; _Point медленнее Point() 4 раз
_Point равно Point() 0 раз; _Point быстрее Point() 6 раз; _Point медленнее Point() 4 раз
_Point равно Point() 0 раз; _Point быстрее Point() 0 раз; _Point медленнее Point() 10 раз
_Point равно Point() 0 раз; _Point быстрее Point() 3 раз; _Point медленнее Point() 7 раз
_Point равно Point() 0 раз; _Point быстрее Point() 6 раз; _Point медленнее Point() 4 раз
_Point равно Point() 0 раз; _Point быстрее Point() 6 раз; _Point медленнее Point() 4 раз
_Point равно Point() 0 раз; _Point быстрее Point() 4 раз; _Point медленнее Point() 6 раз

Вернулись к "примерно одинаково" в обычном режиме.

На сегодня с меня хватит, хотя и интересно что конкретно влияло на перекос в пользу Points() при наличии объявлений переменных в "замеряемых" участках (мысли есть, но на грани ненормальных). Быть может позже вернусь к вопросу, поочерёдно буду возвращать и замерять. Буду рад любым предположениям (а особенно тем, которые удастся проверить). Очень уж любопытно!

 
Sergey Eremin:

А теперь новый вопрос - идентична ли работа программ в обычном режиме режиму профилировщика? Т.е. там ли мы охотимся на ведьм, или для практического применения логичней изучать "обычный" режим?

В обычном режиме я получаю чертовски странный результат (Point() быстрее чем _Point), и я почти уверен, что мои программы в нормальных условиях будут работать не в том же режиме, что и под профилировщиком.

Конечно, не идентична. Я для этого и предложил проверить и сравнить.

Я по прежнему считаю, что функция Point() выглядит так:

double Point()
{
   return(_Point);
}

Поэтому при профилировании появляется разница.

Но в реальной работе, даже если использовать размер пункта в каждой строке, это все равно будет одним из самых быстрых кусков кода )

 

Кстати, чаще всего я использую какую-то свою double point, которой присваивается размер 4-хзначного пункта. Тогда этот разговор вообще ни о чем )

 
Andrey Khatimlianskii:

Конечно, не идентична. Я для этого и предложил проверить и сравнить.

Я по прежнему считаю, что функция Point() выглядит так:

Поэтому при профилировании появляется разница.

Но в реальной работе, даже если использовать размер пункта в каждой строке, это все равно будет одним из самых быстрых кусков кода )

Андрей, во всём сказанном Вами с солидарен :)
 

мда... я тут вообще не в тему со своим примитивизмом :) 

вывод так и остался на 4 знака.. при нормализации при выводе в 5 знаков.

Спасибо. Может кто подскажет :) 

 
protr:

мда... я тут вообще не в тему со своим примитивизмом :) 

вывод так и остался на 4 знака.. при нормализации при выводе в 5 знаков.

Спасибо. Может кто подскажет :) 

Вывод и хранение - разные вещи.

Для вывода специально указывайте точность, если нужно больше 4 знаков после запятой. На хранении это никак не сказывается. 

 
protr:

вывод так и остался на 4 знака.. 

MT4 или 5? Если 4 - попробуйте #property strict добавить. Если не поможет - показывайте код и вам сразу напомогают