У меня на очень больших повторах победа стала случайной у первого и второго способа... скорее всего стало зависит от кэша проца на текущий момент и общей загрузки.
Вопрос был не касаемо цикла - а касаемо разворачивания функции. Просто в качестве примера был ArraySize
Это хорошо) Совершенство высокоуровневого языка как раз и проявляется когда удобная запись так же дешева, как и не удобная, но изначально дешевая. Жаль не всегда так, и справка с хелпом для новеньких совсем тоже не всегда..... вопросов бы не было бы)))
если в тело цикла внести ищменеие размеров массивов, то оптимищация на лету уже не работает
так код измените:
не выходит
runtime оптимизация в лидерах будет
не получится такие простые машшиные команды без профилировщика протестировать, в общем, что хотите можете в цикле писать, как вариант в тестере протестировать, для него важна скорость
Речь шла не про цикл а то как компилятор функции разворачивает..... да ладно в общем.
)))) просто вам также предается менять значение своей переменной size, а значит именной первый способ с использованием ArraySIze будет в выигрыше
выше дописал - не тестируется такой простой код просто замерами, очень много факторов - код мал по размеру - он весь в кеш процессора поместится, код должен хорошо разбиваться в процессоре на параллельные микрокоманды в конвейере процессора, т.е. регистры будут быстро загружаться предвыборкой данных
ну и возможно rand() тоже где то хорошо начал кэшироваться
в общем я не знаю как тут тестировать без дебагера - там хоть время исполнения инструкций в тактах можно посмотреть
Изменил свой пост. Как то наоборот получается ArraySize теперь быстрее отрабатывает, чем переменная cnt. Раньше наоборот было. Наверно инкремент cnt-- влияет, тело цикла разные и наверно надо что то другое придумать для нагрузки.
voidOnStart()
{
int arr[];
int sz = ArrayResize(arr, 100000000);
ulong t = GetMicrosecondCount();
for(int i=0; i < ArraySize(arr); i++)
{
ArrayResize(arr, sz--); //какая то нагрузка
}
t = GetMicrosecondCount() - t;
PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.0221:33:22.863 TestScript (USDJPY,M1) Total time: 451.200 ms
voidOnStart()
{
int arr[];
int sz = ArrayResize(arr, 100000000);
int cnt = ArraySize(arr);
ulong t = GetMicrosecondCount();
for(int i=0; i < cnt; i++)
{
ArrayResize(arr, sz--);
cnt--;
}
t = GetMicrosecondCount() - t;
PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.0221:56:26.591 TestScript (USDJPY,M1) Total time: 531.872 ms
Что то странно. Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt. Раньше было наоборот. Может это ошибка? И так быть не должно.
Вы ничего не перепутали в своем коде, кто за вас будет значение
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
Что то странно. Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt. Раньше было наоборот. Может это ошибка? И так быть не должно.
Там случайный результат. При компиляции разворачивается доступ к ячейке памяти со значением размера массива, а размер массива будет получен и помещен в ячейку памяти заранее, при формировании массива, даже если массив динамический, и ячейки с размером массива и со значением переменной будут одинаковы по времени доступа.
Ну и судя по фразе, что компиляторы делают на 3-4 курсе информатики ... в общем буду надеяться что достаточно необходимый уровень кадров не даст мне сильно нервничать в среде МКЛ)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
если в тело цикла внести ищменеие размеров массивов, то оптимищация на лету уже не работает
так код измените:
)))) просто вам также предается менять значение своей переменной size, а значит именной первый способ с использованием ArraySIze будет в выигрыше
Ну против ИМХО я ничего не могу сказать.
У меня на очень больших повторах победа стала случайной у первого и второго способа... скорее всего стало зависит от кэша проца на текущий момент и общей загрузки.
Вопрос был не касаемо цикла - а касаемо разворачивания функции. Просто в качестве примера был ArraySize
Это хорошо) Совершенство высокоуровневого языка как раз и проявляется когда удобная запись так же дешева, как и не удобная, но изначально дешевая. Жаль не всегда так, и справка с хелпом для новеньких совсем тоже не всегда..... вопросов бы не было бы)))
если в тело цикла внести ищменеие размеров массивов, то оптимищация на лету уже не работает
так код измените:
не выходит
runtime оптимизация в лидерах будет
не получится такие простые машшиные команды без профилировщика протестировать, в общем, что хотите можете в цикле писать, как вариант в тестере протестировать, для него важна скорость
Речь шла не про цикл а то как компилятор функции разворачивает..... да ладно в общем.
Оставлю я вас
)))) просто вам также предается менять значение своей переменной size, а значит именной первый способ с использованием ArraySIze будет в выигрыше
выше дописал - не тестируется такой простой код просто замерами, очень много факторов - код мал по размеру - он весь в кеш процессора поместится, код должен хорошо разбиваться в процессоре на параллельные микрокоманды в конвейере процессора, т.е. регистры будут быстро загружаться предвыборкой данных
ну и возможно rand() тоже где то хорошо начал кэшироваться
в общем я не знаю как тут тестировать без дебагера - там хоть время исполнения инструкций в тактах можно посмотреть
дак докажите мне обратное)
а то у меня в тесте почему-то они одинаковые
Изменил свой пост.
Как то наоборот получается ArraySize теперь быстрее отрабатывает, чем переменная cnt.
Раньше наоборот было. Наверно инкремент cnt-- влияет, тело цикла разные и наверно надо что то другое придумать для нагрузки.
Что то странно.
Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt.
Раньше было наоборот. Может это ошибка? И так быть не должно.
Вы ничего не перепутали в своем коде, кто за вас будет значение
cntизменять, как это происходит в первом варианте
Вопрос на 500р (без проверки), какой способ быстрее. смотри сколько в верхнем методе вызывается всяких внешних функций
как вариант теста - можно еще подсунуть в каждый тест только свои массивы - в моем примере arr1,arr2..
т.е. будет tst1_arr1[],tst1_arr2[] .... и tst2_arr1[],tst2_arr2[]
это будет более честный тест
я офф, сильно отвлекает - имхо, удобно, пользуйтесь
в общем я не знаю как тут тестировать без дебагера - там хоть время исполнения инструкций в тактах можно посмотреть
Ну, да - без отладчика никуда. А в тактах там ...
Что то странно.
Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt.
Раньше было наоборот. Может это ошибка? И так быть не должно.
Там случайный результат. При компиляции разворачивается доступ к ячейке памяти со значением размера массива, а размер массива будет получен и помещен в ячейку памяти заранее, при формировании массива, даже если массив динамический, и ячейки с размером массива и со значением переменной будут одинаковы по времени доступа.
Ну и судя по фразе, что компиляторы делают на 3-4 курсе информатики ... в общем буду надеяться что достаточно необходимый уровень кадров не даст мне сильно нервничать в среде МКЛ)