我一直在查看一些示例程序,以便找到更好的使用 Dart 编码的方法。
并不是说这个例子(下面)有什么特别重要的,但是它取自 Rosettacode dot org,我做了一些改动(希望)让它保持最新。
这篇文章的重点是关于基准测试,以及与其他语言相比,就打印到控制台的速度而言,在某些基准测试中可能不利于 Dart 的结果。我不知道比较是什么(与其他语言),但是在 Dart 中,即使使用 StringBuffer,控制台输出(至少在 Windows 中)似乎也很慢。
顺便说一句,在我的测试中,如果允许 n1 增长到 11,则总递归数 = >2.38 亿,并且它需要(在我的笔记本电脑上)c。运行示例 1 需要 2.9 秒。
此外,可能感兴趣的是,如果将 String 分配更改为 int,而不打印,则不会将任何时间记录为经过(示例 2)。
我的低规格笔记本电脑上的典型时间(从控制台运行 - Windows)。
Elapsed Microseconds (Print) = 26002
Elapsed Microseconds (StringBuffer) = 9000
Elapsed Microseconds (no Printing) = 3000
显然,在这种情况下,控制台打印时间是相对于计算等时间的重要因素。
那么,任何人都可以建议这与例如相比如何。控制台输出的 Java 时间?这至少表明 Dart 在该领域是否特别慢,这可能与某些基准有关。顺便说一句,在 Dart 编辑器中运行时,打印的损失可以忽略不计。
// 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