我应该如何测试我的算法的速度?我做的增强算法和原来的算法搜索深度相同,走法相同,只是速度不同而已。
你知道我应该如何测试我制作的新算法吗?除了减去它开始的系统时间到它结束的系统时间之外。我想说的是我需要用一点公式做一些正式的测试。我应该模拟所有可能的 Action 并计算每个算法(增强的和原始的)花费时间来决定 Action 的时间吗?我在这里很无能。
最佳答案
下面的方法我用过几次,都成功了。如果您对多线程基准测试感兴趣,请参阅页面底部的链接。
使用 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;
关于java - 测试游戏算法速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540064/