どのサイクルが速いですか? 1Cのテスト

私は数年にわたって1Cプログラミングに携わってきましたが、 「以前は気にも留めなかった知識のギャップがある場合、トレーニングコースはありますか?」という考えを思いつきました。 すぐに言ってやった。 私は座って、コースを聞いて、周期的な演算子を取得し、次に考え直しました(はい、彼らは私にはあまり現れません) - 「そして、どのサイクルが速いですか?」 確認する必要があります。

そこで、1Cを使用してサイクルを編成する方法を5つ見つけました。



最初の種類のサイクル、条件付きで「ForPo」と呼びましょう。



  = 0    (); ;
      
      





第二の種類の「みんなのために」



       (); ;
      
      





3番目の「バイ」



   <>   ();  =  + 1; ;
      
      





その後アセンブラーの若者を思い出しました-Ifサイクル:



 ~:   <>   ();  =  + 1;  ~; ;
      
      





そして最後に、 「再帰」



  (, ) ();   <>   (+1, ); ; 
      
      





当然、再帰をサイクルに帰することは完全に正しいわけではありませんが、それにもかかわらず、その助けを借りて、同様の結果を達成できます。 私は、再帰はさらなるテストに参加しなかったとすぐに言わなければなりません。 まず、すべてのテストは1,000,000回の反復で実行され、再帰はすでに2,000で落ちました。次に、再帰率は残りのサイクルの速度よりも数十倍低くなっています。



最後の隠れ家。 条件の1つは、サイクル内のアクションのパフォーマンスです。 まず、空のループが使用されることはほとんどありません。 次に、すべてのコレクションに対して「全員向け」サイクルが使用されます。これは、同じ条件下でテストが行​​われるように、残りのサイクルがコレクションで動作する必要があることを意味します。



さあ、行きましょう。 ループの本体として、事前に入力された配列からの読み取りが使用されました。



  = .();
      
      





または、「全員向け」サイクルを使用する場合



  = ;
      
      





プラットフォーム8.3.5.1231で、3種類のインターフェイス(通常のアプリケーション、マネージドアプリケーション、およびタクシー)のテストを実施しました。

8.3.5.1231の結果
インターフェース のために みんなのために さようなら もし
通常の申請 5734.2 4680,4 7235.4 7263.0
管理対象アプリケーション 5962.4 4882.6 7497.4 7553.6
タクシー 5937.2 4854.6 7500.8 7513.0
Numbersは、関数CurrentUniversalDateInMilliseconds()を使用して取得したミリ秒単位の時間で、サイクルの前と完了後に呼び出しました。 5つの測定値の算術平均を使用したため、数値は小数です。 パフォーマンス測定を使用しなかったのはなぜですか? 私の目標は、コードの各行の速度を測定することではなく、同じ結果のサイクルの速度のみを測定することでした。



それがすべてのように思えますが、-テストをテストしてください!

プラットフォーム8.2.19.106の結果

8.2.19.106の結果
インターフェース のために みんなのために さようなら もし
通常の申請 4411.8 3497.2 5432.0 5454.0
管理対象アプリケーション 4470.8 3584.8 5522.6 5541.0
プラットフォーム8.2は平均で8.3より25%高速です。 私はそのような違いを少しは期待していなかったので、別のマシンでテストを行うことにしました。 結果は表示しませんが、 この構成を使用して自分で生成できます。 8.2は20%速くなったとしか言えません。



なんで? カーネルを分解するつもりはなかったのですが、パフォーマンスの測定を検討していました。 8.3の循環操作自体は、8.2よりもやや速いことが判明しました。 しかし、ライン上

  = .();
      
      





つまり、コレクションアイテムを変数に読み込むと、パフォーマンスが大幅に低下します。



要約すると:

サイクル速度の割合
のために みんなのために さようなら もし
78.97% 64.57% 99.57% 100.00%
なんでこんなこと? 私自身、いくつかの結論を出しました。



1.特別なサイクル-「全員向け」を使用できる場合は、それを使用することをお勧めします。 ちなみに、それ自体は他のサイクルよりも長く機能しますが、コレクションアイテムへのアクセス速度ははるかに高速です。

2.繰り返しの回数が事前にわかっている場合は、「ForPo」を使用します。 「バイ」の動作は遅くなります。

3. 「If」サイクルを使用すると、他のプログラマは明らかにあなたを理解しません。



All Articles