Oberon space
General Category => Общий раздел => Тема начата: Губанов Сергей Юрьевич от Июнь 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 секунд
-
Разглядывая огромадный сгенерированный код IL становится понятно, что dynamic -- синтаксический сахар C#, в дотнетном рантайме его нет.
-
Время затраченное на миллиард вызовов:
Test0 1.90 секунд
Test1 1.95 секунд
Test2 24.37 секунд
Ну не так и плохо. Всего один порядок. В случае двух вызовов в одной функции для одного объекта - может будет и еще лучше.
-
Гм. А разве кто-то обещал поддержку динамических языков на уровне MSIL или скажем CLR? Вроде как обещали лишь DLR (http://en.wikipedia.org/wiki/Dynamic_Language_Runtime) и он вообще говоря, создан вовсе не для повышения производительности (если производительность динамических языков вдруг в результате повысилась - это побочный эффект):
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 притащили, очевидно, для того, чтобы он мог "безшовно" взаимодействовать с модулями писаными на таких языках.
-
Ну не так и плохо. Всего один порядок.
Я думаю надо на разность смотреть:
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
Тут разность стала, да, примерно порядок.
-
Поставил по два вызова в одной процедуре:
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 вызовов? Интересует какая там асимптотика вышеобозначенного отношения разностей.
-
А если сделать не 2 а n вызовов? Интересует какая там асимптотика вышеобозначенного отношения разностей.