アルゴリズム、解法、性能比較 - ページ 20

 
Реter Konow:

理想的なソリューションにエンティティを追加する理由がわからない。意味がわからない。

2つの帽子を同時にかぶることはありません。それはなぜか?

まずこれを説明します。))


"人を拷問して苦しめ、道徳的・心理的に下げている...。"

呪われた世界(全集)著者:ドミトリー・ガニン

 
Sergey Dzyublik:

"人を拷問して苦しめる、道徳的・心理的に下げる......。"

呪われた世界(文庫)著者:ドミトリー・ガーニン

私の不注意で、道徳的・心理的に苦しませた皆さんに心からお詫び申し上げます。

ある問題に対する完璧な解決策を見出す以外の目的は、追求していない。

それどころか、私自身、理解不能な攻撃や、やる気のない攻撃に悩まされました。

どうやら、これは社会に「ついて行きたい」と思わない人が払う代償のようだ。

まあ、私は自分の選択をしたのであって、誰かを責めるつもりはないのですが......。

 
Реter Konow:

理想的なソリューションにエンティティを追加する理由がわからない。


あなたのコードを理想的なソリューションとして語るのは、まだ早いかもしれませんね。

そして、実際の帽子のコレクションはこちら

 
Alexandr Andreev:

あなたのコードを完璧なソリューションとして語るには、まだ早いかもしれません。

いわば一般論として話したのですが...。

"なぜかというと、理想的な解決策(どんな解決策でも)には、実体を加えること"

多くの方々から非常に貴重なアイデアをいただき、正しい間違いを指摘していただいたと言わざるを得ません。

1.文字数エラー。

2. 共通文字列内の部分文字列の衝突によって発生するエラー。

3.文字列ごとに割り当てられたメモリがオーバーフローしている 4.

4.アレイサイズを変更 するとデータが消去されるとの誤信


皆様、このような間違いをご指摘いただき、本当にありがとうございます

 
Реter Konow:
...

皆さん、間違いを指摘してくれて本当にありがとうございました

客観的に見れば、最後の理想的な解決策は、誰にでも あるものだと思います。

 
Реter Konow:

客観的に見れば、最後の理想的な解決策はみんなの ものです。なぜなら、私は間違いを指摘し、人とコミュニケーションをとり、交流することでそれにたどり着いたからです。


もう一度言いますが、最後の選択肢はあくまで選択肢であって、その前にあったものは全く選択肢ではありませんそして、それが完璧であることは論点の一つである

 
Alexandr Andreev:

もう一度言いますが、最後の選択肢はあくまで選択肢であって、その前にあったものは全く選択肢ではありませんそして、それが完璧であることは、論外である。

(苦笑) いいですね。私だけのために完璧にしてください。誰もが自分の尺度で判断できる。
 

DEBAGプリントと彗星に話を移そうか、誰か考えはあるか?

 

は、関数が実行された場合の実行時間をテストしました。

1. クラスに包まれている

2. クラスにラップされ、そのクラスのインスタンスがnew演算子 で生成される。

3. ラッパーを使わずに関数を呼び出すだけ

//+------------------------------------------------------------------+

#define    SpeedTest(count_x10,msg,EX)        {uint mss=GetTickCount(); ulong count=(ulong)pow(10,count_x10);for(ulong i=0;i<count&&!_StopFlag;i++){EX;} \
                                              printf("%s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
//+------------------------------------------------------------------+
class COpen
{
private:
   string            m_symbol;
public:
                     COpen(const string symbol): m_symbol(symbol) {}
   double            getOpen(const int bar) const                 { return(iOpen(m_symbol, 0, bar)); }

};
//+------------------------------------------------------------------+
void OnStart()
{  #define  loop_x10 9
//1.
   COpen sym1(_Symbol);
   srand(GetTickCount());
   SpeedTest(loop_x10, "1. COpen", sym1.getOpen(rand()));
//2.
   srand(GetTickCount());
   SpeedTest(loop_x10, "2. new COpen",
             COpen *sym2 = new COpen(_Symbol);
             sym2.getOpen(rand());
             delete sym2;
            );
//3.            
   srand(GetTickCount());
   SpeedTest(loop_x10, "3. iOpen",iOpen(NULL,0,rand()););            
}
//_______________________________________________________________________

2019.10.12:39:29.802 SpeedTst_class (EURUSD,M1) 1.COpen: loops=1000000000 ms=41016

2019.10.12:41:05.352 SpeedTst_class (EURUSD,M1) 2. new COpen: loops=1000000000 ms=95562

2019.10.12:41:45.939 SpeedTst_class (EURUSD,M1) 3. iOpen: loops=1000000000 ms=40578


テスト1と3は性能の点で並んでいる。つまり、クラスへの関数呼び出しのラップは重要ではなく、テスト2はコンストラクタとデストラクタの呼び出しがあるため時間がかかっている

 

SymbolInfoDouble() の実行速度テスト

#property version   "1.00"
// количество итераций теста
#define  LOOPx10 8

#define    SpeedTest(count_x10,msg,EX)        {uint mss=GetTickCount(); ulong count=(ulong)pow(10,count_x10);for(ulong i=0;i<count&&!_StopFlag;i++){EX;} \
                                              printf("%s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   double lot;

   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_my()", lot = rand() / 1000.0; calcNormVol_my(lot))

   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_alexeyvik()", lot = rand() / 1000.0; calcNormVol_alexeyvik(lot))
   
   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_fxsaber()", lot = rand() / 1000.0; calcNormVol_fxsaber(lot))
   
   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_my_2()", lot = rand() / 1000.0; calcNormVol_my_2(lot))

}
//+------------------------------------------------------------------+
double calcNormVol_my(const double value)
{
   const static string sym = _Symbol;
   return(NormalizeDouble(fmax(fmin(SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP) * round(value / SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP)), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)),
                               SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN)),  2));
}
//+------------------------------------------------------------------+
double calcNormVol_alexeyvik(const double value)
{
//   const string sym = _Symbol;
   return(
            NormalizeDouble(fmax(fmin(SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP) * round(value / SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP)),
                                      SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX)),  SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)), 2)
         );
}
//+------------------------------------------------------------------+
const double VolumeStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
const double VolumeMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
const double VolumeMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
const int O_DigitsInVolumeStep = 2;
double calcNormVol_fxsaber( const double value )
{
   return((value > VolumeMax) ? VolumeMax
          : ((value < VolumeMin) ? VolumeMin
             : NormalizeDouble(VolumeStep * (int)(value / VolumeStep + 0.5), O_DigitsInVolumeStep)));
}
//+------------------------------------------------------------------+
double calcNormVol_my_2( const double value )
{
   const static double volumeStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
   const static double volumeMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   const static double volumeMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   const static int o_digitsInVolumeStep = 2;
   return((value > volumeMax) ? volumeMax
          : ((value < volumeMin) ? volumeMin
             : NormalizeDouble(volumeStep * (int)(value / volumeStep + 0.5), o_digitsInVolumeStep)));
}
//+------------------------------------------------------------------+

2019.12.11 21:13:08.896 tst_volum (EURUSD,W1) calcNormVol_my(): loops=100000000 ms=173406

2019.12.11 21:15:45.425 tst_volum (EURUSD,W1) calcNormVol_alexeyvik(): loops=100000000 ms=156531

2019.12.11 21:15:45.533 tst_volum (EURUSD,W1) calcNormVol_fxsaber(): loops=100000000 ms=110

2019.12.11 21:15:45.916 tst_volum (EURUSD,W1) calcNormVol_my_2(): loops=100000000 ms=390