RednaxelaFX 发表于 2013-2-4 22:16:22

读到一篇关于运行效率的小测试的文章,也做了一样的测试来看看

CSDN的blog上有这么一篇:java,javascript,groovy和Rhino 的运行效率到底相差的有多远?

那篇文章是2005年7月的,读了之后觉得想看看现在的状况如何,于是也稍微测了下。
代码基本上是从那篇文章直接搬过来的,每个实现测8次。注意到测试所计算的时间只包括计算10皇后问题的时间,而没有包括程序的启动时间和输出时间等。在实际应用中,启动时间会对用户体验带来很大的影响,而输入输出实际上也是相当消耗时间的工作。
而且测试也没有测memory footprint << 这玩意对实际表现也有很大影响

我的测试环境:
HP Compaq nx9040, Pentium M 715, 1.5GHz
Windows XP SP2 5.1.2600

应该说我这笔记本在2005年也不算快,到现在已经算是老爷机了。但那篇文章里所提到的几种实现在我的机器上做出的表现比文章所描述的都要快多了。特别是Groovy,在采用了类似JRuby的一些优化手段之后,性能一下就提高了很多。Charles Nutter之前在他的blog上也提到了这点。

下面测到的脚本语言的实现基本上都在2-6秒左右完成了10皇后的计算,应该说在这个测试所做的计算中性能都差不多。
其实现在这些脚本语言也就比Java或者C#慢个100x左右……做一般的任务绝对够用了 =_=

关于性能测试:
这种10皇后问题的程序也算是所谓“microbenchmark”了吧。要注意:由于计算量/数据量不够大,持续时间不够长,有很多问题(也可以说是优化的机会)是看不到的。所以不要太在意这种microbenchmark的具体数据。大概有个数量级就差不多了。

C:
#include <stdio.h>#include <time.h>#define TRUE 1#define FALSE 0#define q 10const int CLOCKS_PER_MS = CLOCKS_PER_SEC / 1000;int i;int count = 0;int check(int n) {    int j;    for(j = 0; j < n; ++j)      if (i == i || i - i == j - n || i - i == n - j )            return FALSE;    return TRUE;}void scan(int n) {    if (n == q) {      // for (int k=0;k<q;k++) System.out.print(i+(k==q-1?"\n":","));      count++;      return;    }    i = 0;    while(i < q) {      i = i + 1;      if (check(n))            scan(n + 1);    }}int main() {    clock_t t = clock();    scan(0);    printf("total time: %d\n", (clock() - t) / CLOCKS_PER_MS);    printf("total results: %d\n", count);    return 0;}

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
/O2
<div class="quote_title">引用
页: [1]
查看完整版本: 读到一篇关于运行效率的小测试的文章,也做了一样的测试来看看