성능을 위해 수치 계산을위한 코드를 동적으로 생성하려는 응용 프로그램에서 작업하고 있습니다. . 이 계산을 데이터 기반 연산으로 수행하는 것은 너무 느립니다. 내 요구 사항을 설명하려면 다음 클래스를 고려하십시오.C#에서 런타임 코드 생성을위한 다양한 옵션 이해 (Roslyn, CodeDom, Linq Expressions ... ...)
내가 원하는 것은 JIT에서 프로세스의 외부 루프를 구현하는 함수를 컴파일하는 것입니다. 이 함수를 정의하는 코드는 현재 ProcessOneSample을 구현하는 데 사용되는 데이터에 의해 생성됩니다. 내가 기대하고있는 것을 명확히하기 위해 모든 사전 조회가 컴파일 프로세스에서 한 번 수행되기를 기대한다 (즉, JIT 컴파일은 사전의 관련 객체에 직접 바인드 될 것이다). 따라서 컴파일 된 코드가 실제로 컴파일 될 때 실행되면 마치 모든 조회가 하드 코드 된 것입니다.
내가 알아 내려고하는 것은이 문제를 해결하는 데 가장 좋은 도구입니다. 이 질문을하는 이유는 매우 다양한 옵션이 있기 때문입니다.
- Roslyn을 사용하십시오. 현재의 걸림돌은 구문에서 표현식을 호스트 프로그램의 멤버 변수 (즉, 'state'사전의 값)에 바인딩하는 방법입니다. 이것이 가능합니까?
- LINQ 식 (Expression.Compile)을 사용하십시오.
- CodeDom을 사용하십시오. 최근에 내 Google 검색에서이 사실을 알게되었고,이 질문을 던지는 메시지가 나타났습니다. .NET에서 세 번째 컴파일 프레임 워크를 통해 자신의 길을 걸려 넘어지는 것에 너무 성급하게 생각하지 않습니다.
- 내 원래 계획을 알고 있기 전에 이 도구들 중은 JIT가 컴파일 한 원시 코드 (x86)를 호출하는 것이 었습니다. 나는 이것에 약간 경험이있다, 그러나 나가 아직 해결하지 않은 많은 미지수가 여기에서있다. 위 옵션의 성능이 충분하지 않은 경우이 또한 내 백업 옵션입니다. 위의 3 가지 솔루션 중 하나를 선호 할 것입니다. 왜냐하면 나는 그들이 훨씬 더 간단 할 것이며, 그 중 하나가 작동하도록 가정 할 것이기 때문입니다!
누구나 공유 할 수있는 이와 같은 경험이 있습니까?
나는 당신이 수동으로 무엇을 할 것인지 이해하지 못한다. x86 asm? 무슨 맛? 그 아이디어를 떨어 뜨리는 것이 가장 좋을 것 같습니다. –
@SimonWhitehead 예, Process 메서드에서 설명한 비헤이비어를 구현하는 네이티브 함수를 생성 할 수 있습니다. 내 기본 옵션이 아니며 먼저 .Net 옵션 중 하나를 사용하여 작업하는 것을 선호합니다. 성능이 .Net 선택에서 문제가되는 경우에만이 옵션을 사용합니다. – dsharlet
코드 속도를 높이는 최선의 방법이라고 확신하십니까? 사전 액세스가 실제로 문제가 있는지보기 위해 성능을 측정 했습니까? 인터페이스 변경을 고려 했습니까 (아마도'double' 속성을 사용하여 객체 컬렉션을 사용할 수 있습니다)? – svick