Ошибки, баги, вопросы - страница 2315

 
fxsaber:

Почему by_ref работает медленнее by_val?

Откуда это следует?

Если код одинаковый

//Test.mqh
        int by_ref(string& var) { return int(var) % 100; }
        int by_val(string  var) { return int(var) % 100; }
//Test.mq5
#include "Test.mqh"
#define ITERATIONS 1000000
#define MACRO( X ) \
        { \
                ulong time = GetMicrosecondCount(); \
                for(int i=0; i<ITERATIONS; i++) \
                { \
                        string r = string( rand ); \
                        sum_##X += by_##X(r); \
                } \
                time_##X = GetMicrosecondCount() - time; \
        }
void OnStart()
{
        for ( int i = 0; i < 10; i++ )
                OnStart2( rand());
}
void OnStart2( int rand )
{
        long time_ref, sum_ref = 0;
        long time_val, sum_val = 0;
        MACRO( ref )
        MACRO( val )
        printf( "%+10.3f:%d", (time_ref-time_val)/1000.0, sum_ref-sum_val );
}

то и Pезультат (разница времени выполнения):

    +12.221:0
     +5.099:0
     +0.149:0
    -13.729:0
    +14.531:0
    -27.429:0
    +26.405:0
     -0.839:0
     +5.400:0
     -4.882:0

чередуется (+\-) в незначительных пределах

 
A100:

Откуда это следует?

#define ITERATIONS 1000000

void OnStart()
{
   string Str = "1";
   
   for (int i = 0; i < 10; i++)
     Str += Str;
   
   for (int j = 0; j < 5; j++)
   {
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++){
           string r = string(rand()) + Str;
           sum += by_ref(r);
        }
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum);
     }{
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_val(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum);
     }
     
     Print("");
   }
}
//+------------------------------------------------------------------+

int by_ref(string &var){ return int(var) % 100; }
int by_val(string  var){ return int(var) % 100; }


by_ref took 15119.806 milliseconds: sum=-1000000ll
by_val took 13872.479 milliseconds: sum=-1000000ll

by_ref took 14433.781 milliseconds: sum=-1000000ll
by_val took 13817.533 milliseconds: sum=-1000000ll

by_ref took 13889.424 milliseconds: sum=-1000000ll
by_val took 14135.603 milliseconds: sum=-1000000ll

by_ref took 16047.643 milliseconds: sum=-1000000ll
by_val took 14494.432 milliseconds: sum=-1000000ll

by_ref took 15542.276 milliseconds: sum=-1000000ll
by_val took 13843.121 milliseconds: sum=-1000000ll
 
Nikolai Semko:

Захотел поставить оценку в КБ и не получилось. И судя по тому, что последние публикации вовсе не имееют оценок, то похоже, что эта проблема не только у меня.

Да, не работает.

 
fxsaber:
У меня в циклах ref и val одинаковый код (сравнение более менее корректное), а у Вас разный
 
A100:
У меня в циклах ref и val одинаковый код (сравнение более менее корректное), а у Вас разный

Да, разный. Но вопрос остается актуальным. Почему val-вариант заметно быстрее ref?

 
fxsaber:

Да, разный. Но вопрос остается актуальным. Почему val-вариант заметно быстрее ref?

может ref вариант оптимизируется компилятором хуже - кто ж знает.

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

 
TheXpert:

может ref вариант оптимизируется компилятором хуже - кто ж знает.

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

Вопрос на самом деле предназначался для разработчиков, чтобы была база для разоборок в причинах расхождений.

Обычно для скорости стараюсь все передавать по ссылке. И это было оправдано в каких-то билдах. Но ней сейчас, похоже.

 
Alexey Kozitsyn:

+1. Похоже, что-то сломалось. Билд 1881 x64. Win 10. При запуске грузит проц на 20+% (i5 8600k) и оперативу на 650-700 мб (без увеличения).

В диспетчере задач состояние "Не отвечает".

Причем другой терминал 1881 (не Открытие) запускается нормально.

Добавлено:

В итоге все-таки загрузился. Однако загрузка длилась крайне долго - это не нормально. После закрыл терминал и открыл снова. Открылся моментально. Видимо, с подгрузкой данных появились какие-то проблемы.

Решилось переустановкой терминала. Причем снес случайно и папку со всеми настройками и графиками) Всё заново чертил, зато работает как часы теперь.
 
reztor:
Решилось переустановкой терминала. Причем снес случайно и папку со всеми настройками и графиками) Всё заново чертил, зато работает как часы теперь.

Это было не обязательно. Можно было просто удалить файл news.dat.

 
TheXpert:

может ref вариант оптимизируется компилятором хуже - кто ж знает.

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

А какая связь между конечным кодом и временем его выполнения?

Для примера изменим ... так чтобы циклы стали полностью одинаковыми

#define ITERATIONS 1000000
void OnStart()
{
   string Str = "1";
   for (int i = 0; i < 10; i++)
     Str += Str;
   for (int j = 0; j < 5; j++)
   {
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_ref(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum);
     }
     {
        ulong time = GetMicrosecondCount();
        ulong sum = 0;
        for(int i=0; i<ITERATIONS; i++)
           sum += by_val(string(rand()) + Str);
        time = GetMicrosecondCount() - time;
        printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum);
     }    
     Print("");
   }
}
int by_ref(string var){ return int(var) % 100; }
int by_val(string var){ return int(var) % 100; }

Результат:

by_ref took 18354.547 milliseconds: sum=1865600ll
by_val took 18318.319 milliseconds: sum=1861628ll

by_ref took 18416.747 milliseconds: sum=1904488ll
by_val took 18221.978 milliseconds: sum=1907860ll

by_ref took 18301.009 milliseconds: sum=1757988ll
by_val took 18545.258 milliseconds: sum=1949720ll

by_ref took 18373.648 milliseconds: sum=1867160ll
by_val took 17972.432 milliseconds: sum=1760308ll

by_ref took 19426.076 milliseconds: sum=1795564ll
by_val took 19177.485 milliseconds: sum=1826360ll

примерно такой же... или Вы думаете что компилятор создал в одинаковых циклах разный код?

Напомню - там было например такое

by_ref took 13889.424 milliseconds: sum=-1000000ll
by_val took 14135.603 milliseconds: sum=-1000000ll

и разный код... а тут примерно такая же разница по времени, но и код и сами функции совершенно одинаковые

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