2009-07-21 3 views
2

저는 현재 작업중인 프로젝트의 맞춤 수학 라이브러리를 만들려고합니다. 이 프로젝트는 C#으로 작성되었으며, C#이 충분히 빠를 지에 대해 약간 관심이 있습니다. 이 라이브러리에는 매우 큰 데이터 세트에 적용 할 수있는 여러 가지 맞춤 수학 공식 및 수치가 있습니다. 시뮬레이션과 매트릭스 작업도 수행되므로 (즉 몬테카를로 시뮬레이션) 빠른 속도가 필요합니다.수학 라이브러리 개발

하나의 생각은 C++에서 수학 라이브러리를 만들고이 .dll을 C# 프로젝트 내에서 참조하는 것입니다. 노력할만한 가치가 있는지 궁금합니다.

+0

라이브러리는 무엇을 처리합니까? – jkeys

+2

어떤 종류의 수학 라이브러리를 찾고 계십니까? 이미 많이 최적화 된 수학 라이브러리가 이미 있으므로 인터페이스 할 수 있습니다. –

+0

또한 라이브러리를 그렇게 최적화해야하는 이유에 대한 정보를 게시하는 경우 매우 유용합니다. 그것은 여러 번 반복해서 호출 될 것인가 아니면 하나의 매우 큰 데이터 세트 또는 아마도 둘 다 처리 할 것인가? 질문에 대답하는 것이 도움이 될 것입니다. – Odd

답변

6

일반적인 규칙은 "은 사용자가이 될 때까지는 최적화되지 않습니다."따라서 C#으로 작성하고 나중에 코드를 최적화하는 방향으로 기울여야합니다.

그러나 최적화에서 모든 것을 다른 언어로 다시 구현해야하는 상황에서는 먼저 몇 가지 테스트를 수행 할 것입니다. C#과 C++ 모두에서 가장 프로세서 집약적 인 수학을 사용하여 작은 응용 프로그램을 작성한 다음 시간을 비교하여 C#을 사용할 수 있는지 확인하십시오.

1

확실한 것을 말하면 조금 어렵습니다. 그게 당신이 시작했거나 프로젝트의 나머지 부분을 기반으로한다면 C#을 고집하는 것이 좋습니다. 표준 데이터 세트를 보관하고 개발하면서 벤치 마크를 수립하십시오. 성능이 용인 할 수없는 임계 값을 밑돌고 프로파일 링을 통해 문제가 C#의 본질이라고 생각되면 C++ 구성 요소를 작성하여 이러한 특정 요구 사항을 해결하십시오.

5

C#에서 사용할 예정이라면 C#으로 시작하는 것이 좋습니다. 당신은 포인터 논쟁으로 저장하는 것보다 관리 코드로 더 많은 것을 살 수 있습니다. 메모리 및 캐시 문제가 걱정된다면 객체 대신 배열 유형을 사용하십시오. 그것은 당신에게 메모리가 배치되는 방법에 대한 제어를 제공합니다.

최적화 프로그램과 JIT 컴파일러는 비효율적 인 사항을 보완 할 수있는 충분한 속도를 제공합니다.

1

C# 또는 Java와 같은 바이트 코드 언어를 사용하면 런타임의 JIT 컴파일러에서 코드를 최적화 할 수 있습니다. 실제로 이는 코드 의 런타임 성능이 시간이 지남에 따라보다 좋음을 의미합니다. 컴파일시 한 번만 생성되고 변경되지 않는 C++과 달리 기본 JIT 컴파일러의 개선과 함께 C# 코드의 성능이 지속적으로 향상 될 수 있습니다.

요즘에는 JIT 컴파일러 기술에 심각한 문제가 있습니다. 이제 이것을 활용하는 것이 탁월한 접근법입니다.

+0

.Net JIT에는 현재 모드와 같은 핫스팟이 없으므로 프레임 워크 자체가 개선되어서 만 발생합니다 (현재 새 버전이 출시 될 때마다 보장 될 수는 없지만 현재로서는 매우 그렇습니다). Java에는 HotSpot VM (및 JRockit과 같은 더 적극적인 것)이 있습니다.이 API는 현재 실행중인 프로세스를 응용 프로그램이 실행될 때 다시 시작할 수있게합니다. 나는 당신이 이전의 스타일보다는 오히려 더 발전된 스타일에 대해 이야기하고 있다고 가정하지만, 분명히하고 싶었습니다. – ShuggyCoUk

+0

맞습니다. 저는 일반적으로 적응 형 at-runtime 재 컴파일보다는 이전 스타일을 언급하고있었습니다. 그러나 후자는 쉽게 미래에도 올 수 있습니다! –

0

숫자 프로그래밍에 C#을 사용하는 이유 중 하나는 기본 코드와의 인터페이스가 매우 쉽다는 것입니다. C#과 최신 .NET 런타임 및 JIT 컴파일러는 꽤 좋지만 때로는 고도로 최적화 된 원시 코드를 이길 수없는 경우가 있습니다. 예를 들어, 여기 선형 대수학을 위해 한 일이 있습니다. 키 조작의 구현을 숨기는 멋진 객체 지향 클래스를 작성하십시오. 필자에게 이것은 덧셈과 곱셈 함수/연산자를 사용하여 Matrix와 Vector 클래스를 만드는 것을 의미했습니다. 여러 matrx- 매트릭스 제품을 수행하고 많은 반복을 통해 다소 큰 매트릭스 (수천 개의 행을 수백 열로)로 변환하는 알고리즘을 만났을 때 상황이 너무 느려졌습니다. 매트릭스 곱셈 함수를 다시 구현하여 인텔의 수학 커널 라이브러리 (dgemm)에서 고도로 최적화 된 매트릭스 - 매트릭스 곱셈 함수를 호출했습니다. 이것은 나에게 20x 속도보다 나은 것을 주었다. 이 원시 루틴에 대한 불쾌한 API (dgemm은 13 개 이상의 매개 변수를가집니다!)가 매트릭스 클래스의 사용자로부터 숨겨졌습니다.

그래서 라이브러리에 C#을 사용하고 필요할 때 언제 어디서나 최적화 된 네이티브 코드로 드롭 다운하시기 바랍니다.

관련 문제