Автор Тема: Цена dynamic в C# 2010 .Net 4.0  (Прочитано 4879 раз)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Цена dynamic в C# 2010 .Net 4.0
« : Июнь 20, 2012, 01:14:51 pm »
Добавила Микрософт в C# 2010 ключевое слово dynamic для поддержки программирования в стиле динамических языков а-ля Питон. Динамика реализуется через reflection. Дошли руки померить скорость работы.

Будем вызывать процедуру Foo класса MyObject:
public sealed class MyObject
{
   public static int sum;

   public void Foo (int x, int y, int z)
   {
      sum = sum + x + y + z;
   }
}

Обычный статический вызов:
public static void Test0 (MyObject x)
{
   x.Foo(1, 2, 3);
}

Обычный вызов с предварительным динамическим приведением типа:
public static void Test1 (object x)
{
   ((MyObject)x).Foo(1, 2, 3);
}

Чисто динамический вызов (а-ля Питон):
public static void Test2 (dynamic x)
{
   x.Foo(1, 2, 3);
}

Время затраченное на миллиард вызовов:
Test0   1.90 секунд
Test1   1.95 секунд
Test2  24.37 секунд

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #1 : Июнь 20, 2012, 01:52:36 pm »
Разглядывая огромадный сгенерированный код IL становится понятно, что dynamic -- синтаксический сахар C#, в дотнетном рантайме его нет.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #2 : Июнь 20, 2012, 02:06:12 pm »
Время затраченное на миллиард вызовов:
Test0   1.90 секунд
Test1   1.95 секунд
Test2  24.37 секунд

Ну не так и плохо. Всего один порядок. В случае двух вызовов в одной функции для одного объекта - может будет и еще лучше.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #3 : Июнь 20, 2012, 02:24:25 pm »
Гм. А разве кто-то обещал поддержку динамических языков на уровне MSIL или скажем CLR? Вроде как обещали лишь DLR и он вообще говоря, создан вовсе не для повышения производительности (если производительность динамических языков вдруг в результате повысилась - это побочный эффект):
Цитировать
The DLR is used to implement dynamic languages like Python and Ruby on the .NET Framework.

By having several dynamic language implementations share a common underlying system, it should be easier to let these implementations interact with one another.
В шарп dynamic притащили, очевидно, для того, чтобы он мог "безшовно" взаимодействовать с модулями писаными на таких языках.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #4 : Июнь 20, 2012, 03:15:48 pm »
Ну не так и плохо. Всего один порядок.
Я думаю надо на разность смотреть:

1.95 - 1.90 = 0.05
24.37 - 1.90 = 22.47

В случае двух вызовов в одной функции для одного объекта - может будет и еще лучше.
Поставил по два вызова в одной процедуре:

Test0x2  3.34 сек
Test1x2  5.79 сек ( опс :o :o :o )
Test2x2  47.0 сек

5.79 - 3.34 = 2.45
47.0 - 3.34 = 43.66

Тут разность стала, да, примерно порядок.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #5 : Июнь 20, 2012, 04:01:35 pm »
Поставил по два вызова в одной процедуре:

Test0x2  3.34 сек
Test1x2  5.79 сек ( опс :o :o :o )
Test2x2  47.0 сек

5.79 - 3.34 = 2.45
47.0 - 3.34 = 43.66

Тут разность стала, да, примерно порядок.
А если сделать не 2 а n вызовов? Интересует какая там асимптотика вышеобозначенного отношения разностей.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Цена dynamic в C# 2010 .Net 4.0
« Ответ #6 : Июнь 21, 2012, 09:14:27 am »
А если сделать не 2 а n вызовов? Интересует какая там асимптотика вышеобозначенного отношения разностей.