MQL5におけるOOPに関する質問 - ページ 65

 
Sergey Dzyublik:

構造体とクラス(newなし)について忘れているもの - どちらもスタック上で目立つ。

C++と混同しないように、シャープに近いです

 
Maxim Kuznetsov:

C++と混同しないように、シャープに近いです

これはあなたの妄想であって、現実ではない。
自分でテストしていないことを証明してはいけない...。
構造体やクラスのオブジェクトとしてローカル変数を作成する(newしない)ことは、スタック上で行われます。
先ほど、MT5で配列がどのように機能 するかを説明しました。

 
Dmitry Fedoseev:

なんということでしょう。

1 -オブジェクトの作成を通して。2 - 単純に通常の関数呼び出しによって。最初の数字はミリ秒単位の時間、2番目は気にしないでください。

ほぼ10倍(時には10倍以上)速くなりました。なんて悲しいんだ...。スタック...パイル...***チャ

では、なぜ注意を払わないのか?推測するに、INT_MAXはかつて一時的なオブジェクトの作成によって動作を行い、その後、関数呼び出しによって同じ動作を行ったのでしょうか?

まあ、ランタイムでクラスの作成をまだ踊っていることを考えれば、予想通りの結果です(それでも、何らかのコンテナのインデックスのようなこのハンドルは得られるはずです)。

PS.リプレイのソースコードはどこだ?

PPSです。関数が呼び出されたことは間違いないのでしょうか?とにかく、オプティマイザはこのコードにもあり、ランタイムに関数呼び出しがあるということではありません。

for (int i=0;i<500;++i){
   int x=Get(i);}

int Get(int x) {return -x;}

mqlのUBがあることが、このコードの証明になる。

void OnStart(){
   Print(Test()?"Ok":"No");
}

bool Test (void)
{
  const int MAX = 1000;
  int a=1,b=1,c=1;
  while (1) {
    if (((a*a*a) == ((b*b*b)+(c*c*c)))) return true;
    a++;
    int x=Get(a);
    if (a>MAX) {
      a=1;
      b++;
    }
    if (b>MAX) {
      b=1;
      c++;
    }      
    if (c>MAX) {
      c=1;
    }
  }
  return false;
}
 
Vladimir Simakov:

mqlにUBがあることが、このコードを証明している。


- while(1)ループから抜け出せないため、falseブランチを投げています。
- が返されます。これは、「外の世界」とは一切関係なく、ローカル 変数に対して操作が行われるためで、このコードの実行もスローアウトされます。

 
Sergey Dzyublik:


- while(1)ループから抜け出せないため、false branchが投げられました。
- が返されます。これは、「外の世界」とは一切関係なく、ローカル 変数に対して操作が行われるためで、このコードの実行もスローアウトされます。

私ではありません。インターネット上の例の一つです。プラスアルファと同じです。

 
Vladimir Simakov:

なぜ注意を払わないのか?推測するに、INT_MAXは一度テンポラリーオブジェクトの作成で動作を行い、その後関数呼び出しで同じ動作を行ったのでしょうか?

全体として、これはまだランダム化でクラスの作成に踊らされていることを考慮すると、予想通りの結果です(何らかのコンテナのインデックスのように見えるこのハンドルが得られるはずです)。

PS.リプレイのソースコードはどこだ?

PPSです。関数が呼び出されたことは間違いないのでしょうか?とにかく、オプティマイザはこのコードにもあり、ランタイムに関数呼び出しがあるということではありません。

UBがmqlにあることが、このコードを証明している。

あなたは間違っています。ここで推測する必要はなく、昨日を思い出せばいいのです。記憶力に問題がある場合は、引用文に目を通して、議論の内容を確認することもできます。以前は逆のことを主張していたのに、なぜ急に予想通りの結果になったのですか?

はい、関数が呼び出されたのは確かです。そして、皆さんは私が馬鹿だと夢見るのが好きなんですか?なぜ、機能についてのみの質問で、オブジェクトも作成されていないのでは?それとも、すべてのコンパイラの仕組みを知っているとでもいうのでしょうか?

 
Sergey Dzyublik:

ちょっと頭が悪いので、どんな内容か説明してもらえますか?3回読みましたが、まだ理解できません...。

引用元を見れば、何のことかわかる。引用したもの、そして引用したものに対して、こんな反応がありました。

 
と、今までの会話はすべてそんなくだらないものに...。スタックについて、配列文字列について・・・。スタック上」を通した説明は通用しない。
 

Dimitriは恥ずかしくて自分のコードを投稿できないので、自分で15分ほどテストすることになりました。

おっとっと。同じ操作であれば、その差はわずか30%です。

class CTest{
   static uint count;
   static double temp;
   int i;
public:
   CTest(int _x):i(_x){++count; temp+=(double)GetMicrosecondCount(); temp/=count;}
   ulong Get() {return GetMicrosecondCount()+i;}
   static uint Count()  {return count;}
   static double Temp() {return temp;}
};

int i=1;
double temp;

uint CTest::count=0;
double CTest::temp=0.0;

void OnStart(){
   ulong t=GetMicrosecondCount();
   for (;i<1000001;++i){
      temp+=(double)CTest(i).Get();
      temp/=i;}
   ulong _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(CTest::Count());
   Print(CTest::Temp());
   t=GetMicrosecondCount();
   for (;i<2000001;++i){
      temp+=(double)Test(i);
      temp/=i;}
   _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(temp);
}

ulong Test(int x) {
   static uint count=0;
   static double _temp=0.0;
   ++count;
   _temp+=(double)GetMicrosecondCount();
   _temp/=count;
   return GetMicrosecondCount()+x;}

静的変数や フィールドを使わなくても、ランタイムの差は解消されない。パーセンテージではなく、マイクロ秒の差なんです。

結論:スタック上に一時的なオブジェクトを作成するコストは、私の最速ではないコンピュータでは30〜40ns/pc(ナノ秒)程度と十分小さいので、ほとんどの場合、注意を払うべきでしょう。

PS.と、開発者のことを悪く考えてしまいましたが、いやいや、人の言葉を鵜呑みにして確認しなければいいだけの話です)))

 
Vladimir Simakov:

Dimitriは恥ずかしくて自分のコードを投稿できないので、自分で15分ほどテストすることになりました。

おっとっと。同じ操作であれば、その差はわずか30%です。

静的変数や フィールドを使わなくても、ランタイムの差は解消されない。パーセンテージではなく、マイクロ秒の差なんです。

結論:スタック上に一時的なオブジェクトを作成するコストは、私の最速ではないコンピュータでは30〜40ns/pc(ナノ秒)程度と十分小さいので、ほとんどの場合、注意を払うべきでしょう。

PS.と、開発者の方に悪いことを考えましたが、いやいや、人の言葉を鵜呑みにして確認しないだけでしょう)))

さらに内部でいろいろな計算をすると、その差はさらに小さくなります。いずれにせよ、このテストは同一機能のテストとは言い難い。

それに、テストそのものが同一ではないのです。