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

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

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

fxsaber:

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

С учётом этого результата пока базы не видно

A100:

С учётом этого результата пока базы не видно

В Вашем варианте получится 50/50. В моем - все несколько смещено в одну из сторон.

fxsaber:

В Вашем варианте получится 50/50. В моем - все несколько смещено в одну из сторон.

Явного смещения нет хотя бы поэтому:

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

здесь у Вас вообще все зеркально

Нужен пример попроще... без функции rand - похоже что Вы именно её скорость и меряете (или что-нибудь другое), а не ref и val. Тем более странно что я простеньком x86 планшете, а порядок цифр примерно одинаковый ~14 против ~18. И чтобы при альтернативном сравнении полностью (!) одинаковые циклы давали одинаковый результат, а не как здесь

Мне в личке здесь пишет человек, на страницу которого я не могу перейти - получаю ошибку 404 (на страницы других корреспондентов захожу без проблем). Полагаю, не на публичный же форум по этому поводу обращаться? Как теперь решать эти вопросы без суппорта?