Я должен использовать байт или интервал?

Иногда, когда он уничтожается, объект должен совершить действие. Например, если объект имеет не-java-ресурс, такой как дескриптор файла или шрифт, вы можете проверить, освобождены ли эти ресурсы до уничтожения объекта. Для управления такими ситуациями java предлагает механизм, называемый «финализация». Завершая его, вы можете определить конкретные действия, которые происходят, когда объект собирается быть удален из сборщика мусора. Чтобы добавить финализатор в класс, просто определите метод finalize (). Время выполнения Java вызывает этот метод всякий раз, когда он собирается удалить объект этого класса. В рамках метода finalize () вы указываете действия, которые необходимо выполнить перед уничтожением объекта. Сборщик мусора периодически ищет объекты, которые больше не ссылаются ни на какое рабочее состояние, ни косвенно на любой другой объект со ссылкой. Перед выпуском актива среда выполнения Java вызывает метод finalize () объекта. Метод finalize () имеет следующий общий вид:

protected void finalize(){
    // This is where the finalization code is entered
}

С ключевым словом protected доступ к finalize () кодом вне его класса. Важно понимать, что finalize () вызывается непосредственно перед сборкой мусора. Он не вызывается, когда объект выходит из области, например. Это означает, что вы не можете знать, когда, или, если будет выполнен finalize () . В результате программа должна предоставлять другие средства для освобождения системных ресурсов или других ресурсов, используемых объектом. Вы не должны полагаться на finalize () для нормальной работы программы.

27
задан niaher 27 February 2010 в 06:01
поделиться

5 ответов

class single
{
    int data;
public:
    single()
    {
        data = 0;
    }
    single(int i)
    {
        data = i;
    }
};

// in main()
single* obj[10000];
for (unsigned int z = 0; z < 10000; z++) 
{
    obj[z] = new single(10);
}
-121--2750483-

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

Если в базе данных включена регистрация запросов, можно получить время последнего запроса (обновление или выбор), завершив журнал запросов.

-121--3677592-

Обычно да, 32-разрядное целое число будет работать немного лучше, поскольку оно уже правильно выровнено для собственных команд CPU. Следует использовать числовой тип меньшего размера только в том случае, если требуется сохранить что-либо такого размера.

20
ответ дан 28 November 2019 в 05:21
поделиться

System.DayOfWeek

MSDN

Большую часть времени используют int. Не для производительности, а для простоты.

2
ответ дан ChaosPandion 28 November 2019 в 05:21
поделиться

Вам следует использовать перечисление DayOfWeek, если нет веских причин не делать этого.

DayOfWeek day = DayOfWeek.Friday;

Чтобы объяснить, поскольку я был отклонен:

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

int z;
int x = 3;
int y = 4;
z = x + y;

Это может скомпилировать. Но нет никакого способа узнать, делает ли он что-нибудь вменяемое или нет.

Gallons z;
Gallons x = new Gallons(3);
Feet y = new Feet(4);
z = x + y;

Это не скомпилируется, и даже глядя на это становится очевидно, почему нет - добавление галлонов к футам не имеет смысла .

12
ответ дан 28 November 2019 в 05:21
поделиться

Моя позиция по умолчанию - попытаться использовать строгие типы для добавления ограничений к значениям - если вы знаете их заранее. Таким образом, в вашем примере может быть предпочтительнее использовать байт dayOfWeek , потому что это ближе к вашему желаемому диапазону значений.

Вот мои рассуждения; на примере хранения и передачи годовой части даты. Часть года - при рассмотрении других частей системы, которые включают DateTimes SQL Server, ограничивается значением от 1753 до 9999 (обратите внимание, что возможный диапазон C # для DateTime отличается!) Таким образом, short покрывает мои возможные значения, и если Я пытаюсь передать что-то большее, что компилятор предупредит меня перед компиляцией кода. К сожалению, в этом конкретном примере свойство C # DateTime.Year вернет int, что заставит меня привести результат, если мне нужно передать, например. DateTime.Now.Year в мою функцию.

Эта начальная позиция обусловлена ​​соображениями долгосрочного хранения данных, предполагающих наличие «миллионов строк» ​​и дискового пространства, даже несмотря на то, что это дешево (гораздо менее дешево, когда вы размещены и используете SAN или аналогичный ).

В другом примере БД я буду использовать меньшие типы, такие как byte (SQL Server tinyint) для идентификаторов поиска, где я уверен, что не будет много типов поиска, вплоть до long (SQL Server bigint) для идентификаторов, если есть скорее всего будет больше записей. то есть для покрытия транзакционных записей.

Итак, мои эмпирические правила:

  1. Если возможно, сначала постарайтесь добиться правильности. Разумеется, используйте DayOfWeek в своем примере :)
  2. Выберите тип подходящего размера, таким образом используя проверки безопасности компилятора, которые выдают ошибки в самое раннее время;
  3. ... но компенсируют крайние потребности в производительности и простоте , особенно там, где долговременное хранилище не задействовано или где мы рассматриваем поисковую таблицу (с малым количеством строк), а не транзакционную (с большим количеством строк).

В интересах ясности хранилище БД имеет тенденцию не сокращаться так быстро, как вы ожидаете, из-за сокращения типов столбцов с bigint до меньших типов. Это происходит как из-за заполнения границ слов, так и из-за внутренних проблем с размером страницы в БД. Однако вы, вероятно, сохраняете каждый элемент данных несколько раз в своей БД, возможно, сохраняя исторические записи по мере их изменения, а также сохраняя последние несколько дней резервных копий и резервных копий журналов. Таким образом, экономия нескольких процентов ваших потребностей в хранении данных обеспечит долгосрочную экономию затрат на хранение.

Я лично никогда не сталкивался с проблемами, когда производительность в памяти байтов vs.ints было проблемой, но я потратил много часов на перераспределение дискового пространства и полностью остановил работающие серверы, потому что не было никого, кто мог бы контролировать и управлять такими вещами.

5
ответ дан 28 November 2019 в 05:21
поделиться

Используйте int. Память компьютера адресуется «словами», длина которых обычно составляет 4 байта. Это означает, что если вы хотите получить один байт данных из памяти, ЦП должен извлечь все 4-байтовое слово из ОЗУ, а затем выполнить некоторые дополнительные шаги, чтобы выделить один интересующий вас байт. Что касается производительности, то ЦП будет намного проще получить слово целиком и покончить с ним.

На самом деле, вы не заметите никакой разницы между ними в том, что касается производительности (кроме редких, крайних обстоятельств). Вот почему мне нравится использовать int вместо byte, потому что вы можете хранить большие числа практически без штрафа.

2
ответ дан 28 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

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