проверил. Результаты неожиданные для меня. Вариант с bool() работает на ~75%(!!!) медленнее. Видимо преобразование типов (даже bool) весьма затратная штука. Помнится, об этом несколько раз говорил Ренат.
рекурсия с циклом while сейчас почти одинаковые и самые быстрые. Значит Ильяс починил.
цикл for на ~35% медленнее, чем while, и почти одинаков по производительности do while
Вывод: для максимальной производительности используйте цикл while!
А если не объявлять в каждом цикле for новую int i, а использовать ту, что есть?
Видимо преобразование типов (даже bool) весьма затратная штука.
Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.
время выполнения = 547 , контрольная сумма = 1094470232; цикл while
время выполнения = 547 , контрольная сумма = 1094470232; цикл for(int i = size-1;i>=0;i--)
время выполнения = 549 , контрольная сумма = 1094470232; цикл for(uint i = size;(bool)i--;)
время выполнения = 548 , контрольная сумма = 1094470232; цикл dowhile
время выполнения = 545 , контрольная сумма = 1094470232; цикл через рекурсию
Не знаю, почему int-вариант тормозит, а uint - нет.
цикл for на ~35% медленнее, чем while
У меня включена оптимизация, запуск release-версии. См. выше.
Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.
Не знаю, почему int-вариант тормозит, а uint - нет.
У меня включена оптимизация, запуск release-версии. См. выше.
Да, я уже понял свой косяк. Спасибо.
2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) ========================
2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) время выполнения = 330 , контрольная сумма = 8187742387000; цикл while2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) время выполнения = 336 , контрольная сумма = 8187742387000; цикл for(uint i = size-1;i>=0;i--)
2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) время выполнения = 513 , контрольная сумма = 8187742387000; цикл for(uint i = size;(bool)i--;)
2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) время выполнения = 511 , контрольная сумма = 8187742387000; цикл dowhile2023.07.1917:29:34.908 TestLoopsPerformance (USDJPY,M1) время выполнения = 331 , контрольная сумма = 8187742387000; цикл через рекурсию
2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) ========================
2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) время выполнения = 333 , контрольная сумма = 8187157275000; цикл while2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) время выполнения = 332 , контрольная сумма = 8187157275000; цикл for(uint i = size-1;i>=0;i--)
2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) время выполнения = 517 , контрольная сумма = 8187157275000; цикл for(uint i = size;(bool)i--;)
2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) время выполнения = 517 , контрольная сумма = 8187157275000; цикл dowhile2023.07.1917:29:38.440 TestLoopsPerformance (USDJPY,M1) время выполнения = 330 , контрольная сумма = 8187157275000; цикл через рекурсию
2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) ========================
2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) время выполнения = 335 , контрольная сумма = 8195795129500; цикл while2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) время выполнения = 337 , контрольная сумма = 8195795129500; цикл for(uint i = size-1;i>=0;i--)
2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) время выполнения = 522 , контрольная сумма = 8195795129500; цикл for(uint i = size;(bool)i--;)
2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) время выполнения = 519 , контрольная сумма = 8195795129500; цикл dowhile2023.07.1917:29:41.713 TestLoopsPerformance (USDJPY,M1) время выполнения = 335 , контрольная сумма = 8195795129500; цикл через рекурсию
но на моем процессоре все равно с bool() медленее примерно в полтора раза. Так же включена максимальная оптимизация. Но на цикл for я зря гнал. А вот do while тоже отстает на 50% на моем процессоре. Подозреваю, что действительно сильно от железа зависят все эти оптимизации.
#define size 1000000#define total_tests 500//+------------------------------------------------------------------+voidOnStart() {
ulong sum1=0,sum2=0, sum3=0, sum4=0, sum5=0;
ulong t1=0, t2=0, t3=0, t4=0, t5=0;
uint X[];
ArrayResize(X,size);
for(uint i=0; i<size; i++) X[i]=rand();
for (uint j = 0; j++<total_tests;) {
ulong t=GetMicrosecondCount();
uint i1=0;
while(i1<size) sum1+=X[i1++];
t1+=GetMicrosecondCount()-t;
t=GetMicrosecondCount();
for(uint i = 0; i<size;i++) sum4+=X[i];
t4+=GetMicrosecondCount()-t;
t=GetMicrosecondCount();
for(uint i = size; (bool)i--;) sum3+=X[i];
t3+=GetMicrosecondCount()-t;
t=GetMicrosecondCount();
uint i2=size-1;
do sum5+=X[i2];
while(i2--!=0);
t5+=GetMicrosecondCount()-t;
t=GetMicrosecondCount();
int i3=0;
Recursion(X,sum2,i3);
t2+=GetMicrosecondCount()-t;
}
Print("========================");
Print("время выполнения = "+string(t1/total_tests)+" , контрольная сумма = "+string(sum1) + "; цикл while");
Print("время выполнения = "+string(t4/total_tests)+" , контрольная сумма = "+string(sum4) + "; цикл for(uint i = size-1;i>=0;i--)");
Print("время выполнения = "+string(t3/total_tests)+" , контрольная сумма = "+string(sum3) + "; цикл for(uint i = size;(bool)i--;)");
Print("время выполнения = "+string(t5/total_tests)+" , контрольная сумма = "+string(sum5) + "; цикл do while");
Print("время выполнения = "+string(t2/total_tests)+" , контрольная сумма = "+string(sum2) + "; цикл через рекурсию");
}
//+------------------------------------------------------------------+void Recursion(uint &X[],ulong &sum, uint &i) {
sum+=X[i];
i++;
if(i<size) Recursion(X,sum,i);
}
//+------------------------------------------------------------------+
2023.07.2020:13:59.028 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 558, контрольная сумма = 8194189180500, цикл while2023.07.2020:13:59.028 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 578, контрольная сумма = 8194189180500, цикл for(uint i = size-1;i>=0;i--)
2023.07.2020:13:59.028 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 593, контрольная сумма = 8194189180500, цикл for(uint i = size;(bool)i--;)
2023.07.2020:13:59.028 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 600, контрольная сумма = 8194189180500, цикл dowhile2023.07.2020:13:59.028 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 548, контрольная сумма = 8194189180500, цикл через рекурсию
2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) ========================
2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 568, контрольная сумма = 8196256892000, цикл while2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 580, контрольная сумма = 8196256892000, цикл for(uint i = size-1;i>=0;i--)
2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 598, контрольная сумма = 8196256892000, цикл for(uint i = size;(bool)i--;)
2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 604, контрольная сумма = 8196256892000, цикл dowhile2023.07.2020:14:16.919 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 561, контрольная сумма = 8196256892000, цикл через рекурсию
2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) ========================
2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 575, контрольная сумма = 8187187545500, цикл while2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 598, контрольная сумма = 8187187545500, цикл for(uint i = size-1;i>=0;i--)
2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 610, контрольная сумма = 8187187545500, цикл for(uint i = size;(bool)i--;)
2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 619, контрольная сумма = 8187187545500, цикл dowhile2023.07.2020:14:19.796 TestLoopsPerformance__1 (EURUSD,H1) время выполнения = 567, контрольная сумма = 8187187545500, цикл через рекурсию
Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.
Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.
Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.
Закрытие терминала должно быть осознанным шагом во многих случаях.
Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.
Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.
Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.
Закрытие терминала должно быть осознанным шагом во многих случаях.
Андрей, вместо того чтобы приучить себя к внимательности вы пытаетесь напрячь разработчиков и устроить проблему большинству пользователей терминалом. Лично мне это не только не надо, а меня бесит такая проверка. Ведь если утрировать, то получается такое предупреждение можно произнести так: «Ты идиот, сам не понимаешь что творишь, ты уверен, что с ума не сошёл…» и всё в том-же духе. Не принимайте это в свой адрес… А потом найдётся такой который будет тыкать не думая два раз подряд и запросит два подтверждения и больше.
И ещё, разве у вас маленький монитор? Разве обязательно окно должно быть развёрнуто во весь экран? У меня всего 27 дюймов и ни одно окно не развёрнуто во весь экран при моём старческом зрении.
проверил. Результаты неожиданные для меня. Вариант с bool() работает на ~75%(!!!) медленнее. Видимо преобразование типов (даже bool) весьма затратная штука. Помнится, об этом несколько раз говорил Ренат.
рекурсия с циклом while сейчас почти одинаковые и самые быстрые. Значит Ильяс починил.
цикл for на ~35% медленнее, чем while, и почти одинаков по производительности do while
Вывод: для максимальной производительности используйте цикл while!
А если не объявлять в каждом цикле for новую int i, а использовать ту, что есть?
Да, мне тоже очень понравился такой вариант.
Раньше я пользовался таким
Спасибо fxsaber, я тоже беру в пользование ваш вариант.
Выяснили же уже, что по быстродействию он проигрывает циклу for в классическом варианте.
А я сначала пишу, а потом читаю.
Точней, я сначала ответил прочитав только то сообщение которое процитировал, а потом дочитал страницу до конца.
В принципе да, скорость важна. Но для наших задач, на мой взгляд не критично. Хотя я уже всё чаще использую циклы while, особенно в индикаторах.
Видимо преобразование типов (даже bool) весьма затратная штука.
Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.
Не знаю, почему int-вариант тормозит, а uint - нет.
цикл for на ~35% медленнее, чем while
У меня включена оптимизация, запуск release-версии. См. выше.
Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.
Не знаю, почему int-вариант тормозит, а uint - нет.
У меня включена оптимизация, запуск release-версии. См. выше.
Да, я уже понял свой косяк. Спасибо.
но на моем процессоре все равно с bool() медленее примерно в полтора раза.
Так же включена максимальная оптимизация.
Но на цикл for я зря гнал. А вот do while тоже отстает на 50% на моем процессоре.
Подозреваю, что действительно сильно от железа зависят все эти оптимизации.
Мои результаты:
Огромная просьба к разработчикам:
Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.
Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.
Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.
Закрытие терминала должно быть осознанным шагом во многих случаях.
Огромная просьба к разработчикам:
Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.
Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.
Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.
Закрытие терминала должно быть осознанным шагом во многих случаях.
Андрей, вместо того чтобы приучить себя к внимательности вы пытаетесь напрячь разработчиков и устроить проблему большинству пользователей терминалом. Лично мне это не только не надо, а меня бесит такая проверка. Ведь если утрировать, то получается такое предупреждение можно произнести так: «Ты идиот, сам не понимаешь что творишь, ты уверен, что с ума не сошёл…» и всё в том-же духе. Не принимайте это в свой адрес… А потом найдётся такой который будет тыкать не думая два раз подряд и запросит два подтверждения и больше.
И ещё, разве у вас маленький монитор? Разве обязательно окно должно быть развёрнуто во весь экран? У меня всего 27 дюймов и ни одно окно не развёрнуто во весь экран при моём старческом зрении.
да вполне нормально, выделить тестер другим цветом. И жутко бесит, что он всегда Не полноэкранным открывается, какой в этом смысл?
Это споры о вкусах.