mql5语言的特点、微妙之处以及技巧 - 页 137

 
Alexey Navoykov:
这似乎与算术运算 无关,因为没有算术运算,所有的值都是在编译阶段计算出来的。 原因是存在一个迭代次数未知的循环(尽管这些迭代平均不到两次)。 所以你的代码在某种程度上是通过已知的rand()调用次数来优化的

https://www.mql5.com/ru/forum/308881/page3#comment_11222192

 
Vict:

处理器开发人员与此有什么关系?该发生器是由软件实现的。

不,不是的。这个发生器是用硬件实现的。这种速度不可能通过软件来实现--这很明显。

 
Nikolai Semko:

不,当然不是。这个发生器是用硬件实现的。这种速度无法通过软件来实现--这是显而易见的。

实际上,硬件实现的是一个RAND()发生器,而rand()是一个伪随机的。

数学符号(MathRand)

返回一个范围在0到32767的伪随机 整数。

我对硬件不是很熟悉,但你可能会感到失望--它似乎工作得并不快,它只适合作为伪随机的种子。
 
Vict:

嗯,实际上,硬件实现了一个RAND()发生器,而rand()是一个伪随机的,它写在手册中

我对硬件的那个不是很熟悉,但你可能会感到失望--它似乎运行得不是很快,它只适合作为伪随机的种子。

显然--假的。

随机的速度要慢得多(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

显然是假的。

随机运行速度更慢(https://en.wikipedia.org/wiki/RdRand)

嗯,是的,伪装也被塞进去了。但我确信--rand()是通过程序实现的。也许有一位路过的 "老 "同志会证实这一点。

 
Vict:

嗯,是的,他们也放了一个伪装者。但我确信--rand()是通过程序实现的。也许有一位路过的 "老 "同志会证实这一点。

我不排除你可能是对的。如果我有空闲时间,我将尝试实现类似的东西。虽然我怀疑我是否能在一纳秒内完成,但如果我能摆脱周期,我想我可以在5分钟内完成。
 
Vict:

但我确信--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.09 23:52:15.855 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 9068  микросекунд. Всего сгенерировано 4655770 случайных чисел rand()
2019.06.09 23:52:17.892 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 16562 микросекунд. Всего сгенерировано 4655770 случайных чисел rand16()
2019.06.09 23:52:19.940 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 22299 микросекунд. Всего сгенерировано 4655770 случайных чисел get_rand()
2019.06.09 23:52:21.986 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 20094 микросекунд. Всего сгенерировано 4655770 случайных чисел randUlong()
2019.06.09 23:52:24.020 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 14660 микросекунд. Всего сгенерировано 4655770 случайных чисел randUint()
2019.06.09 23:52:26.053 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 12543 микросекунд. Всего сгенерировано 4655770 случайных чисел randShort()
2019.06.09 23:52:28.095 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 20883 микросекунд. Всего сгенерировано 4655770 случайных чисел RandomLong()
附加的文件:
 
// Некоторые возможности структур, которых нет у классов.

// #define struct class // Смотрим ошибки, которые возникают при замене структур на классы.

struct A
{
public:  
  int i;
  
  uint Save( const int handle) { return(FileWriteStruct(handle, this)); } // Запись себя
  uint Load( const int 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( const int 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);   // Из массива байтов  
}

void OnStart()
{
  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-поле.    
}
此外,该类对象 比类似POD结构的对象大16个字节。因此,阵列式结构甚至更经济。
 
fxsaber:
此外,该类对象 比类似POD结构的对象大16个字节。因此,阵列式结构甚至更经济。
课堂上!
 
引用的主题标题中的问题的答案之一是

关于交易、自动交易系统和测试交易策略的论坛

Symbol()和_Symbol之间有什么不同?

fxsaber, 2019.07.07 14:47

void Func( const string& ) {}

void OnStart()
{
  Func(Symbol()); // ERROR: 'Symbol' - parameter passed as reference, variable expected
  Func(_Symbol);  // OK   
}

如果Symbol()在一个没有::的类/结构中被调用,它可能比预定义变量更方便,因为你可以通过声明一个同名的方法来进行快速替换。