패스트 코드
FastCodeFastCode는 엠바카데로 델파이와 C++빌더를 위한 강화된 런타임 라이브러리 루틴을 제공하는 것을 목적으로 하는 오픈 소스 프로그래밍 프로젝트입니다.2003년 Dennis Kjaer Christensen에 의해 시작된 이후 32비트 Delphi 런타임 라이브러리(RTL)에 고도로 최적화된 기능을 제공했습니다.FastCode는 커뮤니티 주도의 오픈 소스 특성으로 상용 컴파일러 런타임 라이브러리에 대한 기여 중에서 독특합니다.
구조.
이 프로젝트는 여러 가지 과제로 나뉘어진 경쟁으로 구성되어 있습니다.각 과제는 하나의 기능을 사용하여 여러 대상에 대해 최적화합니다.이 프로젝트에서는 각 기능의 기여도를 벤치마킹하고 검증하기 위한 도구를 제공합니다.기여당 1점이 부여되며(대상당 최대 1개의 기능이 부여됨) 목표 우승자에게는 10점이 부여된다.모든 기여자와 그 점수가 포함된 목록이 유지되며, 2008년까지 매년 연말에 수상자가 축하되었다.델파이와 C++빌더의 오너인 볼랜드, 코드기어, 엠바카데로는 역사적으로 상을 후원해 왔습니다.
경쟁사의 대부분은 프로세서 고유의 32비트 코드와 MMX, SSE, SSE2, SSE3, SSE3 [1]및 SSE4와 같은 추가 명령 세트를 자주 사용하는 어셈블러 개발자들입니다.
이 프로젝트는 FastCode 팀의 공헌을 인정하고 델파이의 [2]코드베이스에 코드를 통합하는 Embacadero의 지원을 받고 있습니다.Embacadero Delphi의 기본 메모리 매니저인 FastMM4는 FastCode Memory Manager [3]챌린지의 승자입니다.
이 프로젝트는 Robert Lee의 Optimal Code 사이트에서 처음 진행되었으며 소스 코드의 홈페이지는 [1]이며 2008년에 마지막으로 업데이트되었습니다.소스 코드에는 향상된 루틴과 루틴을 벤치마킹하기 위한 테스트 스위트가 모두 포함되어 있습니다.2017년에는 Move, FillChar 및 메모리 매니저의 벤치마크 루틴이 [2]에서 제공되는 64비트로 이식되었습니다.
테스트
Fast Code 프로젝트는 테스트에 많은 노력을 기울이고 있으며 매우 고품질의 소프트웨어를 제공하는 데 중점을 두고 있습니다.테스트는 정확성 테스트와 속도 테스트의 두 가지 범주로 나뉩니다.
확인
검증은 타깃 세트의 모든 CPU에서 수행되며, 다른 CPU 및 OS(Windows XP, Windows Vista, Windows 7 등)에서도 수행되는 경우가 많습니다.검증은 일반 사용 사례와 오류 사용 사례 모두 다양한 함수 입력에 걸쳐 수행됩니다.검증은 기존의 올바른 값과 기존 RTL 함수와 같은 참조 구현에 대해 수행됩니다.
벤치마킹
벤치마킹은 지정된 시간에 현재 타깃세트의 일부인 모든 CPU에 대해 실행됩니다.이들 CPU는 지금까지 또는 그 일부입니다.(인텔 Pentium 3, 인텔 Pentium M, 인텔 Pentium 4, 인텔 Core, 인텔 Core 2, AMD Athlon XP, AMD Opteron, AMD Phenom).벤치마크를 안정적이고 현실적인 것으로 만들기 위해 많은 주의를 기울여 왔습니다.특히 메모리 매니저의 챌린지 벤치마크는 공정하게 취득하기 어려웠고 메모리 매니저의 사용 로그는 실제 어플리케이션의 통상적인 사용으로 작성되어 벤치마크에 의해 재생되었습니다.
대상
전체 타겟셋에 대해 테스트가 완료되었습니다.새로운 타겟 세트는 매년 FastCode 커뮤니티가 투표할 수 있는 폴링에서 결정됩니다.타깃 세트는 보통 6개의 CPU로 구성됩니다.이 CPU는 인텔제 4개, AMD제 2개입니다.이 비율은 시장 점유율을 모방하기 위해 선택되었습니다.이들 6개의 CPU 타깃 외에 6개의 CPU를 혼합한 것으로 정의된 타깃이 10개 있습니다.이 10가지 타깃은 계산된 타깃이라고 불리며 속도만 사용할 수도 있고 속도와 크기를 조합할 수도 있습니다.허용되는 최대 명령 집합은 대상마다 다릅니다.타겟은 다음과 같습니다.IA32 사이즈 패널티" 또는 SSE2.크기에 대한 벌칙은 각 도전에 대해 여론조사를 통해 결정된다.
과제 목록
FastCode 프로젝트에는 다음과 같은 과제가 있습니다[3].
- AES(Advanced Encryption Standard)
- AsiStringReplace(문자열 내의 서브스트링 오카렌스를 바꿉니다)
- ArcCos(역코시너스를 계산합니다.Single, Double 및 Extended 정밀도의 오버로드 버전)
- ArcSin(역 사인파 계산).Single, Double 및 Extended 정밀도의 오버로드 버전)
- Ceil32(최대 32비트 정수값을 반환합니다.)
- Cille64(64비트에 가까운 최대 정수값을 반환합니다.)
- CharPos(문자열에서 처음 발생한 문자를 검색합니다.이 오카렌스의 위치가 반환됩니다).
- CharPosIEx(캐소문자를 구분하지 않고 매개 변수로 전달된 인덱스부터 시작하는 문자열 내의 Char의 첫 번째 오카렌스를 검색합니다.이 오카렌스의 위치가 반환됩니다).
- CharPosEy(파라미터로 전달된 인덱스에서 시작하는 문자열에서 N번째 Char 발생을 검색합니다.이 오카렌스의 위치가 반환됩니다).
- CharPosRev(문자열에서 마지막으로 발생한 문자를 검색합니다.이 오카렌스의 위치가 반환됩니다).
- Compare Mem (2개의 메모리블록을 비교합니다)
- CompareStr(AnsiString 유형의 2개의 문자열을 비교합니다.)
- CompareText (2개의 문자열을 비교합니다)
- Fillchar(스토리지 버퍼의 섹션을 동일한 바이트 또는 문자 FillValue FillCount 시간으로 채웁니다.)
- Floor32(최소 32비트 정수값을 반환합니다).
- Floor64(64비트에 가까운 최소 정수값을 반환합니다.)
- GCD32(Great Common Divisor 32비트)
- IDCT(역 이산 코사인 변환)
- Int64Div(64비트 정수 2개를 나눕니다)
- Int64Mul (2개의 64비트 정수를 곱합니다)
- IntToStr(정수를 문자열로 변환)
- IsPrime(Primeity를 위해 32비트 정수 테스트)
- LowerCase(문자열을 소문자로 변환)
- MaxFP(최대 2개의 단일, 이중 또는 확장 부동 소수점 값을 반환합니다.)
- MaxInt(최대 2개의 정수 값을 반환합니다)
- MaxInt64(최대 2개의 64비트 정수값을 반환합니다)
- 메모리 매니저
- MinFP(최소 2개의 단일, 이중 또는 확장 부동 소수점 값을 반환합니다.)
- MinInt(최소 2개의 정수값을 반환함)
- MinInt64(64비트 정수 값 2개 이상 반환)
- 이동(N바이트를 원본에서 대상으로 복사)
- 극복소수 추가
- 극복소수 감산
- 극복소수 곱셈
- 극복소수분할
- 극에서 직사각형으로 변환
- Pos(String에서 하위 문자열이 처음 표시되는지 검색합니다.이 오카렌스의 위치가 반환됩니다).
- PosEx(파라미터로 전달된 인덱스에서 시작하는 문자열의 첫 번째 하위 문자열을 검색합니다.이 오카렌스의 위치가 반환됩니다).
- PosIEx(대소문자를 구분하지 않고 매개 변수로 전달된 색인에서 시작하는 문자열의 첫 번째 하위 문자열이 검색됩니다.이 오카렌스의 위치가 반환됩니다).
- 검정력(기본값이 지수로 상승함)
- 직사각형 복소수 추가
- 직사각형 복소수 감산
- 직사각형 복소수 곱셈
- 직사각형 복소수 분할
- 직사각형에서 폴라 형식 변환
- RGBA에서 BGRA로(비트맵 형식 변환)
- 반올림(단일값, 이중값 또는 확장값으로 반올림)64비트 정수를 반환합니다).
- RoundToEx ("Banker's 반올림"을 사용하여 a의 정밀도 부동소수점 값을 지정된 자릿수 또는 10의 거듭제곱으로 반올림)
- Round32(싱글, 더블 또는 확장값으로 반올림)32비트 정수를 반환합니다).
- 스케일 다운(비트맵 스케일링)
- 종류
- StrComp(대문자와 소문자가 구분된2개의 늘 종단 문자열과 비교)
- StrCopy(늘 끝 문자열 중 하나를 다른 문자열로 복사)
- StrIComp(대문자와 소문자를 구분하지 않고2개의 늘 종단 문자열과 일치)
- StrLen(제로 종료된 문자열의 길이를 반환합니다)
- StrLComp(대문자와 소문자를 구분하여 최대 길이까지의2개의 늘 종단 문자열과 일치)
- StrLIComp(대문자와 소문자를 구분하지 않고 최대 길이까지2개의 늘 종단 문자열과 일치)
- StrToInt32(스트링을 32비트 정수로 변환)
- 트리밍(문자열의 시작과 끝에서 공백 및 제어 문자 제거)
- TList. 정렬
- Trunc(싱글, 더블 또는 확장 값)64비트 정수를 반환합니다).
- Trunc32(싱글, 더블 또는 확장 값을 변환합니다.32비트 정수를 반환합니다).
- UpperCase(문자열을 대문자로 변환)
- 발
델파이 RTL에 대한 기여
Delphi RTL에 포함된 FastCode 함수:
- 델파이 2005: 비교텍스트, Int64Div 및 FillChar
- 델파이 2006:[4] 비교텍스트, Int64Div 및 FillChar, FastMM4 메모리 매니저
- Dellphi 2007 - Delphi XE : ArcCos, ArcSin, Power, PosEx, Move, Memory Manager, FillChar, Pos, __lldiv, LowerCase, UpperCase, CompareStr, CompareMem, CompareCase, CompareMem, CompareChar텍스트, StrLen, StrCopy, StrComp.[5]
Marco Cantu의 Mastering Delphi 책에는 FastCode에 관한 장에서 Delphi [6]RTL에 대한 기여가 기재되어 있습니다.
패스트 코드 라이브러리
모든 챌린지 수상자는 FastCode 라이브러리(http://fastcode.sourceforge.net/challenge_content/rtl_replcmnt_pkg.html)에 포함되어 있습니다.이 라이브러리는 MPL 라이선스로 출시된 오픈소스입니다라이브러리는 1) 함수를 직접 호출하는 방법과 2) 패치 적용 기능을 사용하는 방법의 두 가지 방법으로 사용할 수 있습니다.
함수를 직접 호출할 경우 가장 빠르다고 생각하는 기능의 버전을 호출하는 것은 전적으로 애플리케이션 개발자에게 달려 있습니다.
패치 적용 기능을 사용하면 라이브러리는 애플리케이션 로드 시 CPU 유형을 자동으로 검출하고 이 정보를 사용하여 모든 함수 호출을 해당 CPU의 FastCode 승자 함수로 수정합니다.
FastMM4 메모리 매니저
2006년부터 델파이와 C++ Builder가 사용하고 있는 FastMM 메모리 매니저도 FastCode [7]경쟁사의 승자입니다.Delphi의 표준 메모리 매니저를 대체하여 메모리 플래그멘테이션이 발생하기 쉬울 뿐만 아니라 애플리케이션 종료 [8]시 메모리 누수를 보고할 수 있고 메모리 릴리스 후 또는 더블 릴리스 후 사용을 검출할 수 있는 등 디버깅 가능성이 향상되었습니다.
FastMM4는 [9]Lazarus에서 개발된 애플리케이션의 메모리 매니저로도 사용됩니다.
FastMM4는 델파이 [10]개발자의 필수 툴로 자주 언급되고 있습니다.
Nexus DB에는 누출 점검을 위한 [11]FastMM4 통합이 포함되어 있습니다.
FastMM 의 사용 방법에 대해서는, 「BDS 2006 [12]의 새로운 메모리 매니저」를 참조해 주세요.
패스트 코드를 사용하는 응용 프로그램
Delphi 또는 C++ Builder에서 개발된 응용 프로그램은 일반적으로 FastMM4라는 기본 메모리 매니저를 사용합니다. RTL의 FastCode 함수는 가장 일반적으로 사용되는 함수로 선택되었으며 응용 프로그램도 이러한 기능 중 일부를 사용합니다(특히 문자열 처리가 이루어지는 경우).따라서 대부분의 Delphi/C++ Builder 애플리케이션은 FastCode 프로젝트에서 개발한 코드를 사용합니다.예를 들어 Skype, FL Studio, Embacadero 자체 RAD Studio 등이 있습니다.Hallvard의 블로그에서는 FastMM4가 온라인 트레이더 어플리케이션에서 메모리 매니저로 사용되는 이유에 대해 설명하고 있습니다.
레퍼런스
- ^ "How to Optimize Delphi Application Performance to the Max using FastCode Library". Retrieved 3 September 2015.
- ^ "Nick Hodges". Retrieved 3 September 2015.
- ^ a b "The Oracle at Delphi". Retrieved 3 September 2015.
- ^ Long, Brian & Swart, Bob, "Borland Developer Studio 2006 Review", 델파이 매거진 124호, 2005년 12월호
- ^ "Community contributions improve Delphi 2007 RTL performance". Retrieved 3 September 2015.
- ^ "Mastering Delphi Update for Delphi 2006". Retrieved 3 September 2015.
- ^ Gabrijelcic, Primoz, "메모리 관리를 위해", 델파이 매거진 제126호, 2006년 2월
- ^ "FastMM4". Retrieved 3 September 2015.
- ^ "Lazarus Free Pascal". Retrieved 3 September 2015.
- ^ "Good Tools for Delphi Developers". Delphi Programming. Retrieved 3 September 2015.
- ^ "NexusDB". Retrieved 3 September 2015.
- ^ "The New Memory Manager In BDS 2006 - by Pierre le Riche". Retrieved 3 September 2015.