Alexey Navoykov: Похоже дело таки не в арифметических операциях, ибо их там и нет, все значения вычисляются на стадии компиляции. Причина - в наличии цикла с неизвестным числом итераций (хотя этих итераций в среднем выходит менее двух). Значит ваш код каким-то образом оптимизируется за счёт известного количества вызовов rand()
Нет конечно. Этот генератор реализован аппаратно. Программно такой скорости не достичь - это очевидно.
Ну вообще-то аппаратно реализуют СЛУЧАЙНЫЙ генератор, а rand() - псевдослучайный, об этом в справочнике написано
MathRand
Возвращает псевдослучайное целое число в диапазоне от 0 до 32767.
Я с аппаратным не очень знаком, но, наверное, вас ждет разочарование - вроде работает не очень то и быстро, годится лишь как seed для псевдослучайного.
Ну вообще-то аппаратно реализуют СЛУЧАЙНЫЙ генератор, а rand() - псевдослучайный, об этом в справочнике написано
Я с аппаратным не очень знаком, но, наверное, вас ждет разочарование - вроде работает не очень то и быстро, годится лишь как seed для псевдослучайного.
Ну да, всунули и псевдо. Но уверен - rand() реализован программно. Возможно кто-то из "старших" товарищей проходя мимо это подтвердит.
не исключаю, что может Вы и правы. Будет свободная минутка, надо попробовать реализовать что то подобное. Хоть и сомневаюсь, что удасться уложиться в наносекунду, но если удасться уйти от циклов, то в 5 думаю можно уложиться.
Но уверен - rand() реализован программно. Возможно кто-то из "старших" товарищей проходя мимо это подтвердит.
Да, пожалуй, Вы правы. Вот такой вариант функции rand16() генерации превдослучайных чисел работает менее чем в два раза медленее оригинальной функции и генерирует случайные числа от 0 до 65535.
ushort rand16() { return(((ushort)rand8()<<8)|(ushort)rand8());}
uchar rand8()
{
staticushort s[10] = { 0x52, 0x8e, 0xdc, 0x61, 0x35, 0xbc, 0x5c, 0xb6 };
staticushort c = 0xa6;
staticint i = 0;
ushort t;
uchar x;
x = (uchar)s[i];
t = (ushort)x + c;
c = t >> 8;
c += x;
x = (uchar)t & 255;
s[i] = x;
i++;
i=i&7;
return x;
}
т.е. меньше 2 наносекунд.
2019.06.0923:52:15.855 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 9068 микросекунд. Всего сгенерировано 4655770 случайных чисел rand()
2019.06.0923:52:17.892 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 16562 микросекунд. Всего сгенерировано 4655770 случайных чисел rand16()2019.06.0923:52:19.940 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 22299 микросекунд. Всего сгенерировано 4655770 случайных чисел get_rand()
2019.06.0923:52:21.986 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 20094 микросекунд. Всего сгенерировано 4655770 случайных чисел randUlong()
2019.06.0923:52:24.020 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 14660 микросекунд. Всего сгенерировано 4655770 случайных чисел randUint()
2019.06.0923:52:26.053 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 12543 микросекунд. Всего сгенерировано 4655770 случайных чисел randShort()
2019.06.0923:52:28.095 TestSpeedRand (US30Index,H1) Время формирования случайных массивов = 20883 микросекунд. Всего сгенерировано 4655770 случайных чисел RandomLong()
// Некоторые возможности структур, которых нет у классов.// #define struct class // Смотрим ошибки, которые возникают при замене структур на классы.struct A
{
public:
int i;
uint Save( constint handle) { return(FileWriteStruct(handle, this)); } // Запись себяuint Load( constint handle) { return(FileReadStruct(handle, this)); } // Чтение себя
};
// Использование в объединенияхunion UNION
{
uchar b1[sizeof(A)];
A b2;
};
// Выравниваниеstruct pack(sizeof(A)) B : public A
{
short j;
};
// Структура со скрытым полемstruct C : private A
{
public:
void Set( constint Num ) { this.i = Num; }
int Get( void ) const { return(this.i); }
};
// Структура с неизменяемым полем.struct D
{
public:
const A a;
};
template <typename T1, typename T2>
void FromTo( const T1 &ValueFrom, T2 &ValueTo )
{
uchar Bytes[];
StructToCharArray(ValueFrom, Bytes); // В массив байтовCharArrayToStruct(ValueTo, Bytes); // Из массива байтов
}
voidOnStart()
{
A a[1] = {0};
FileReadArray(0, a); // Чтение массиваFileWriteArray(0, a); // Запись массиваArrayCopy(a, a); // Копирование массивовZeroMemory(a); // Обнуление массивов
C c; // Структура со скрытым полем
c.Set(7);
FromTo(c, a[0]);
Print(a[0].i); // Достали значение приватного поля из C.
D d; // Структура с неизменяемым полем.
a[0].i = 5;
FromTo(a[0], d);
Print(d.a.i); // Изменили const-поле.
FromTo(a[0], c);
Print(c.Get()); // Изменили private-поле.
}
Как дополнение, объект класса на 16 байтов больше объекта аналогичной POD-структуры. Т.е. массивы структур получаются еще экономнее.
Если же Symbol() вызывается внутри класса/структуры без ::, то это может быть удобней предопределенной переменной, т.к. можно сделать быструю подмену, объявив одноименный метод.
Похоже дело таки не в арифметических операциях, ибо их там и нет, все значения вычисляются на стадии компиляции. Причина - в наличии цикла с неизвестным числом итераций (хотя этих итераций в среднем выходит менее двух). Значит ваш код каким-то образом оптимизируется за счёт известного количества вызовов rand()
https://www.mql5.com/ru/forum/308881/page3#comment_11222192
При чём тут разработчики процессоров? Генератор - программно реализован.
Нет конечно. Этот генератор реализован аппаратно. Программно такой скорости не достичь - это очевидно.
Нет конечно. Этот генератор реализован аппаратно. Программно такой скорости не достичь - это очевидно.
Ну вообще-то аппаратно реализуют СЛУЧАЙНЫЙ генератор, а rand() - псевдослучайный, об этом в справочнике написано
MathRand
Возвращает псевдослучайное целое число в диапазоне от 0 до 32767.
Ну вообще-то аппаратно реализуют СЛУЧАЙНЫЙ генератор, а rand() - псевдослучайный, об этом в справочнике написано
Я с аппаратным не очень знаком, но, наверное, вас ждет разочарование - вроде работает не очень то и быстро, годится лишь как seed для псевдослучайного.ясень пень- псевдо.
случайные выполняются гораздо медленнее (https://en.wikipedia.org/wiki/RdRand)
ясень пень- псевдо.
случайные выполняются гораздо медленнее (https://en.wikipedia.org/wiki/RdRand)
Ну да, всунули и псевдо. Но уверен - rand() реализован программно. Возможно кто-то из "старших" товарищей проходя мимо это подтвердит.
Ну да, всунули и псевдо. Но уверен - rand() реализован программно. Возможно кто-то из "старших" товарищей проходя мимо это подтвердит.
Но уверен - rand() реализован программно. Возможно кто-то из "старших" товарищей проходя мимо это подтвердит.
Да, пожалуй, Вы правы.
Вот такой вариант функции rand16() генерации превдослучайных чисел работает менее чем в два раза медленее оригинальной функции и генерирует случайные числа от 0 до 65535.
т.е. меньше 2 наносекунд.
Как дополнение, объект класса на 16 байтов больше объекта аналогичной POD-структуры. Т.е. массивы структур получаются еще экономнее.
Forum on trading, automated trading systems and testing trading strategies
What is different between Symbol() and _Symbol
fxsaber, 2019.07.07 14:47
Если же Symbol() вызывается внутри класса/структуры без ::, то это может быть удобней предопределенной переменной, т.к. можно сделать быструю подмену, объявив одноименный метод.