저는 Delphi 애플리케이션에서 모든 성능 비트를 집어 넣으려고하고 있습니다. 이제 동적 배열과 함께 작동하는 절차를 밟았습니다. 가장 느린 라인은Delphi에서 배열 초기화의 빠른 방법
입니다. SetLength (Result, Len);
동적 배열을 초기화하는 데 사용됩니다. SetLength 프로 시저의 코드를 살펴보면 최적은 아니라는 것을 알 수 있습니다. 다음과 같이 호출 시퀀스는 다음
_DynArraySetLength -> DynArraySetLength
DynArraySetLength는 (초기화 제로 임) 다음과 같은시 초기화 불필요하다는 ReallocMem 사용 배열 길이를 얻는다.
나는 동적 배열을 항상 초기화하기 위해 SetLength를하고 있었다. 어쩌면 내가 뭔가를 놓친거야? 이 작업을 수행하는 더 빠른 방법이 있습니까?
편집 : 주요 알고리즘을 설명하는 것은 많은 공간이 필요하며 실제로는 그 중 일부를 최적화하려고하기 때문에 불필요합니다. 일반적으로 그것은 Vehicle Routing Problem (http://en.wikipedia.org/wiki/Vehicle_routing_problem)입니다. 모든 데이터를 유지해야하므로 할당량이 필요합니다. Probalby는 내가 여기에 영리한 데이터 구조를 생각할 수 있다면 도움이 될 것이지만, 내가 생각할 수있는 어떤 것이라도 코드의 복잡성을 크게 증가시킬 것이다. 기본적으로 알고리즘 수준에서 할 수있는 모든 작업을 수행 했으므로 이제는 저수준의 모든 것을 얻을 수 있도록 노력하고 있습니다. 그래서 이것은 다소 좁은 질문입니다 :이 특별한 전화를 더할 수있는 가능성이 있습니까? 그리고 나는 이것을하기 위해 SetLength 코드에 기초한 나 자신의 초기화 함수를 작성할 필요가 있다고 생각한다. 그리고 그것을 인라인으로 만드십시오.
'SetLength()'는 배열의 길이를 초기화하고 설정하는 데 사용됩니다. 그래서, 나는 그것을 최적화하는 방법을 볼 수 없어 - 두 가지 기능을 분할. 정말 문제입니까? 초기화하는 동안에 만 실행해야합니까? 아니면 여러 번 실행 했나요? – TridenT
길이가 0 인 배열은 nil 포인터로 표현됩니다. 실제로 FWIW - 실제로 동적 배열 위치에 nil을 할당하면 SetLength (arr, 0)와 같습니다. 'SetLength'가 너무 느리다면 아마 너무 자주 호출 할 것입니다. 안드레아스 (Andreas)가 자신의 대답에서 말했듯이, 한 번 호출하여 가장 큰 크기에 충분히 큰 크기를 설정 한 다음 길이를 독립적으로 추적합니다. –
SetLength (Result, Len)을 한 번 수행하는 함수에 대해 수천 회 SetLength (Result, Len) 또는 한 번의 호출을 수행하는 함수를 한 번만 호출합니까? 첫 번째 경우 아래에서 Andreas 응답을 확인하십시오. 두 번째 경우에는 더 까다로울 것입니다. – LeGEC