私のアプローチコアはエンジンです。 - ページ 123

 
Реter Konow:

...

ZS.再描画でプロセッサに負荷がかかっている可能性もありますが。つまり、画素の配列の中に描画することです。つまり、タイマーの高い周波数(16ms)で、常に配列の値を初期化 する。

いいえ、再描画はプロセッサに負荷をかけるものではなく、グラフィックスドライバにコマンドを送るために数ナノ秒からせいぜいマイクロ秒の時間がかかるだけなのです。ビデオカードのプロセッサーは、画素単位で描画そのものを行いますが、通常は数百個あり、プロセッサーと同時に並行して動作しています。つまり、プロセッサはグラフィックスドライバに対して、「画面座標Xc,Ycに中心を持ち、半径Rの円をCopyPutモードで表示せよ」という命令を出すのです。プロセッサにとっては、これはパラメータを渡された単なる関数呼び出しに過ぎない。それ以上には踏み込まない。このような呼び出しは、例えば、2回/秒よりも頻繁に行われないと、ユーザーは単に画面上の何かを理解することはできません、それはそう頻繁に引っ張ることはできません。未決済取引のリストであれば、1時間、1日、あるいはそれ以上かかることも想像できます。

そして、ピクセル単位の色付けのアルゴリズム(例えば「Bresenham Algorithm」でググってみてください)はグラフィックカードが実行し、プロセッサはそれをダラダラと見ているわけではありません。また、実行速度も非常に速い。そして...1回の通話で1回。16msでの再初期化は必要なく、プロセッサの指令で新たに変更が加えられるまで、画面イメージはビデオメモリ内で一定に保たれる。それだけでなく、目に見える画面の反応を速くするために、ビデオメモリも2つのインスタンスで保持し、見えないほうに変更を加えてから、すぐにビデオページを切り替えます。

もし、あなたの画面出力へのアプローチがまだ、あなたが言うようなピクセルの「配列の 一定の初期化」を持っているならば、それを取り除くべきです。

 
Реter Konow:

クリックすると表示されます。

写真のOpening Timeの欄のデータがおかしい。

 
Vladimir:

いいえ、再描画はプロセッサに何の負荷もかけず、せいぜい数ナノ秒からマイクロ秒の時間をかけてグラフィックスドライバにコマンドを送るだけです。ビデオカードのプロセッサーは、画素ごとに描画そのものを行うが、通常は数百個あり、プロセッサーと同時に並列に動作する。つまり、プロセッサはグラフィックスドライバに対して、「画面座標Xc,Ycに中心を持ち、半径Rの円をCopyPutモードで表示せよ」という命令を出すのです。プロセッサにとっては、これはパラメータを渡された単なる関数呼び出しに過ぎない。それ以上には踏み込まない。このような呼び出しは、例えば、2回/秒よりも頻繁に行われないと、ユーザーは単に画面上の何かを理解することはできません、それはそんなに頻繁に引っ張ることはできません。未決済取引のリストであれば、1時間、1日、あるいはそれ以上かかることも想像できます。

そして、ピクセル単位の色付けのアルゴリズム(例えば「Bresenham Algorithm」でググってみてください)はグラフィックカードが実行し、プロセッサはそれをダラダラと見ているわけではありません。また、実行速度も非常に速い。そして...1回の通話で1回。16msでの再初期化は必要なく、プロセッサの指令で新たに変更が加えられるまで、画面イメージはビデオメモリ内で一定に保たれる。それだけでなく、目に見える画面の反応を速くするために、ビデオメモリーを2つに分けて保持し、見えないほうに変更を加えてから、すぐにビデオページを切り替えるようにしています。

もし、画面出力のアプローチに、あなたが言うようなピクセルの「永久配列初期化」が残っているならば、それは取り除くべきでしょう。

なんということでしょう・・・。
断片的な知識の寄せ集めのような...。

結局、そういうわけにはいかないんです。

 
Vladimir:

いいえ、再描画はプロセッサに何の負荷もかけず、せいぜい数ナノ秒からマイクロ秒程度でグラフィックスドライバにコマンドを送信する程度です。ビデオカードのプロセッサーは、画素ごとに描画そのものを行うが、通常は数百個あり、プロセッサーと同時に並列に動作する。つまり、プロセッサはグラフィックスドライバに対して、「画面座標Xc,Ycに中心を持ち、半径Rの円をCopyPutモードで表示せよ」という命令を出すのです。プロセッサにとっては、これはパラメータを渡された単なる関数呼び出しに過ぎない。それ以上には踏み込まない。このような呼び出しは、例えば、2回/秒よりも頻繁に行われないと、ユーザーは単に画面上の何かを理解することはできません、それはそう頻繁に引っ張ることはできません。未決済取引のリストであれば、1時間、1日、あるいはそれ以上かかることも想像できます。

そして、ピクセル単位の色付けのアルゴリズム(例えば「Bresenham Algorithm」でググってみてください)はグラフィックカードが実行し、プロセッサはそれをダラダラと見ているわけではありません。また、実行速度も非常に速い。そして...1回の通話で1回。16msでの再初期化は必要なく、プロセッサの指令で新たに変更が加えられるまで、画面イメージはビデオメモリ内で一定に保たれる。それだけでなく、見える画面の反応を早くするために、ビデオメモリも二重化しておき、見えないほうに変更を加えてから、すぐにビデオページを切り替えています。

もし、あなたの出力へのアプローチが、まだピクセルの「配列の 一定した初期化」を持っているならば、それを取り除く必要があります。

面白い理論ですね。しかし、私の実験結果とは全く合わないので、これから下に掲載します。

テストが示すように、CPUに最も負荷をかけるのは画素配列の初期化です。

以下のテストEAをご確認ください。

 

正直なところ、このテスト結果には少し驚きました。

そして、16msの頻度でコンスタントに関数が呼び出されるという話です。

その結果、プロセッサに最も負荷をかけるのは、描画時の画素配列の初期化 であることが判明しました。

しかし、一番不思議だったのは、繰り返される関数呼び出しが

ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);

の場合、プロセッサに10〜15%の負荷がかかります。

また、コール

   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  

   ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");

は、同じ10-15%でプロセッサに負荷をかけます。

同時に、3つの機能の同時呼び出し

ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);
   
ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  

ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");

負荷スタックを起こさない。負荷はまだ10〜15%です。

しかし、これらの呼び出しに100万セルの定数配列再初期化ループを追加した場合

for(int a1 = 0; a1 < 1000000; a1++)Arr[a1] = MathRand();

になると、CPUの負荷は50%に上昇します。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

機能そのもの

ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);

はプロセッサーに負荷をかけない。

機能

ResourceReadImage("::MT object",Arr,w,h);

は、Arr[]配列のサイズに応じて0〜5%の負荷がかかります。

 

こちらはテストアドバイザーです。行をコメントし、タスクマネージャーでCPU負荷を確認する必要があります。

ファイル:
Test_1.mq4  11 kb
 

これが彼のコードです。

//+------------------------------------------------------------------+
//|                                                       Test_1.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
uint Arr[1000000];
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(16); 
   //----------------------------------------------------
   //Создаем МТ-объект.
   //----------------------------------------------------
   ObjectCreate(0,"MT object",OBJ_BITMAP_LABEL,0,0,0);
   //----------------------------------------------------
   //Соединяем с файлом.
   //----------------------------------------------------   
   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");
   //----------------------------------------------------
   //Создаем ресурс.
   //----------------------------------------------------
   ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);   
   //----------------------------------------------------  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint w = 0,h = 0;
   string name;
   //----------------------------------------------------
   //Читаем свойство bool.//Нагрузка процессора отсутствует.
   //----------------------------------------------------
   ObjectGetInteger(0,"MT object",OBJPROP_SELECTED);
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем свойство bool.//Нагрузка процессора: 10% - 15%.
   //----------------------------------------------------
   ObjectSetInteger(0,"MT object",OBJPROP_SELECTED,1);
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Перерисовываем изображение в массиве Arr[].
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, - ~35%.
   //---------------------------------------------------- 
   for(int a1 = 0; a1 < 1000000; a1++)Arr[a1] = MathRand();
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Пересоздаем ресурс.//Нагрузка процессора отсутствует
   //при любом размере массива.
   //----------------------------------------------------
   ResourceCreate("::MT object",Arr,1000000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA);   
   //---------------------------------------------------- 
   
   //----------------------------------------------------
   //Читаем ресурс.
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, 
   //Нагрузка "плавает" от 1 до 6%.   
   //----------------------------------------------------
   ResourceReadImage("::MT object",Arr,w,h);     
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Пересоединяем с файлом.//Нагрузка процессора: 10% - 15%
   //----------------------------------------------------   
   ObjectSetString(0,"MT object",OBJPROP_BMPFILE,"::MT object");  
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем описание объекта.//Нагрузка процессора: 10% - 15%
   //---------------------------------------------------- 
   ObjectSetString(0,"MT object",OBJPROP_TEXT,"QWERTY");   
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Читаем описание объекта.//Нагрузка процессора отсутствует.
   //---------------------------------------------------- 
   name = ObjectGetString(0,"MT object",OBJPROP_TEXT);         
  }
//+------------------------------------------------------------------+
 
Andrey Barinov:

画像のOpening Timeの欄のデータがおかしいんだけど。

TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS) を使いました。

なんでそんなことになってるんだろう。

 
Реter Konow:

正直なところ、このテスト結果には少し驚きました。

そして、16msの頻度でコンスタントに関数が呼び出されるという話です。

その結果、プロセッサに最も負荷をかけるのは、描画時の画素配列の初期化 であることが判明しました。

しかし、一番不思議だったのは、繰り返される関数呼び出しが

の場合、プロセッサに10〜15%の負荷がかかります。

また、コール

は、同じ10〜15%でプロセッサに負荷をかけます。

同時に、3つの機能の同時呼び出し

負荷スタックを起こさない。負荷はまだ10〜15%です。

しかし、これらの呼び出しに100万セルの定数配列再初期化ループを追加した場合

になると、CPUの負荷は50%に上昇します。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

機能そのもの

はプロセッサーに負荷をかけない。

機能

は、Arr[]配列のサイズに応じて、0〜5%の荷重がかかります。

レトログ・コノウ

正直なところ、このテストの結果には少し驚きました。

つまり、16msecで一定の関数呼び出しをしているということです。

その結果、プロセッサに最も負荷がかかるのは、描画時の画素配列の初期化 であることが判明しました。

しかし、一番不思議だったのは、繰り返される関数呼び出しが

の場合、プロセッサに10〜15%の負荷がかかります。

また、コール

は、同じ10-15%でプロセッサに負荷をかけます。

同時に、3つの機能の同時呼び出し

負荷スタックを起こさない。負荷はまだ10〜15%です。

しかし、これらの呼び出しに100万セルの定数配列再初期化ループを追加した場合

になると、CPUの負荷は50%に上昇します。

//-----------------------------------------------------------------------------------------------------------------------------------------------------

機能そのもの

はプロセッサーに負荷をかけない。

機能

は、Arr[]配列のサイズに応じて0〜5%の負荷がかかります。


ピーター 何百ページも言われたことを聞かないというのは、しつこいくらいにありますね。
スレッドを読み直す - "なぜそうなのか "という質問に対する答えがあります。

 
Реter Konow:

TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS) を使いました。

なぜかわからないけど。

OrderOpenPriceの代わりにOrderOpenTime()を入れるからです。