以%.7f格式创建时间戳字符串的更快方法

时间:2011-03-18 07:04:02

标签: java optimization timestamp

这是我必须以%.7f格式创建时间戳字符串的函数。此功能仅需2-3毫秒即可执行。但它在我的代码中从很多地方调用,即使优化它1 ms,我将在一个特定的用户操作中节省1秒。有什么想法吗?

public static String makeTimestamp()
{
    long millis = System.currentTimeMillis();
    String result;
    Double ts = new Double((millis) / 1000.0);

    ByteArrayOutputStream b = new ByteArrayOutputStream();
    PrintStream p = new PrintStream(b);
    p.printf("%.7f", ts );
    result = b.toString();
    try
    {
        p.close();
        b.close();
    } catch (IOException ioe) {};
    return result;
}

3 个答案:

答案 0 :(得分:2)

我不知道它的速度有多快,但是怎么样

public static String makeTimestamp()
{
    return String.format("%.7f", ((double)System.currentTimeMillis())/1000);
}

(我不确定为什么我们将双重带入图片中。)

答案 1 :(得分:2)

目前还不清楚为什么要浏览PrintStream等。出了什么问题:

public static String makeTimestamp()
{
    long millis = System.currentTimeMillis();
    return String.format("%.7f", millis / 1000.0);
}

在我的上网本上,每次迭代需要大约0.04ms ......但即使你的原始代码每次迭代也只需要大约0.1ms。你现在在跑什么需要2-3ms?例如,你在调试器中运行吗?我不明白为什么会这么慢 - 这不像我的上网本是一台特别快的机器。

除了所有性能问题之外,我认为上述方法的主要优点是简单性。由于没有充分的理由,原件非常复杂。

答案 2 :(得分:2)

如果您绝对需要它,这大约比字符串格式快10倍:

public static String makeTimestamp() {
    return formatTime(System.currentTimeMillis(), 7);
}

public static String formatTime(long millis, int fractionDigits) {
    int integerDigits = (int) Math.log10(millis / 1000.0) + 1;

    char[] chars = new char[integerDigits + fractionDigits + 1];
    for (int i = 0; i < chars.length; i++) {
        chars[i] = '0';
    }

    millis *= Math.pow(10, fractionDigits - 3);
    for (int i = chars.length - 1; i >= 0; i--) {
        if (i == integerDigits) {
            chars[i] = '.';
            i--;
        }

        chars[i] = (char) (millis % 10);
        chars[i] += '0';

        millis /= 10;
    }

    return new String(chars);
}