Запись собственной системы хранения:с чего начать?

Нет, не совсем.

1130 Во-первых, есть небольшая разница в семантике. Если a равно null, то a.concat(b) выбрасывает NullPointerException, но a+=b будет обрабатывать исходное значение a, как если бы это было null. Кроме того, метод concat() принимает только значения String, в то время как оператор + автоматически преобразует аргумент в строку (используя метод toString() для объектов). Таким образом, метод concat() более строг в отношении того, что он принимает.

Чтобы заглянуть под капот, напишите простой класс с a += b;

public class Concat {
    String cat(String a, String b) {
        a += b;
        return a;
    }
}

Теперь разберите с javap -c (входит в Sun JDK). Вы должны увидеть список, включающий:

java.lang.String cat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."":()V
   7:   aload_1
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   11:  aload_2
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;
   18:  astore_1
   19:  aload_1
   20:  areturn

Итак, a += b является эквивалентом

a = new StringBuilder()
    .append(a)
    .append(b)
    .toString();

Метод concat должен быть быстрее. Однако с большим количеством строк метод StringBuilder выигрывает, по крайней мере, с точки зрения производительности.

Исходный код String и StringBuilder (и его закрытый для пакета базовый класс) доступен в src.zip Sun JDK. Вы можете видеть, что вы создаете массив символов (изменяя размер по мере необходимости), а затем выбрасываете его, когда создаете финал String. На практике распределение памяти происходит на удивление быстро.

Обновление: Как отмечает Павел Адамски, производительность изменилась в более позднем HotSpot. javac все еще производит точно такой же код, но компилятор байт-кода обманывает. Простое тестирование полностью терпит неудачу, потому что весь объем кода отбрасывается. Суммирование System.identityHashCode (не String.hashCode) показывает, что код StringBuffer имеет небольшое преимущество. Может быть изменено при выходе следующего обновления или при использовании другой JVM. Из @lukaseder , списка встроенных функций HotSpot JVM .

5
задан pistacchio 2 July 2009 в 22:35
поделиться

5 ответов

Прежде чем вы начнете, я бы порекомендовал изучить возможность SQL-серверов хранить XML-файлы как объекты BLOB внутри реляционной базы данных. Возможно, вашу систему хранения данных не нужно создавать «с нуля». Это может быть гибрид на основе возможностей хранения XML SQL.

2
ответ дан 13 December 2019 в 05:41
поделиться

Движение NoSQL нацелено на системы огромного масштаба, в тех размерах, где реляционная модель действительно ломается. Прежде чем вы начнете писать свое собственное хранилище, я настоятельно рекомендую разобраться в реляционной модели, поскольку это одна из хорошо документированных и хорошо изученных областей в CS. Начните с Обработки транзакций Грея и Рейтера , эта книга объясняет все , что нужно знать о реализации классической СУБД. Следующим в вашем списке должны быть Readings in Database Systems , это сборник наиболее актуальных научных работ и статей.

3
ответ дан 13 December 2019 в 05:41
поделиться

Well it all depends on the app you are building.

For example, if your app just needs to persist a few hundred objects and cut through them in a few ways and doesn't care if stuff gets corrupt once in a while. You could potentially just use LINQ to query a List and persist the List to disk once in a while.

If you need anything that has the magic ACID properties, well its going to take tons of work.

If you need something that supports Transactions, its going to take tons of work.

If you need something that understands the ANSI-SQL, you are going to have to write a parser, which is lots of work.

Before embarking on writing any kind of database I think you should understand a lot of database theory, get a book, read it.

2
ответ дан 13 December 2019 в 05:41
поделиться

Взгляните на работу, проделанную ребятами из Prevayler. Они отмечают, что если вы можете уместить данные в оперативной памяти, большинство сценариев использования показывают гораздо лучшую производительность и намного меньше написания кода без СУБД. С другой стороны, ребята из Google и Amazon показывают, что для больших объемов данных вы не хотите использовать СУБД. Поскольку мы переходим на 64-разрядные ОС и компьютеры с большим количеством оперативной памяти, СУБД находятся между камнем и наковальней.

2
ответ дан 13 December 2019 в 05:41
поделиться

Вопрос SO «Внедрение базы данных - как начать» дает несколько полезных ответов на ваш вопрос!

2
ответ дан 13 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: