2012-09-22 66 views
0

我应该如何测试我的算法的速度?我所做的增强算法和原始算法搜索的深度相同,它们都给出相同的移动,它们只在速度方面有所不同。测试游戏算法速度

你知道我该如何测试我制作的新算法吗?除了减去系统时间,它开始到系统时间结束。我想说的是我需要用一点点的公式做一点正式的测试。我是否应该模拟所有可能的动作并计算每个算法(增强和原始)花费时间来确定移动的时间?我在这里很无能。

+0

w ^帽子那种比赛是吗?两个AI可以相互对抗吗? –

+0

基于最小最大值算法的算法是什么?如果是这样 - 比较两次可能不是一个好主意。 – amit

+0

这是一款棋盘游戏,两个AI可以相互对抗,但我不需要它们,因为我只测试它们的速度。我所知道的是,修改后的算法通常更快。我只是不知道如何正式说明比原始算法快多少。例如,我可以说在测试不同类型的场景之后选择移动比原始算法快20%。我实际上在做我的论文。 – blackmambo

回答

2

我已经使用了下面的方法几次并取得了成功。如果您对多线程基准测试感兴趣,请参阅页面底部的链接。

使用CPU,系统和用户时间 定时使用CPU,系统和用户时间单线程任务时序单线程任务

  • “用户时间”是花费的时间运行你的应用程序自己的代码。

  • “系统时间”是代表您的 应用程序(例如I/O)运行OS代码所用的时间。

Java 1.5引入了java.lang.management包来监视JVM。该包的入口点是ManagementFactory类。它的静态方法返回各种报告JVM信息的不同“MXBean”对象。一个这样的bean可以报告线程CPU和用户时间。

Call ManagementFactory。 getThreadMXBean()获取描述当前JVM线程的ThreadMXBean。该bean的getCurrentThreadCpuTime()方法返回当前线程的CPU时间。 getCurrentThreadUserTime()方法返回线程的用户时间。这两种报告时间均以纳秒为单位(但请参阅附录关于时间和(缺少)纳秒精度)。

尽管如此,一定要先调用isCurrentThreadCpuTimeSupported()。如果返回false(罕见),则JVM实现或OS不支持获取CPU或用户时间。在这种情况下,你又回到了使用挂钟时间。

import java.lang.management.*; 

/** Get CPU time in nanoseconds. */ 
public long getCpuTime() { 
    ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
    return bean.isCurrentThreadCpuTimeSupported() ? 
     bean.getCurrentThreadCpuTime() : 0L; 
} 

/** Get user time in nanoseconds. */ 
public long getUserTime() { 
    ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
    return bean.isCurrentThreadCpuTimeSupported() ? 
     bean.getCurrentThreadUserTime() : 0L; 
} 

/** Get system time in nanoseconds. */ 
public long getSystemTime() { 
    ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
    return bean.isCurrentThreadCpuTimeSupported() ? 
     (bean.getCurrentCpuTime() - bean.getCurrentThreadUserTime()) : 0L; 
} 

这些方法返回自线程启动以来的CPU,用户和系统时间。要一次任务的线程开始后,调用其中的一个或多个之前和之后的任务,并采取区别:

long startSystemTimeNano = getSystemTime(); 
long startUserTimeNano = getUserTime(); 
... do task ... 
long taskUserTimeNano = getUserTime() - startUserTimeNano; 
long taskSystemTimeNano = getSystemTime() - startSystemTimeNano; 

来自,http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking#TimingasinglethreadedtaskusingCPUsystemandusertime

0

下面是一个示例程序来捕捉时机,您可以更改为适合您的需要:

package com.quicklyjava; 

public class Main { 

/** 
* @param args 
* @throws InterruptedException 
*/ 
public static void main(String[] args) throws InterruptedException { 
    // start time 
    long time = System.nanoTime(); 
    for (int i = 0; i < 5; i++) { 
     System.out.println("Sleeping Zzzz... " + i); 
     Thread.sleep(1000); 
    } 

    long difference = System.nanoTime() - time; 
    System.out.println("It took " + difference + " nano seconds to finish"); 

} 

} 

这里是输出:

Sleeping Zzzz... 0 
Sleeping Zzzz... 1 
Sleeping Zzzz... 2 
Sleeping Zzzz... 3 
Sleeping Zzzz... 4 
It took 5007507169 nano seconds to finish