4

복잡한 SQL 문과 같이 큰 텍스트 문자열을 작성하는 경우가 있습니다. 이 텍스트를 몇 번에 걸쳐 여러 번 붙여 넣으려고합니다. 각각은 약간 다른 매개 변수를 사용합니다. 단순히 기존의 문자열 연결을 사용하는 것이 아니라이 성능을 방해 할 수 있는지 궁금 큰 문자열 Text := Text + S + #10 + #13;컴파일러는 문자열 연결을 최적화합니까?

에있는 텍스트 (S)를 추가 단지 procedure A(const S: String);라는 이름의 서브 루틴을 사용하는 습관에 왔어요?

Text := 'some' + ' ' + 'text' + ' ' + 'and' + ' ' + 'such'; 

Text := 'some text and such'; 

이것이 사실로 : 나는 컴파일러 이런 식으로 뭔가를 최적화 생각하기 시작입니까? 컴파일러가이 시나리오를 최적화합니까? 그렇다면, 나는 이런 식으로 모든 것을 변경하기로 결정할 수도 있습니다 :

Text := 'select something from sometable st'+#10+#13+ 
    'join someothertable sot on sot.id = st.sotid'+#10+#13+ 
    'where sot.somevalue = 1'+#10+#13+ 
    'order by sot.sorting'; 

이 빠르게 이론적으로

Text:= Text + 'select something from sometable st'+#10+#13; 
Text:= Text + 'join someothertable sot on sot.id = st.sotid'+#10+#13; 
Text:= Text + 'where sot.somevalue = 1'+#10+#13; 
Text:= Text + 'order by sot.sorting'; 

보다겠습니까 아니면 일반적으로 그것을 할 방법 :

A('select something from sometable st'); 
A('join someothertable sot on sot.id = st.sotid'); 
A('where sot.somevalue = 1'); 
A('order by sot.sorting'); 
+2

왜 디버거에서 열어서 생성 된 ASM을 확인하지 않습니까? –

+0

ASM을 이해할 수 없기 때문에 나는 그것을 보았을 때 아무 것도 보이지 않습니다 : P –

+0

이 질문은 "코드 정리"가 프로젝트의 성능에서 더 중요한 결함으로 이어지는 완벽한 예입니다. –

답변

9

식을 like

'a' + 'b' 

은 컴파일 타임에 평가됩니다. 어느

str := 'a'; 
str := str + 'b'; 

위한 한편

str := 'ab'; 

, 동일 컴파일 된 코드에 할당

str := 'a' + 'b'; 

결과 병합이 실행시에 수행되는 것을 의미한다.

+0

그게 바로 내가 기대하고 기대했던 것인데, 더 많은 지식을 가진 사람으로부터 듣기 만하면 돼, 고마워! –

+1

이것은 "상수 폴딩"이라는 "구멍 뚫음 최적화"중 하나입니다. http://en.wikipedia.org/wiki/Constant_folding을 (를) 참조하십시오. Delphi 컴파일러는 모든 최적화를 구현하지는 않지만 가장 보편적이며 유용한 것입니다. 좋은 점은 델파이 최적화가 코드 로직에 실패한 것을 한번도 본 적이없는 반면 공격적 컴파일러 중 일부는 최적화 설정의 경우 일관된 동작을하지 못하는 경우가 있다는 것입니다. –

+0

아주 좋습니다. 그것은 매우 긴 인라인 문자열을 Perl이나 Python과 같은 언어에서 가능한 "here document"나 "multiline string literal"처럼 효율적으로 일련의 연결로 작성합니다. –

0

하나의 표현식에 모든 연결을 넣는 것이 비정규식이 사용되는 경우 더욱 효율적이라는 것에 유의하십시오. 이 코드를 고려해

A := '*'; 
    B := 'person'; 
    C := 'first_name=''Jerry'''; 

    Q := 'select '; 
    Q := Q + A; 
    Q := Q + ' from '; 
    Q := Q + B; 
    Q := Q + ' where '; 
    Q := Q + C; 

여섯 개 문은 위의 다섯 별도의 회씩 연결을 수행합니다.

Q := 'select ' + A + ' from ' + B + ' where ' + C; 

는 하나의 연결을 수행합니다 반면 . Delphi는 결과에 필요한 공간을 할당하고 여섯 개의 값 각각을 해당 공간에 복사합니다.

관련 문제