2012-07-07 70 views
2

我有一個算法,我想測量它的工作時間,但我得到0. 如何解決它?開始和結束都是一樣的。如何測量算法的時間

public static String MD5(String message) { 
    try { 
     long start = System.currentTimeMillis(); 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     md5.update(message.getBytes()); 
     byte[] hashBytes = md5.digest(); 

     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < hashBytes.length; i++) { 
      sb.append(Integer.toString((hashBytes[i] & 0xff) + 0x100, 16) 
        .substring(1)); 
     } 
     long end = System.currentTimeMillis(); 
     MD5TIME = end - start; 
     System.out.println(end); 
     System.out.println(start); 
     return sb.toString(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

編輯

但現在不幸的是,當我寫靜:MD5和SHA-1到文件,他們仍然是1和2

import java.io.BufferedWriter; 
import java.security.MessageDigest; 

public class ShortCuts { 
volatile static long MD5TIME = 1, SHA1TIME = 2; 
    public static String MD5(String message) { 
     try { 
      long start = System.nanoTime(); 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
      md5.update(message.getBytes()); 
      byte[] hashBytes = md5.digest(); 

      StringBuffer sb = new StringBuffer(); 
      for (int i = 0; i < hashBytes.length; i++) { 
       sb.append(Integer.toString((hashBytes[i] & 0xff) + 0x100, 16) 
         .substring(1)); 
      } 
      long end = System.nanoTime(); 
      MD5TIME = end - start; 
      System.out.println(MD5TIME); 
      return sb.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static String SHA(String message) { 
     long start = System.nanoTime(); 
     int[] t = SHA1.prepareDataForSHA1(message); 
     SHA1TIME = System.nanoTime() - start; 
     return SHA1.doSHA1(t); 
    } 

    public static void addShortcutsIntoTheFile(BufferedWriter bw, String message) { 
     try { 
      bw.newLine(); 
      bw.write("MD5"); 
      bw.newLine(); 
      System.out.println(MD5TIME); 
      bw.write("TIME: " + MD5TIME); 
      bw.newLine(); 
      bw.write(ShortCuts.MD5(message)); 
      bw.newLine(); 
      bw.newLine(); 
      bw.write("SHA"); 
      bw.newLine(); 
      bw.write("TIME: " + SHA1TIME); 
      bw.newLine(); 
      bw.write(ShortCuts.SHA(message)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

輸出

MD5 
TIME: 1 
c4909803cf840c8cf0556e16e4cc1483 

SHA 

TIME: 2 
7d3f446eef84b651dc7b519fe5ad4157279cb45e 

CONSOLE

794076 

回答

5

進行更精確的測量使用System.nanoTime()

注:

此方法僅可用於測量經過時間與不相關的系統或掛鐘時間

任何其他概念

請參見

+0

但是在這裏我又遇到了另一個問題 - >我會在一分鐘內編輯 – Yoda 2012-07-07 20:58:27

+0

靜態值不會更新。 – Yoda 2012-07-07 21:02:43

+0

什麼'System.out.println(MD5TIME);'輸出? – 2012-07-07 21:02:47

2

您可以增加計時器的分辨率。但是,如果你得到零的數字(以毫爲單位),那麼你可以通過一次性計算多次執行功能(1000+)來得到更準確的答案。

0

更正後的代碼,做工精細:

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.security.MessageDigest; 

public class ShortCuts { 
volatile static long MD5TIME = 1, SHA1TIME = 2; 
    public static String MD5(String message,BufferedWriter bw) { 
     try { 
      long start = System.nanoTime(); 
      MessageDigest md5 = MessageDigest.getInstance("MD5"); 
      md5.update(message.getBytes()); 
      byte[] hashBytes = md5.digest(); 

      StringBuffer sb = new StringBuffer(); 
      for (int i = 0; i < hashBytes.length; i++) { 
       sb.append(Integer.toString((hashBytes[i] & 0xff) + 0x100, 16) 
         .substring(1)); 
      } 
      long end = System.nanoTime(); 
      MD5TIME = end - start; 
      System.out.println(MD5TIME); 
      bw.newLine(); 
      System.out.println(MD5TIME); 
      bw.write("TIME: " + MD5TIME); 
      bw.newLine(); 
      return sb.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public static String SHA(String message, BufferedWriter bw) throws IOException { 
     long start = System.nanoTime(); 
     int[] t = SHA1.prepareDataForSHA1(message); 
     SHA1TIME = System.nanoTime() - start; 
     bw.newLine(); 
     bw.write("TIME: " + SHA1TIME); 
     bw.newLine(); 
     return SHA1.doSHA1(t); 
    } 

    public static void addShortcutsIntoTheFile(BufferedWriter bw, String message) { 
     try { 
      bw.newLine(); 
      bw.write("MD5"); 

      bw.write(ShortCuts.MD5(message,bw)); 
      bw.newLine(); 
      bw.newLine(); 
      bw.write("SHA"); 
      bw.write(ShortCuts.SHA(message,bw)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

感謝您的回答。

+0

儘管您接受的問題答案提供了簡單的答案,但不幸的是,這並不是確定正確時間的正確方法。 – 2012-07-07 22:52:29