Java writeObject Vs. writeUTF - PullRequest
       12

Java writeObject Vs. writeUTF

2 голосов
/ 08 июня 2009

Что быстрее?
out.writeObject (someString) или out.writeUTF (someString)

Ответы [ 6 ]

8 голосов
/ 08 июня 2009

Есть две вещи, которые я хочу, чтобы люди узнали из этого вопроса: Сериализация Java медленная - живите с этим. Микробенчмарки хуже, чем неудачи.

Микробенчмарки, как правило, вводят в заблуждение. Есть некоторые вещи, которые стоит сделать в качестве общей идиомы (например, поднятие strlen из цикла в C). Оптимизаторы имеют привычку ломать микробенчмарки. Возьмите ваше приложение и профилируйте его под реальной нагрузкой. Если фрагмент кода вызывает замедление работы вашей программы, не пытайтесь оптимизировать его. Микробенчмарки не помогут вам найти эти места.

writeObject и writeUTF не делают одно и то же. writeObject указывает, какой тип объекта он собирается написать. Также writeObject просто записывает обратную ссылку, если тот же объект (строка) был записан с момента последнего сброса. writeUnshared ближе к записи UTF.

Так что, если вы продолжите писать точно такой же длинный, String writeObject должен победить, потому что ему просто нужно написать обратную ссылку. Уменьшение сериализованного размера может уменьшить пропускную способность файла / сети или просто память, что может привести к более значительному повышению производительности. Для коротких строк просто выписать данные будет быстрее. writeUnshared должен почти обеспечивать производительность writeUTF, но сохраняя общность.

Обратите внимание, что во всех случаях данные записываются как UTF-8, а не UTF-16. Если вы хотите UTF-16 String.toCharArray или аналогичный, подойдет.

4 голосов
/ 08 июня 2009

Я написал тестовый пример, и writeObject работает быстрее. Одна из возможных причин: «Обратите внимание, что существует существенная разница между записью String в поток в качестве примитивных данных или в качестве Object. Экземпляр String, записанный writeObject, изначально записывается в поток в виде String. Future writeObject () вызывает write ссылки на строку в потоке. " См. Документацию writeObject.

РЕДАКТИРОВАТЬ: Однако writeUnshared все еще быстрее, чем writeUTF,

100000 runs of writeObject: 464
100000 runs of writeUnshared: 5082
100000 runs of writeUTF: 7541

import java.io.*;

public class WriteString
{
    private static int RUNS = 100000;

    private static int STR_MULTIPLIER = 100;

    public static void main(String[] a) throws Throwable
    {
        StringBuilder builder = new StringBuilder(26 * STR_MULTIPLIER);
        for(int i = 0; i < STR_MULTIPLIER; i++)
        {
            builder.append("abcdefghijklmnopqrstuvwxyz");
        }
        String str = builder.toString();

        File f = new File("oos");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));

        long startObject = System.currentTimeMillis();
        for(int i = 0; i < RUNS; i++)
        {
            oos.writeObject(str);
            oos.flush();
        }
        long endObject = System.currentTimeMillis();
        System.out.println(RUNS + " runs of writeObject: " + (endObject - startObject));

        long startUnshared = System.currentTimeMillis();
        for(int i = 0; i < RUNS; i++)
        {
            oos.writeUnshared(str);
            oos.flush();
        }
        long endUnshared = System.currentTimeMillis();
        System.out.println(RUNS + " runs of writeUnshared: " + (endUnshared - startUnshared));


        long startUTF = System.currentTimeMillis();
        for(int i = 0; i < RUNS; i++)
        {
            oos.writeUTF(str);
            oos.flush();
        }
        long endUTF = System.currentTimeMillis();
        System.out.println(RUNS + " runs of writeUTF: " + (endUTF - startUTF));

        oos.close();
        f.delete();

    }
}
1 голос
/ 09 июня 2009

Вы должны знать, что writeUTF может обрабатывать только строки длиной <65535 ... </p>

1 голос
/ 08 июня 2009

Я бы предположил, что результат может зависеть от содержимого someString. Мне приходит в голову, что было бы неразумным результатом обнаружить, что производительность writeUTF меняется, когда используются более высокие точки Юникода, так что вывод является многобайтовым.

Пожалуйста, обратите внимание, что это недоказано и просто пустая мысль.

0 голосов
/ 09 июня 2009

Вы получите лучшую производительность с DataOutputStrema.writeUTF (), чем ObjectOutputStream.writeUTF ().

0 голосов
/ 08 июня 2009

Понятия не имею.

Время оба из них, и он скажет вам быстрее, чем мы можем.

for(int i=0; i<100000; i++) {
    out.writeObject(someString);
}

for(int i=0; i<100000; i++) {
    out.writeUTF(someString);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...