2012-09-22 96 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