Getting Started IronRuby из .net

    Понадобилось мне недавно приделать к .net проекту поддержку скриптов на Ruby, и внезапно обнаружилось что маленький helloworld пример этого в интернетах найти не так уж и просто.

    Что понадобится:
    1)IronRuby

    2)Студия, я использовал 10Rc

    Создаем любой проект и добавляем в references все dll содержимое папки ironRuby\bin из архива с сайта.
    Тестовый класс:
    namespace IronRuby.Test
    {
      public class IronRubyTest
      {
        public void Execute()
        {
          ScriptEngine _rubyEngine;
          IronRuby.Runtime.RubyContext _rubyContext;
          ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
          _rubyEngine = runtime.GetEngine("Ruby");
          ScriptScope _scope = _rubyEngine.CreateScope();
          String variable = "Hello";
          _scope.SetVariable("variable", variable);
          var result = _rubyEngine.Execute(@" variable + ' World' ", _scope);
        }
      }  
    }

    * This source code was highlighted with Source Code Highlighter.

    Вуаля, в result лежит долгожданный Hello World =)

    Небольшая проверка быстродействия:

    namespace IronRuby.Test
    {
      public class SimpleObject
      {
        public int[] mas;
        public int[] getless100()
        {
          List arr = new List();
          for (int i = 0; i < mas.Length; i++)
          {
            if (mas[i] < 100) arr.Add(mas[i]);
          }
          return arr.ToArray();
        }
      }
     
      public class IronRubyTest
      {
        public void Execute()
        {

          SimpleObject obj= new SimpleObject();
          obj.mas=new int[50000000];
          Random rand = new Random();
          for (int i = 0; i < obj.mas.Length; i++)
           obj.mas[i] = rand.Next(100000);

          ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
          ScriptEngine _rubyEngine = runtime.GetEngine("Ruby");
          ScriptScope _scope = _rubyEngine.CreateScope();
          _scope.SetVariable("obj", obj);
          DateTime time1 = DateTime.Now;
          var result1 = _rubyEngine.Execute(@" mas=[]
                             (0..obj.mas.size()-1).each do |x| 
                               if obj.mas[x]<100
                                 mas+= [obj.mas[x]]
                                end                     
                             end
                             m1=mas ", _scope);
          DateTime time2 = DateTime.Now;
          var result2 = _rubyEngine.Execute(@" obj.mas.find_all{|elem| elem<100} ", _scope);
          DateTime time3 = DateTime.Now;
          var result3 = _rubyEngine.Execute(@" obj.getless100() ", _scope);
          DateTime time4 = DateTime.Now;
          var result4 = obj.getless100();
          DateTime time5 = DateTime.Now;
          var result5 = obj.mas.Where(x => x < 100).ToArray();
          DateTime time6 = DateTime.Now;

        }
      }  
    }

    * This source code was highlighted with Source Code Highlighter.


    Тест выдал такие результаты:
    time2-time1 01:46.220
    time3-time2 00:40.602
    time4-time3 00:00.353
    time5-time4 00:00.342
    time6-time5 00:01.046

    Результат немного разочаровал, по скорости с c# кодом никакого сравнения, серьезные вычисления таким образом лучше не делать.
    Но с другой стороны скриптовые языки к .net проектам прикрепляют совсем не для таких целей.

    Also popular now: