测试游戏算法速度

时间:2012-09-22 01:56:03

标签: java algorithm testing artificial-intelligence

我应该如何在速度方面测试我的算法?我制作的增强算法和原始算法搜索相同的深度并且它们都给出了相同的移动,它们仅在速度方面不同。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

致电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

答案 1 :(得分: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