2010-01-04 2 views
2
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using IronPython; 
using IronPython.Hosting; 

namespace EmbeddedIP2_6 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var engine = Python.CreateEngine(); 
      var ss = engine.CreateScriptSourceFromString("B", Microsoft.Scripting.SourceCodeKind.Expression); 
      var cc = ss.Compile(); 
      var timer = System.Diagnostics.Stopwatch.StartNew(); 
      timer.Start(); 
      for (int i = 0; i < 10000; i++) 
      { 
       var scope = engine.CreateScope(); 
       scope.SetVariable("B", 2); 
       var value = cc.Execute(scope); 
      } 
      timer.Stop(); 
      System.Console.WriteLine(timer.Elapsed.ToString()); 
     } 
    } 
} 

위의 C# 3.5에서 IPY 2.0 및 IPY 2.6을 사용합니다. 필자는 IPY 2.6이 몇 배 이상 느려지는 것을 발견했다. 이것은 아마도 프로그래머 오류 일 것입니다. 어떤 도움을 주시면 감사하겠습니다. 현재 IronPython 2.6의 속도가 2.0보다 느립니다.

당신이 말할 수 없습니다 스크립트를 실행 범위

  • 내에서 변수를 설정 범위
  • 만들기

    • : 당신은 루프 내에서 세 가지를하고있는

  • +0

    중요하지는 않지만'StartNew' 이후에는'Start'가 중복됩니다. –

    답변

    2

    IronPython 2.6에서 DLR은 IDynamicMetaObjectProvider를 현재 사용되지 않는 IAttributesCollection 인터페이스 대신 범위 개체에 대한 백킹으로 사용하도록 업데이트되었습니다. 이를 통해 언어는 호출 사이트 캐싱의 이점을 최대한 활용하여 글로벌 조회를 구현할 수 있습니다. 예를 들어 "문서"속성을 가진 IDMOP을 가진 웹 브라우저를 상상해 볼 수 있으므로 언어에서 일반적으로 사용되는 값을 빠르게 검색 할 수 있습니다.

    결과적으로 모든 가져 오기/세트가 바인더를 가져와야하는 ObjectOperations를 통과하지만 호출 사이트를 만들거나 호출 사이트를 통해 호출합니다. 그것은 사전 조회를하기 위해 인터페이스 호출이었던 것보다 느립니다. 전화 사이트 생성 오버 헤드를 피하는 일반적인 경우에 대해 빠른 경로를 다시 추가 할 수 있습니다.

    장기적으로 C# 동적을 사용하여 최상의 성능을 제공하는 범위에서 값을 가져 오거나 설정할 수 있습니다. 위의 문제에 대한

    +0

    감사합니다. Dino. 나는 또한 당신이 너 자신에게 문제를 할당 한 것을 보았다. 베타 C# 4.0에서 문제가 없는지 확인하려고합니다. 최신 버전의 IPY에 대한 귀하의 최종 성명서가 위의 내용입니까, 아니면 베타 C# 4.0과 함께 사용되는 경우 현재 버전에서 사실입니까? 3.5에서이 문제를 해결할 수있는 방법이 있습니까? 예 : 내 자신의 IDynamicMetaObjectProvider를 구현하십시오 ... 어쨌든 귀하의 신속한 반응에 감사드립니다. Embedded IPY는 응용 프로그램에 본격적인 스크립팅 (따라서 사용자 지정 기능)을 제공 할 수있는 훌륭한 방법을 제공합니다. 나는 C#과 IPY의 콤보를 좋아합니다. – Akil

    +0

    "현재 버전이 베타 C# 4.0과 함께 사용되는 경우"는 IronPython 2.6 CTP for .NET 4.0 베타 2를 의미하는 경우 그렇습니다. .NET 2.0 용으로 컴파일 된 IronPython의 버전 인 경우 IDMOP 구현이 정확히 동일한 유형이 아니기 때문에 작동하지 않습니다. –

    +0

    아! 내 실수. 감사. – Akil

    0

    이 중 성능 상태가 변경되었습니다. 이 코드를 테스트 해보기를 바란다.

    또한 .NET 4.0에서 2.6을 사용해 보셨습니까? 나는 내장 된 DLR과 어떤 차이가 있는지 듣고 싶다. 거의 차이가 없지만 ...

    +0

    실행 중입니다. 어쨌든, 제 질문은 2.6이 임베디드 애플 리케이션을위한 2.0보다 빠르고 빠르다는 아이디어에 더 중점을두고 있습니다. 위의 경우는 그 의미에서 '안녕하세요 세상'사례처럼 보입니다. – Akil

    +0

    예, DLR에서 실행중인 2.6의 결과는 흥미로울 것입니다. – Finglas

    +0

    @unknown : 예, "안녕하세요 세상"예제처럼 보입니다 - 스크립트 내에서 더 많은 것을 시도해 보셨습니까? 예를 들어, 2.6의 시작/종료가 느려졌지만 실행 엔진이 빨라 졌다면, 그것은 중요 할 수 있습니다 - 또는 다른 방향 일 수 있습니다! –

    0

    해결 방법 :이 이전 코드와 성능 오버 헤드를 제거한다

    var scopeProvider = new Microsoft.Scripting.ScopeStorage(); 
    scopeProvider.SetValue("B", true, 2); 
    var scope = engine.CreateScope(scopeProvider); 
    

    .

    관련 문제