Конструкторы Grails - Задание свойств против сопоставленных аргументов - PullRequest
0 голосов
/ 06 января 2012

Есть ли разница в производительности (или других объективных факторах) между вызовом пустого конструктора GORM и настройкой свойств по отдельности, а также сопоставлением параметров в конструкторе?

, т. Е.

Foo foo = new Foo()
foo.bar = 1
foo.baz = 2

против

Foo foo = new Foo(bar: 1, baz: 2)

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

Ответы [ 3 ]

7 голосов
/ 07 января 2012

Я не верю, что между ними есть какой-то выигрыш в эффективности.Конструктор карты (второй) внутри делает то же самое.Это может быть немного медленнее, потому что он должен проходить по карте.

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

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

Наконец, что бы вы ни выбрали, как всегда, будьте последовательны!

6 голосов
/ 07 января 2012

Я бы сказал, нет значительная разница в производительности.Я провел несколько тестов, создавая 1000 объектов в каждую сторону, и каждый путь всегда занимал менее 50 мс, так что в этот момент вы, вероятно, раскалываете волосы.В обоих случаях сеттеры (если реализованы) вызываются, так что вы можете пойти по этому пути.

Я бы пошел с тем, что легче читать.Что касается последовательности, да, в целом, я думаю, что это важно, но я бы придерживался более удобного для чтения.Если вы строите объект с 20 свойствами, карта может быть не самой лучшей.Если вы создаете его с 4 свойствами, то, возможно, это имеет смысл.

Вот тесты, которые я провел:

@Test
public void performance1() {
    def times = []
    10.times {
        1000.times {
            def startTime = System.currentTimeMillis()
            def user = new User()
            user.firstName = "Steve"
            user.lastName = "Jobs"
            def endTime = System.currentTimeMillis()
            times << endTime - startTime
        }
    }
    println "Average: ${times.sum() / 10}"
}

@Test
public void performance2() {
    def times = []
    10.times {
        1000.times {
            def startTime = System.currentTimeMillis()
                    def user = new User(firstName: "Steve", lastName:"Jobs")
            def endTime = System.currentTimeMillis()
            times << endTime - startTime
        }
    }
    println "Average: ${times.sum() / 10}"
}
2 голосов
/ 28 февраля 2012

Я лично убедился, что для классов доменов большой успех с точки зрения производительности.

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

Я использую Grails 2.01, поэтому проблема (?) Все еще существует.

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