定義された要素の配列をクリアする。 - ページ 13

 
Maxim Kuznetsov:

オプティマイザーは関係ない - 比較の数が半分になる...

慎重にタクトを回し、論理の完全一致を確認する
ZS. 躊躇しましたけどね。
 

ただのミニリファクタリング(「世の中そんなに美しくないから...」)です。

#define  BENCHMARK_TEST(function, test_name)     \
   ArrayCopy(arr2,arr);                         \
   t=GetMicrosecondCount();                     \
   N=##function(arr2,Value);                    \
   t=GetMicrosecondCount()-t;                   \
   printf("вариант %-12s: Контрольная сумма = %f; элементов - %d; время выполнения - %6d микросекунд", test_name, ControlSumm(arr2), N, t);


void OnStart()
{
   srand(1);
   
   int N;
   ulong t;
   int Value=rand()%1000; // значение, которое нужно удалить из массива
   
   int arr[]; // исходный массив
   int arr2[]; // создаем еще один массив для теста и копируем в него исходный массив

   ArrayResize(arr,1000000);
   for(int i=0; i<1000000;i++){ 
      arr[i]=rand()%1000; //генерируем исходный массив случайными значениями от 0 до 1000
   }   
   
   BENCHMARK_TEST(ArrayDeleteVal1,      "Pastushak");
   BENCHMARK_TEST(arrayFilter,          "Korotky");
   BENCHMARK_TEST(DelEl2,               "Fedoseev");
   BENCHMARK_TEST(ArrayDeleteVal,       "Semko");
   BENCHMARK_TEST(ArrayModify,          "Pavlov");
   BENCHMARK_TEST(arrayFilter2,         "Nikitin");
   BENCHMARK_TEST(ArrayDelV,            "Vladimir");
   BENCHMARK_TEST(PeterArray,           "Peter");
   BENCHMARK_TEST(arrayFilter3,         "Kuznetsov");
}

//..............................................

結果
2018.11.15 01:11:13.670 Test (EURUSD,H1)        вариант Pastushak   : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения - 127587 микросекунд
2018.11.15 01:11:13.675 Test (EURUSD,H1)        вариант Korotky     : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   2530 микросекунд
2018.11.15 01:11:13.679 Test (EURUSD,H1)        вариант Fedoseev    : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   1995 микросекунд
2018.11.15 01:11:13.681 Test (EURUSD,H1)        вариант Semko       : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -    854 микросекунд
2018.11.15 01:11:13.686 Test (EURUSD,H1)        вариант Pavlov      : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   3239 микросекунд
2018.11.15 01:11:13.692 Test (EURUSD,H1)        вариант Nikitin     : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   3812 микросекунд
2018.11.15 01:11:13.698 Test (EURUSD,H1)        вариант Vladimir    : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   4037 микросекунд
2018.11.15 01:11:13.707 Test (EURUSD,H1)        вариант Peter       : Контрольная сумма = 7225.757267; элементов - 998994; время выполнения -   7855 микросекунд
2018.11.15 01:11:13.710 Test (EURUSD,H1)        вариант Kuznetsov   : Контрольная сумма = 7224.813498; элементов - 998994; время выполнения -    744 микросекунд
ファイル:
 
Sergey Dzyublik:

ただのミニリファクタリング(「世の中そんなに美しくないから...」)です。

ちょうど私が尋ねた上で - オリジナルの配列をシリーズとして置いてみてください。ArraySetAsSeries(...,true)。

これはかなり関連性の高い質問です。どのメソッドが直列でまったく動作しないのか、またどのメソッドが予想外に遅いのかを確認するためです。

配列のフィルタリングはともかく、直列についてはより実用的な質問です。

 
Sergey Dzyublik:

ただのミニリファクタリング(「世の中そんなに美しくないから...」)です。

セルゲイさん、有益なクオリティレッスンをありがとうございました。:)

 

マキシム・クズネツォフを 別カテゴリに移動しました。

間違いを伴うテストを推奨(セムコとパブロフ)。

バリアントを追加しました

追伸:テンプレートは削除する必要があります、ダブルスの比較の際にもエラーになる可能性があります

ファイル:
 
Stanislav Dray:

マキシム・クズネツォフを 別カテゴリに移動しました。

間違いを伴うテストを推奨(セムコとパブロフ)。

バリアントを追加しました

追伸:テンプレートも削除しないと、ダブルス比較でエラーになる可能性があります。

配列の最後の2つの要素がValueと等しくなるようにした。セムコにはエラーがない。どのような場合にエラーが発生するのか、教えてください。リーダーを放り出すのは、あまり賢明なやり方ではありません。

doubleの正規化で発生するエラーは何ですか?そのため、doubleの配列を扱う場合は、正規化されたデータを配列に入れることを自分で気にする必要があります。

 
Dmitry Fedoseev:

配列の最後の 2 要素を Value と等しくした。セムコにはエラーがありません。どのような場合に誤りがあるのか、教えてください。リーダーを放り出すのはフェアじゃない。

doubleの正規化で発生するエラーは何ですか?そのため、double 型の配列を扱う場合は、正規化したデータを自分で配列に追加する必要があります。

コードにコメントを入れただけなので、おそらく気づかなかったと思います。配列の最後の要素が削除条件に該当する場合,すなわち Value と等しい場合はエラーとなる。

コードからは削除していません :) ただ、誰かがエラーをコピーするのを防ぐためです。ニコライがコードを修正すれば、彼は自分で戻ってくると思います :)

テンプレートについて:doubleを渡すとエラーが発生します。この関数は実数の比較が正しくないというか、単にこれを意図していないため、テンプレートを置く前に、その関数がどんな型でも正しく動作することを確認する必要があります。

1

 
Stanislav Dray:

コードにコメントしたのですが、おそらく気づかれなかったのでしょう。エラーは,配列の最後の要素が削除条件に該当する場合,すなわち,Valueに等しい場合です。

コードから削除したわけではありません :) ただ、誰かがエラーでコピーしてしまうのを防ぐためです。ニコライがコードを修正すれば、彼は自分で戻ってくると思います :)

テンプレートについて:doubleを渡すとエラーが発生します。この関数は実数の比較が正しくないというか、単にこれを意図していないので、テンプレートを置く前に、その関数がどんな型でも正しく動作することを確認する必要があります。


そして、何に気がついたのか。これです。"最後の要素の1つ以上が条件に 該当する場合、配列が破損する"?上に書いたのはそれなんですが、うまくいきませんでした。 スクリーンショットを見る限り、要領が悪いのはわかりますが。アイテム数が少ない場合にエラーが発生するようです。

doubleの場合、どのようなエラーが発生するのでしょうか?なぜ?配列の中にどんなデータがあっても、そのように動作します。正しく動作させたい場合は、配列に入れる前に正規化を行う必要があります。しかし、関数自体に正規化を挿入してはいけない。この機能は、テンプレートと完全に相性が良く、正しく使用すれば、ダブルでも問題なく動作します。

みんなが急に二重の問題に関心を持ったことは、とても良いことだと思います。

 
Dmitry Fedoseev:

何に気がついたのか?これですね。"最後の要素の1つ以上が条件に 該当する場合、配列は破損している"?上に書いたのは、うまくいかなかったということです。 スクリーンショットでお分かりのように、そういう問題ではありません。アイテム数が少ない場合にエラーが発生するようです。

doubleの場合、どのようなエラーが発生するのでしょうか?なぜ?配列の中にどんなデータがあっても、そのように動作します。正しく動作させたい場合は、配列に入れる前に正規化を行う必要があります。しかし、関数自体に正規化を挿入してはいけない。この機能は、テンプレートと完全に相性が良いので、正しく使用すれば問題なく動作します。

二重の問題に皆が急に関心を持つようになったのは非常に良いことだが、賢明な判断が必要だ。

あなたと私では、関数がどのように動くべきかについての見解が異なります。 関数はアフリカの関数であり、データの準備なしで、すべてが内部で動く必要があります。

P.S. 実は誰も気にしていません。ここのテンプレを犬の五目並べと書いただけで、間違いの可能性あり

 
Stanislav Dray:

関数は関数であり、データの準備なしに、すべてが内部で動作するはずです。

ここは幼稚園です。