【问题标题】:testing for game algorithm speed测试游戏算法速度
【发布时间】:2012-09-22 01:56:02
【问题描述】:

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

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

【问题讨论】:

  • 这是什么游戏?两个 AI 可以互相对战吗?
  • 算法是基于min-max算法吗?如果是这样 - 比较时间可能不是比较两者的好主意。
  • 这是一款棋盘游戏,两个 AI 可以互相对战,但我不需要他们,因为我只是在测试他们的速度。我所知道的是,修改后的算法通常更快。我只是不知道如何正式说明它比原始算法快多少。例如,我可以说,在测试不同类型的场景后,它在选择移动时比原始算法快 20%。我实际上是在写论文。

标签: java algorithm testing artificial-intelligence


【解决方案1】:

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

使用 CPU、系统和用户时间为单线程任务计时 使用 CPU、系统和用户时间对单线程任务进行计时

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

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

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

调用管理工厂 。 getThreadMXBean() 获取描述当前 JVM 线程的 ThreadMXBean。 bean 的 getCurrentThreadCpuTime() 方法返回当前线程的 CPU 时间。 getCurrentThreadUserTime() 方法返回线程的用户时间。这两个报告时间都以纳秒为单位(但请参阅关于时间和(缺乏)纳秒精度的附录)。

不过,请务必先调用 isCurrentThreadCpuTimeSupported()。如果它返回 false(罕见),则 JVM 实现或操作系统不支持获取 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

【讨论】:

    【解决方案2】:

    这是一个捕获时间的示例程序,您可以根据需要进行更改:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多