Alexey Navoykov: Il ne semble pas s'agir d'opérations arithmétiques, car il n'y en a pas, toutes les valeurs sont calculées à la compilation. La raison est la présence d'une boucle avec un nombre inconnu d'itérations (bien que ces itérations soient en moyenne inférieures à deux). Votre code est donc en quelque sorte optimisé par un nombre connu d'appels à rand().
Non, bien sûr que non. Ce générateur est implémenté dans le matériel. Cette vitesse ne peut être atteinte par un logiciel - c'est évident.
En fait, le matériel implémente un générateur RAND(), alors que rand() est un générateur pseudo-aléatoire.
MathRand
Renvoie un nombre entier pseudo-aléatoire compris entre 0 et 32767.
Je ne suis pas très familier avec le matériel, mais vous serez probablement déçu - il ne semble pas fonctionner très rapidement, il n'est bon que comme graine pour le pseudo-aléatoire.
En fait, le matériel implémente un générateur RAND(), alors que rand() est un pseudo-aléatoire, c'est écrit dans le manuel
Je ne suis pas très familier avec le matériel, mais vous serez probablement déçu - il ne semble pas fonctionner très rapidement, il n'est bon que comme semence pour le pseudo-aléatoire.
Eh bien, oui, le pseudo est aussi poussé dedans. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Eh bien, oui, ils ont mis un pseudo aussi. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Je n'exclus pas que vous puissiez avoir raison. Si j'ai une minute de libre, je vais essayer de mettre en œuvre quelque chose de similaire. Bien que je doute de pouvoir le faire en une nanoseconde, mais si je peux m'éloigner des cycles, je pense pouvoir le faire en 5.
Mais j'en suis sûr - rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Oui, vous avez peut-être raison. Cette variante de la fonction rand16() générant des nombres pré-aléatoires fonctionne moins de la moitié de la lenteur de la fonction originale et génère des nombres aléatoires de 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;
}
c'est-à-dire moins de 2 nanosecondes.
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-поле.
}
En outre, l'objet de la classe est 16 octets plus grand que l'objet d'une structure POD similaire. Ainsi, les réseaux de structures sont encore plus économiques.
fxsaber: En outre, l'objet de la classe est 16 octets plus grand que l'objet d'une structure POD similaire. Ainsi, les réseaux de structures sont encore plus économiques.
Si Symbol() est appelé à l'intérieur d'une classe/structure sans : :, il peut être plus pratique qu'une variable prédéfinie, car vous pouvez faire une substitution rapide en déclarant une méthode avec le même nom.
Il ne semble pas s'agir d'opérations arithmétiques, car il n'y en a pas, toutes les valeurs sont calculées à la compilation. La raison est la présence d'une boucle avec un nombre inconnu d'itérations (bien que ces itérations soient en moyenne inférieures à deux). Votre code est donc en quelque sorte optimisé par un nombre connu d'appels à rand().
https://www.mql5.com/ru/forum/308881/page3#comment_11222192
Qu'est-ce que les développeurs de processeurs ont à voir là-dedans ? Le générateur est implémenté par logiciel.
Non, ça ne l'est pas. Ce générateur est implémenté dans le matériel. Cette vitesse ne peut être atteinte par un logiciel - c'est évident.
Non, bien sûr que non. Ce générateur est implémenté dans le matériel. Cette vitesse ne peut être atteinte par un logiciel - c'est évident.
En fait, le matériel implémente un générateur RAND(), alors que rand() est un générateur pseudo-aléatoire.
MathRand
Renvoie un nombre entier pseudo-aléatoire compris entre 0 et 32767.
En fait, le matériel implémente un générateur RAND(), alors que rand() est un pseudo-aléatoire, c'est écrit dans le manuel
Je ne suis pas très familier avec le matériel, mais vous serez probablement déçu - il ne semble pas fonctionner très rapidement, il n'est bon que comme semence pour le pseudo-aléatoire.clairement - pseudo.
Random est beaucoup plus lent(https://en.wikipedia.org/wiki/RdRand)
Clairement pseudo.
le hasard fonctionne beaucoup plus lentement(https://en.wikipedia.org/wiki/RdRand)
Eh bien, oui, le pseudo est aussi poussé dedans. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Eh bien, oui, ils ont mis un pseudo aussi. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Mais j'en suis sûr - rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.
Oui, vous avez peut-être raison.
Cette variante de la fonction rand16() générant des nombres pré-aléatoires fonctionne moins de la moitié de la lenteur de la fonction originale et génère des nombres aléatoires de 0 à 65535.
c'est-à-dire moins de 2 nanosecondes.
En outre, l'objet de la classe est 16 octets plus grand que l'objet d'une structure POD similaire. Ainsi, les réseaux de structures sont encore plus économiques.
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading
Quelle est la différence entre Symbol() et _Symbol
fxsaber, 2019.07.07 14:47
Si Symbol() est appelé à l'intérieur d'une classe/structure sans : :, il peut être plus pratique qu'une variable prédéfinie, car vous pouvez faire une substitution rapide en déclarant une méthode avec le même nom.