델파이 코드 최적화 튜토리얼:
문자열 최적화
Delphi에는 세 가지 문자열 유형이 있습니다. 짧은 문자열(string[n], n=1..255) 저장 영역은 정적으로 할당되며 크기는 컴파일 타임에 결정됩니다. 이는 bp에서 상속됩니다. dos; 문자 배열(pchar)의 유형은 주로 다양한 API와의 호환성을 위한 것입니다. 이는 bp7에 등장했으며 현재는 Delphi에서 더 널리 사용됩니다. 저장 영역은 문자 배열을 사용하여 정적으로 할당하거나 getmem을 사용하여 수동으로 할당할 수 있습니다. 긴 문자 문자열(ansisstring)은 Delphi에 고유하며 저장 영역은 런타임에 동적으로 할당되므로 가장 유연하고 남용되기 쉽습니다.
Delphi의 기본 문자열 유형인 AnsiString은 반복된 초기화 없이 자동으로 빈 상태로 초기화됩니다. 다음 코드:
Delphi에는 세 가지 문자열 유형이 있습니다. 짧은 문자열(string[n], n=1..255) 저장 영역은 정적으로 할당되며 크기는 컴파일 타임에 결정됩니다. 이는 bp에서 상속됩니다. dos; 문자 배열(pchar)의 유형은 주로 다양한 API와의 호환성을 위한 것입니다. 이는 bp7에 등장했으며 현재는 Delphi에서 더 널리 사용됩니다. 저장 영역은 문자 배열을 사용하여 정적으로 할당하거나 getmem을 사용하여 수동으로 할당할 수 있습니다. 긴 문자 문자열(ansisstring)은 Delphi에 고유하며 저장 영역은 런타임에 동적으로 할당되므로 가장 유연하고 남용되기 쉽습니다.
변수:문자열;
시작하다
들:=;
…
끝;
s:=;는 필요하지 않습니다. 그러나 이것이 함수 반환 값 결과에 영향을 미치지 않는다는 점은 주목할 가치가 있습니다. 일반적으로 var 인수를 전달하는 것이 문자열 값을 반환하는 것보다 빠릅니다.
SetLength를 사용하여 긴 문자열(AnsiString)을 사전 할당하여 메모리를 동적으로 할당하는 것은 AnsiString의 주요 장점이지만 쉽게 실패할 수 있습니다. 일반적인 예는 다음과 같습니다.
s2:= ;
i:=2에서 length(s1)까지 do s2:=s2+s1[i];
삭제로 대체가 가능하다는 점은 말할 것도 없고, 위 예시의 루프에서 s2의 메모리 영역이 반복적으로 할당되는데, 이는 시간이 많이 걸린다는 점이다. 간단하고 효과적인 방법은 다음과 같습니다.
setlength(s2,length(s1)-1);
for i:=2 to length(s1) do s2[i-1]:=s1[i];
이런 방식으로 s2 메모리는 한 번만 재할당됩니다.
문자열 및 동적 배열의 스레드 안전성 Delphi 5 이전에는 동적 배열 및 긴 문자열에 대한 작업에 대한 스레드 안전이 아닌 호출이 참조 카운팅을 사용하여 중요한 문제를 처리했습니다. 그러나 Delphi 5 이후에는 일부 작업으로 직접 변경되었습니다. 이 문제를 방지하려면 중요 지침 앞에 잠금 지침을 붙입니다. 불행하게도 이 수정은 펜티엄 II 프로세서의 잠금 명령에 시간이 많이 걸리고 이 작업을 완료하는 데 약 28개의 추가 명령 주기가 필요하므로 전체 효율성이 절반 이상 감소하기 때문에 비용이 많이 듭니다. 이 문제를 해결할 수 있는 유일한 방법은 델파이 rtl의 핵심 코드를 수정하는 것입니다. 원본 파일을 백업한 후 source/rtl/sys/system.pas의 모든 잠금을 {lock}으로 교체해야 합니다. 물론 단어 전체를 교체해야 합니다. 이는 아직 완전히 최적화되지 않았습니다. 다음 단계는 delphi4 런타임 라이브러리에도 포함된 xchg 명령을 제거하는 것입니다. 이 명령에는 암시적 잠금 접두사가 있으므로 system.pas의 _lstrasg 및 _strlasg 프로세스에 있는 xchg edx는 다음과 같습니다. 제거됩니다. [eax]를 다음 코드로 바꾸세요.
mov ecx, [eax]
mov[eax],edx
mov edx,ecx
좋아, 끝났습니다. 그냥 컴파일하고 system.dcu를 덮어쓰세요. 이러한 방식으로 실행 효율성은 delphi5보다 6배, delphi4보다 2배 더 높습니다.