2012-01-06 3 views
0

빈 GORM 생성자를 호출하고 속성을 개별적으로 설정하고 생성자에서 매개 변수를 매핑하는 것의 성능 (또는 다른 객관적인 요소)의 측면에서 차이가 있습니까? Grails 생성자 - 속성 설정 및 매핑 된 인수

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

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

대 난 항상 전자를 선호했지만, 두 번째는보다 효율적인 있는지 궁금 하군요.

+1

맵 생성자를 사용하면 데이터 바인딩과 올바르게 작동하지만 속성을 직접 설정하는 것은 불가능하다고 생각합니다. 나는 100 % 확실하지는 않습니다. 이것은 선언 된 유형과 다른 유형 (예 : 양식 매개 변수의 모든 문자열)으로 속성을 설정하는 경우에만 중요합니다. –

+2

속성을 직접 설정하는 것은 데이터 바인딩 논리를 직접 거치지 않기 때문에 성능 차이가 특히 웹 응용 프로그램의 경우 중요한 것은 아니지만 조금 더 빠를 수도 있습니다. @OverZealous가 옳다. 나중에 애플리케이션을 프로파일 링하고 * 필요한 경우 성능 개선이 필요한 특정 영역을 대상으로합니다. –

답변

6

나는 의 성능 차이가 없다고 말할 것입니다. 나는 각 방법마다 1000 개의 객체를 만드는 몇 가지 검사를 실행했고, 각 방법은 항상 50ms보다 적게 걸렸습니다. 그래서 그 시점에서 머리카락을 나눌 것입니다. 두 경우 모두 setter (구현 된 경우)가 호출되므로 앞 단계로가는 것이 좋습니다.

나는 읽기 쉽기 때문에 가고 싶습니다. 일관성에 관해서는 전반적으로 중요하다고 생각하지만 읽는 것이 더 쉬울 것입니다. 속성이 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}" 
} 
+0

나는 대부분 동의한다 - 많은 속성을 설정할 때'foo '를 사용하려고한다.{}'를 사용하면 객체 반복의 모든 시각적 노이즈를 제거 할 수 있습니다. 또는지도 생성자를 사용하여 여러 줄에 걸쳐지도를 펼칠 수 있습니다. 이것은'with' 메소드와 비슷하게 보입니다. 나는 바로'foo.property = value'가 거의 최선의 선택이 아니라고 생각합니다. – OverZealous

+1

그 테스트가 여전히 발생합니까? 이것은 사람들에게 다른 플랫폼이나 다른 규모로 차이가 변하지 않도록 복제 할 수있는 기회를 제공하는 블로그 포스트를위한 좋은 사료입니다. –

7

나는 둘 사이에 어떤 효율성 이득이 생각하지 않는다 : 여기

내가 실행 한 테스트입니다. 지도 생성자 (두 번째 매개 변수)는 내부적으로 동일한 작업을 수행합니다. 그것은지도 위에 반복해야하기 때문에 조금 더 느릴 수도 있습니다.

현실 세계에서는 성능이 중요하지 않습니다. 더 중요한 것은 여기에 마이크로 최적화가 있다는 것입니다. 먼저 (매크로 최적화에만 신경 쓰는) 앱을 작성하십시오. 실제 성능 문제가있는 경우 프로필을 작성하여 수정하십시오.

정말 개인적인 취향이지만, 대부분의 Groovy 개발자는 두 번째 것이 더 관용적이며 읽기 쉽다고 말합니다. 그것은 타이핑도 훨씬 적습니다.

마지막으로, 선택하는대로, 언제나처럼 일관성을 유지하십시오!

+0

당신은이 점을 처음으로 생각한 사람이 아니며 마지막 사람이 아닙니다. 해독 성은 여기에 관심의 유일한 기준이며 ... 주관적입니다. –

2

개인적으로 도메인 클래스의 경우 실적면에서 큰 타격을 입었습니다.

성능 문제를 해결하는 동안지도 스타일 생성자 호출에서 변경된이 블로그 항목 Grails Domain Class Creation Performance을 발견했으며 많은 새 인스턴스를 만들 때 (BTW가 유지되지 않음) 요인을 얻었습니다.

grails 2.01을 사용하고 있으므로 문제 (?)가 여전히 존재합니다.

+0

2.3.7에서는 차이가 여전히 10입니다. 거대한 루핑 코드에서 맵 기반 생성자를 사용하지 마십시오. – Bulba