Более быстрый способ создания строки метки времени в формате% .7f - PullRequest
0 голосов
/ 18 марта 2011

Это функция, которую я должен создать для строки метки времени в формате% .7f. Эта функция выполняется всего за 2-3 мс. Но он вызывается из многих мест в моем коде, даже оптимизировав его на 1 мс, я сэкономлю 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 ]

2 голосов
/ 18 марта 2011

Не совсем понятно, почему вы проходите PrintStream и т. Д. Что не так с:

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

На моем нетбуке это занимает около 0,04 мс за итерацию ... но даже ваш оригинальный код занимает всего около 0,1 мс за итерацию. На чем вы работаете, что в настоящее время занимает 2-3 мс? Вы работаете в отладчике, например? Я не могу понять, почему это так медленно, ведь мой нетбук не слишком быстрая машина.

Хотя все характеристики важны, я бы сказал, что основным преимуществом вышеуказанного метода по сравнению с вашим оригиналом является простота. Оригинал очень сложный безо всякой на то причины.

2 голосов
/ 18 марта 2011

Если вам это абсолютно необходимо, это примерно в 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);
}
2 голосов
/ 18 марта 2011

Я не знаю, насколько это быстрее, но как насчет

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

(и я не уверен, почему мы привносим двойное в картину).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...