0

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

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

4

2 回答 2

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 实现或操作系统不支持获取 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

于 2012-09-22T02:09:45.777 回答
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
于 2012-09-22T02:16:16.707 回答