Из-за Набора Поколений я должен был бы сказать, что трассировка и копирование не огромные узкие места к GC.
то, Что помогло бы, помогается с аппаратными средствами барьеры ЧТЕНИЯ, которые устраняют потребность в 'остановке мировые' паузы при выполнении сканирований стека и маркировке "кучи".
Azul Systems сделал это: http://www.azulsystems.com/products/compute_appliance.htm Они дали презентацию в JavaOne о том, как их модификации оборудования допускали абсолютно бесконечный GC.
Другое улучшение было бы барьерами записи аппаратных средств, которым помогают для того, чтобы отслеживать помнившие наборы.
GCs Поколений, и еще больше для G1 или Мусора Сначала, уменьшают сумму "кучи", которую они должны просканировать, только сканируя раздел и сохраняя список помнивших наборов для указателей перекрестного раздела.
проблема, это означает ЛЮБОЕ время, мутатор (необычное слово для 'реальной программы') устанавливает указатель, это также должно поместить запись в соответствующий набор rememered. Таким образом, у Вас есть (маленькие) издержки, даже когда Вы не GCing. Если бы можно уменьшить это, Вы уменьшили бы и времена паузы, необходимые для GCing и полную производительность программы.
Вы можете установить параметр по умолчанию для столбца в миграции
....
add_column :status, :string, :default => "P"
....
ИЛИ
Вы можете использовать обратный вызов, before_save
class Task < ActiveRecord::Base
before_save :default_values
def default_values
self.status ||= 'P' # note self.status = 'P' if self.status.nil? might be safer (per @frontendbeauty)
end
end
You can do it without writing any code at all :) You just need to set the default value for the column in the database. You can do this in your migrations. For example:
create_table :projects do |t|
t.string :status, :null => false, :default => 'P'
...
t.timestamps
end
Hope that helps.
Решение зависит от нескольких вещей.
Зависит ли значение по умолчанию от другой информации, доступной во время создания? Можете ли вы стереть базу данных с минимальными последствиями?
Если вы ответили на первый вопрос «да», тогда вы хотите использовать решение Джима
Если вы ответили на второй вопрос «да», тогда вы хотите использовать решение Дэниела
. ответили нет на оба вопроса, вероятно, вам лучше добавить и запустить новую миграцию.
class AddDefaultMigration < ActiveRecord::Migration
def self.up
change_column :tasks, :status, :string, :default => default_value, :null => false
end
end
: строка может быть заменена любым типом, который распознает ActiveRecord :: Migration.
CPU дешев, поэтому переопределение Task в решении Джима не вызовет много проблем. Особенно в производственной среде. Эта миграция - правильный способ сделать это, поскольку она загружается и вызывается гораздо реже.
Я нашел способ получше чтобы сделать это сейчас:
def status=(value)
self[:status] = 'P'
end
В Ruby вызов метода не может иметь круглых скобок, поэтому я должен назвать локальную переменную чем-то другим, иначе Ruby распознает это как вызов метода.