1

Dart でコーディングするより良い方法を見つけるために、いくつかのサンプル プログラムを見てきました。

この例 (以下) が特に重要であるというわけではありませんが、rosettacode dot org から取得したものであり、(できれば) 最新の状態にするために私が変更を加えています。

この投稿のポイントは、ベンチマークに関するものであり、他の言語と比較してコンソールへの出力速度に関して、いくつかのベンチマークで Dart の結果に悪影響を与える可能性があるものです。(他の言語との)比較が何であるかはわかりませんが、Dartでは、コンソール出力(少なくともWindowsでは)はStringBufferを使用してもかなり遅いようです。

余談ですが、私のテストでは、n1 を 11 まで増やした場合、再帰回数の合計 = >2 億 3800 万となり、(私のラップトップでは) c. 例 1 の実行に 2.9 秒。

さらに興味深いことに、文字列の割り当てが int に変更され、出力されない場合、経過時間は記録されません (例 2)。

低スペックのラップトップでの通常の時間 (コンソールから実行 - Windows)。

Elapsed Microseconds (Print) = 26002
Elapsed Microseconds (StringBuffer) = 9000
Elapsed Microseconds (no Printing)   = 3000

この場合、明らかに、コンソールの印刷時間は、計算などの時間に比べて重要な要素です。

それで、これが例えばとどのように比較されるか誰でもアドバイスできますか?コンソール出力のJava時間? これは少なくとも、この分野で Dart が特に遅いかどうかを示すものであり、一部のベンチマークに関連している可能性があります。ちなみに、Dart Editor で実行している場合、印刷の際に発生するペナルティはごくわずかです。

// Example 1. The base code for the test (Ackermann).

main() {
  for (int m1 = 0; m1 <= 3; ++m1) {
    for (int n1 = 0; n1 <= 4; ++n1) {
      print ("Acker(${m1}, ${n1}) = ${fAcker(m1, n1)}");
    }
  }
}

int fAcker(int m2, int n2) => m2==0 ? n2+1 : n2==0 ?
    fAcker(m2-1, 1) : fAcker(m2-1, fAcker(m2, n2-1));

テスト用に変更されたコード。

// Example 2 //
main() {
  fRunAcker(1);   // print
  fRunAcker(2);   // StringBuffer
  fRunAcker(3);   // no printing
}

void fRunAcker(int iType) {
  String sResult;
  StringBuffer sb1;
  Stopwatch oStopwatch = new Stopwatch();
  oStopwatch.start();
  List lType = ["Print", "StringBuffer", "no Printing"];
  if (iType == 2)   // Use StringBuffer
    sb1 = new StringBuffer();

  for (int m1 = 0; m1 <= 3; ++m1) {
    for (int n1 = 0; n1 <= 4; ++n1) {
      if (iType == 1)   // print
        print ("Acker(${m1}, ${n1}) = ${fAcker(m1, n1)}");
      if (iType == 2)   // StringBuffer
        sb1.write ("Acker(${m1}, ${n1}) = ${fAcker(m1, n1)}\n");
      if (iType == 3)   // no printing
        sResult = "Acker(${m1}, ${n1}) = ${fAcker(m1, n1)}\n";
    }
  }
  if (iType == 2)
    print (sb1.toString());
  oStopwatch.stop();
  print ("Elapsed Microseconds (${lType[iType-1]}) = "+ 
   "${oStopwatch.elapsedMicroseconds}");
}
int fAcker(int m2, int n2) => m2==0 ? n2+1 : n2==0 ?
    fAcker(m2-1, 1) : fAcker(m2-1, fAcker(m2, n2-1));

//Typical times on my low-spec laptop (run from the console).
   //   Elapsed Microseconds (Print) = 26002
   //   Elapsed Microseconds (StringBuffer) = 9000
   //   Elapsed Microseconds (no Printing)   = 3000
4

2 に答える 2

0

Java を使用してテストしましたが、これは興味深い演習でした。

この小さなテストの結果は、それぞれの最速の結果を使用して、Dart が Java よりもコンソール出力に約 60% 長くかかることを示しています。より多くの端末出力を使用してより大規模なテストを行う必要があり、それを実行します。

出力なしの「計算」速度に関しては、このテストと m = 3、n = 10 を使用すると、Dart の 580 ミリ秒と比較して、Java の比較は一貫して約 530 ミリ秒です。それは 5950 万回の通話です。n = 11 (2 億 3800 万回の呼び出し) の Java 爆弾。これはスタック オーバーフローであると推測されます。それが多くの決定的なベンチマークであると言っているわけではありませんが、何かを示しています. Dart は、計算時間において非常に近いように見えます。これは喜ばしいことです。「疑問符演算子」を使用することから、Java と同じ「if」ステートメントを使用するように Dart コードを変更しました。10%以上であり、それは一貫して当てはまるように見えました.

于 2013-05-28T20:33:50.963 に答える