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