如何衡量算法的时间

4

我有一个算法,想要测量它的运行时间,但是得到了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

控制台

794076
4个回答

5

System.out.println(MD5TIME); 输出什么? - jmj
很遗憾,静态值没有被修改,刚才检查过了。 - Yoda
对于SHA,你仍在使用 System.currentTimeInMillis(),请尝试清理并重新编译代码。 - jmj
我已经纠正了它。方法addshorcuts...是从另一个类中调用的,原始静态值没有被修改。我会快速编辑。 - Yoda
请问您能否尝试将计算规模扩大一些,比如进行1000次计算,或者发布精确的代码以在IDEone上重现。 - jmj

3

下投票的绅士能否解释一下为什么要进行下投票。 - Aravind Yarram

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();
        }
    }

}

感谢您的回答。


尽管你的问题的被接受的答案提供了简单的答案,但不幸的是,这并不是确定正确时间的正确方法。 - Aravind Yarram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接