`
RednaxelaFX
  • 浏览: 3048121 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

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

阅读更多
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 10

const int CLOCKS_PER_MS = CLOCKS_PER_SEC / 1000;
int i[q];
int count = 0;

int check(int n) {
    int j;
    for(j = 0; j < n; ++j)
        if (i[j] == i[n] || i[j] - i[n] == j - n || i[j] - i[n] == 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]+(k==q-1?"\n":","));
        count++;
        return;
    }
    i[n] = 0;
    while(i[n] < q) {
        i[n] = i[n] + 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
引用
D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724

D:\test>queen
total time: 40
total results: 724


Java:
public class Queens {
    static int q = 10;
    static int[] i = new int[q];
    static int count = 0;
    
    public static void main(String[] args) {
        long t = System.currentTimeMillis();
        scan(0);
        System.out.println("total time: " + (System.currentTimeMillis()-t));
        System.out.println("total results: " + count);
    }
    
    private static void scan(int n) {
        if (n == q) {
            // for (int k=0;k<q;k++) System.out.print(i[k]+(k==q-1?"\n":","));
            count++;
            return;
        }
        i[n] = 0;
        while(i[n] < q) {
            i[n] = i[n] + 1;
            if (check(n))
                scan(n + 1);
        }
    }

    private static boolean check(int n) {
        for( int j = 0; j < n; ++j)
            if (i[j] == i[n] || i[j] - i[n] == j - n || i[j] - i[n] == n - j )
                return false;
        return true;
    }
}


Java 1.6.0 update 5 Client VM:
引用
D:\test>java Queens
total time: 31
total results: 724

D:\test>java Queens
total time: 50
total results: 724

D:\test>java Queens
total time: 40
total results: 724

D:\test>java Queens
total time: 20
total results: 724

D:\test>java Queens
total time: 30
total results: 724

D:\test>java Queens
total time: 30
total results: 724

D:\test>java Queens
total time: 20
total results: 724

D:\test>java Queens
total time: 30
total results: 724


C#
using System;

sealed class Queens {
    const int q = 10;
    static int[ ] i = new int[ q ];
    static int count = 0;
    
    static void Main( string[ ] args ) {
        int t = DateTime.Now.Millisecond;
        Scan(0);
        Console.WriteLine( "total time: {0}", ( DateTime.Now.Millisecond - t) );
        Console.WriteLine( "total results: {0}", count );
    }
    
    private static void Scan( int n ) {
        if ( n == q ) {
            // for (int k=0;k<q;k++) Console.WriteLine(i[k]+(k==q-1?"\n":","));
            count++;
            return;
        }
        i[ n ] = 0;
        while( i[ n ] < q ) {
            i[ n ] = i[ n ] + 1;
            if ( Check( n ) )
                Scan( n + 1 );
        }
    }
    
    private static bool Check( int n ) {
        for( int j = 0; j < n; ++j)
            if ( i[ j ] == i[ n ]
            || i[ j ] - i[ n ] == j - n
            || i[ j ] - i[ n ] == n - j )
                return false;
        return true;
    }
}


.NET Framework 3.5
/o
引用
D:\test>Queens
total time: 20
total results: 724

D:\test>Queens
total time: 50
total results: 724

D:\test>Queens
total time: 20
total results: 724

D:\test>Queens
total time: 50
total results: 724

D:\test>Queens
total time: 31
total results: 724

D:\test>Queens
total time: 60
total results: 724

D:\test>Queens
total time: 20
total results: 724

D:\test>Queens
total time: 50
total results: 724


JavaScript:
var q = 10
var i = new Array(q)
var count = 0 
var d = new Date(); 
scan(0)
d = new Date() - d;

print("total results: " + count)
print("time used: " + d)

function scan(n) { 
    if (n==q){
        // print(i)
        ++count
        return 
    } 
    i[n] = 0 
    while (i[n] < q) {
        i[n] = i[n] + 1 
        if (check(n))
            scan(n+1)
    } 
} 

function check(n) {
    for (var j=0; j<n;j++)
        if (i[j] == i[n] || i[j] - i[n] == j - n || i[j] - i[n] == n - j)
            return false
    return true
}


Rhino 1.7R1:
引用
C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2574

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2563

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2554

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2554

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2553

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2563

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2564

C:\sdk\rhino1_7R1>java -jar js.jar -f queen.js
total results: 724
time used: 2564


Ruby:
require 'benchmark'

$q = 10
$arr = Array.new $q, 0
$count = 0

def check(n)
  n.times do |i|
    if $arr[i] == $arr[n] || $arr[i] - $arr[n] == i - n || $arr[i] - $arr[n] == n - i
      return false
    end
  end
  true
end

def scan(n)
  if n == $q
    # puts $arr
    $count += 1
    return
  end
  $arr[n] = 0
  while $arr[n] < $q
    $arr[n] += 1
    scan n + 1 if check n
  end
end

puts Benchmark.measure { scan 0 }
puts "total count: #{$count}"


Ruby 1.8.6-p111:
引用
D:\>ruby queen.rb
  6.459000   0.000000   6.459000 (  6.479000)
total count: 724

D:\>ruby queen.rb
  6.469000   0.000000   6.469000 (  6.480000)
total count: 724

D:\>ruby queen.rb
  6.479000   0.000000   6.479000 (  6.489000)
total count: 724

D:\>ruby queen.rb
  6.479000   0.000000   6.479000 (  6.489000)
total count: 724

D:\>ruby queen.rb
  6.469000   0.000000   6.469000 (  6.479000)
total count: 724

D:\>ruby queen.rb
  6.459000   0.000000   6.459000 (  6.490000)
total count: 724

D:\>ruby queen.rb
  6.459000   0.000000   6.459000 (  6.459000)
total count: 724

D:\>ruby queen.rb
  6.469000   0.000000   6.469000 (  6.489000)
total count: 724


JRuby 1.1.2:
引用
C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.986000   0.000000   3.986000 (  3.989929)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.996000   0.000000   3.996000 (  3.996371)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  4.016000   0.000000   4.016000 (  4.022501)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.966000   0.000000   3.966000 (  3.969034)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.956000   0.000000   3.956000 (  3.959475)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.986000   0.000000   3.986000 (  3.985322)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.975000   0.000000   3.975000 (  3.981439)
total count: 724

C:\sdk\jruby-1.1.2\bin>jruby queen.rb
  3.966000   0.000000   3.966000 (  3.962475)
total count: 724


Ruby 1.9.0-0
引用
D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.784000   0.000000   2.784000 (  2.794000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.714000   0.010000   2.724000 (  2.724000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.794000   0.000000   2.794000 (  2.794000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.744000   0.000000   2.744000 (  2.754000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.693000   0.000000   2.693000 (  2.704000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.744000   0.000000   2.744000 (  2.754000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.744000   0.000000   2.744000 (  2.754000)
total count: 724

D:\ruby-1.9.0-0-i386-mswin32\bin>ruby queen.rb
  2.744000   0.000000   2.744000 (  2.744000)
total count: 724


IronRuby暂时还运行不了这段代码。即便将Benchmark相关的部分替换成Time.now,IronyRuby的可执行程序(ir.exe)仍然无法正常执行这段代码,比较郁闷。可能把全局变量转成局部变量会好些。

Groovy:
D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1793
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1793
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1813
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1803
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1792
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1803
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1792
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1802
total results: 724


Groovy 1.6 Beta 1
引用
D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1793
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1793
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1813
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1803
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1792
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1803
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1792
total results: 724

D:\groovy-1.6-beta-1\bin>groovy queen.groovy
total time: 1802
total results: 724


Groovy 1.6 Beta 1 compiled to Java 1.6.0 update 5
引用
D:\groovy-1.6-beta-1\bin>groovyc queen.groovy

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1833
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1762
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1783
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1763
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1762
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1773
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1762
total results: 724

D:\groovy-1.6-beta-1\bin>java -cp ./groovy-all-1.6-beta-1.jar;. queen
total time: 1773
total results: 724
分享到:
评论

相关推荐

    软件测试优秀文章分享

    通过链接到Jacky-Dai在iteye博客上的一篇文章(https://jacky-dai.iteye.com/blog/2382448),我们可以获取更多关于此话题的专业见解。标签“源码”和“工具”提示我们,本文可能涉及测试过程中的代码审查和自动化...

    回归测试、冒烟测试

    在这篇文章中,我们将深入探讨这两种测试方法的定义、目的以及如何在实际工作中有效地运用它们。 首先,回归测试是一种确保软件修改后仍能正常运行的测试方法。当开发者对代码进行更新、修复或优化时,可能会无意中...

    一篇文章让你读懂小程序开发.docx

    综上所述,小程序作为一种新兴的轻量级应用形态,在降低成本、提高效率等方面展现出巨大优势。无论是对于创业者还是成熟企业,小程序都成为了不可忽视的重要工具。随着技术的进步和市场需求的变化,小程序的应用场景...

    交流一种先进的java代码测试方案[

    本篇文章将深入探讨一种先进的Java代码测试方案——Gemini测试,它为开发者提供了全面而高效的测试工具和方法。 Gemini测试方案是针对Java应用的一种自动化测试框架,旨在提高测试覆盖率和效率。其核心理念是将单元...

    测试工具的选择和使用

    本篇文章将深入探讨几种主要的测试工具,包括白盒测试工具集、黑盒功能测试工具集、黑盒性能测试工具集以及测试管理工具,并进行产品之间的比较。 首先,我们来看Parasoft的白盒测试工具集。Parasoft提供了多种针对...

    虚拟机安装测试工具

    本篇文章将深入探讨“虚拟机安装测试工具”以及如何测试CPU是否支持虚拟化。 首先,我们要理解什么是虚拟化。虚拟化是一种资源管理技术,它通过软件模拟硬件,使多操作系统能够在同一台机器上并发运行,互不影响。...

    测试工具简介

    本篇文章将介绍两款著名的测试工具——Visual Unit和Apache JMeter,以及一款测试管理工具TestDirector,它们分别在单元测试、性能测试和测试管理方面提供专业支持。 Visual Unit是一款专为C/C++开发的单元测试工具...

    对基于Junit的测试代码自动化生成的研究

    从标签“源码 工具”来看,本文可能会深入到Junit的源码层面,探讨其内部工作机制,并可能介绍一些用于自动化测试代码生成的工具或者自定义工具的实现。源码分析对于理解Junit如何支持测试驱动开发(TDD)和行为驱动...

    学C++不得不看的一篇文章

    这是一个典型的数学问题,需要开发者不仅能够编写正确的代码,还要考虑代码的效率,尤其是在嵌入式系统开发中,程序运行速度至关重要。 2. **初始解决方案** 开始时,作者采用了一个简单的循环,逐个累加数字并...

    分词系统测试程序

    本篇文章将详细介绍一个由个人开发的分词系统测试程序,以及其运行环境和主要组件。 首先,我们来看标题中的“分词系统测试程序”。这通常是一个专门用于验证和评估分词算法或工具的软件工具。它可以帮助开发者检查...

    proxy与mycat对比测试

    本篇文章将深入探讨proxy和Mycat的对比测试,以及如何在MySQL主从架构中进行测试。 首先,我们来看proxy。Proxy通常指的是数据库代理服务器,它位于应用服务器和数据库服务器之间,起到路由请求、负载均衡和透明化...

    基于CUDA的矩阵乘法和FFT性能测试

    借助CUDA,开发者可以充分利用GPU的成千上万个小核心来并行处理复杂计算任务,相比传统CPU,这能够极大提升程序的运行效率。 在本篇文章《基于CUDA的矩阵乘法和FFT性能测试》中,作者肖江、胡柯良、邓元勇等人在...

    基于FPGA的某测试系统供电电源的可靠性分析.pdf

    从标签来看,这是一篇聚焦于硬件技术、硬件开发领域的专业文献。标签中的“参考文献”和“专业指导”表明这是一篇理论联系实际的研究成果,既提供了在特定领域中的应用案例,也能够为后续的研究或开发工作提供指导和...

    VC&C++builder TDD

    描述中的链接指向了一篇博客文章,虽然具体内容无法在这里直接引用,但通常这样的文章会讨论如何在C++环境中实施TDD,包括使用相关的测试框架和工具,以及如何构建和运行测试。 标签 "源码" 和 "工具" 暗示了讨论...

    分布式能源测试系统.pdf

    分布式能源测试系统是一种基于计算机技术和现代通信技术的新型能源系统,它能够实现能源的有效分配、利用和管理,以提高能源利用效率和环境保护为目标。在当今世界能源日益紧张和环境保护需求不断提高的背景下,...

    Software Test

    总的来说,这篇关于“Software Test”的博客可能涵盖了从代码级测试策略、自动化工具的应用,到特定场景(如Cisco网络设备)的测试实践,以及如何适应敏捷和DevOps环境。通过深入学习这些内容,读者可以提升自己的...

    PHP的性能测试全过程分享.doc

    这篇文章正是为了挑战这一观点,通过深入分析PHP的源码、应用场景、基准性能以及与其他语言的对比,来揭示PHP的真实性能表现。 首先,从内存管理的角度来看,PHP借鉴了Nginx的内存管理策略,采用内存池机制并引入了...

    C#对于Oracle游标一般处理程序速度的测试

    本篇文章将重点探讨在C#中处理Oracle游标的性能测试。 游标,或者说光标,是数据库管理系统提供的一种数据处理机制,允许程序逐行地读取、处理和修改查询结果。在Oracle数据库中,游标通常用于循环处理大量数据,...

    软件系统的性能调优总结

    性能测试还需要做Soak Test,也就是在某个吞吐量下,系统可以持续跑一周甚至更长。这个值,我们叫做系统的正常运行的负载极限。性能测试有很多很重要的东西,比如:burst test等。 三、定位性能瓶颈 到了这里,...

Global site tag (gtag.js) - Google Analytics