Скорость Reflection .Net
От: Михаил Полюдов Россия  
Дата: 25.11.03 16:36
Оценка: 426 (12)
Статья:
Скорость Reflection .Net
Автор(ы): Михаил Полюдов
Дата: 11.04.2004
Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection "в лоб" может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.





Авторы:
Михаил Полюдов

Аннотация:
Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection ”в лоб” может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Скорость Reflection .Net
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.02.04 06:05
Оценка: 42 (1)
При использование делегатов совместно с индексерами лучше не пользоваться DynamicInvoke-ом.
Лучше вызывать делегаты через wrapper-ы.

пример:
//объявляем вспомогательные wrapper-ы
        delegate object GetObject();

        class int2object
        {
            public int2object(GetInt f)
            {
                this.f = f;
            }
            GetInt f;
            public object Execute()
            {
                return f();
            }
        }
        class string2object
        {
            public string2object(GetString f)
            {
                this.f = f;
            }
            GetString f;
            public object Execute()
            {
                return f();
            }
        }
        class DateTime2object
        {
            public DateTime2object(GetDateTime f)
            {
                this.f = f;
            }
            GetDateTime f;
            public object Execute()
            {
                return f();
            }
        }

//заполняем hash

                    Delegate del = Delegate.CreateDelegate(delegateType, this, "get_" + pi.Name);

                    GetObject getObj = null;
                    switch (pi.PropertyType.Name)
                    {
                        case "string":
                        case "String":
                        {
                            getObj = new GetObject(new string2object((GetString)del).Execute);
                            break;
                        }
                        case "DateTime":
                        {
                            getObj = new GetObject(new DateTime2object((GetDateTime)del).Execute);
                            break;
                        }
                        default:
                            getObj = new GetObject(new int2object((GetInt)del).Execute);
                            break;

                    }

                    optimize4.Add(pi.Name, getObj);
                    foreach ( DispNameAttribute attr in attrs )
                    {
                        if ( optimize1[attr.DisplayName] != pi ) 
                        {
                            optimize4.Add(attr.DisplayName, getObj);
                        }
                    }

//вызываем делегат через индексер
            public class WithDelegate {}
            public object this[WithDelegate q, string pName]
            {
                get 
                {
                    GetObject getter = optimize4[pName] as GetObject;
                    if (getter == null)
                        return null;
                    return getter();
                }
            }


Если способ, который вызывал делегаты через DynamicInvoke, был в 19 раз медленнее прямых delegate-ов,
то вызовы через wrapper-ы уже медленнее всего в 6 раз.
Причем есть гипотеза, что если заменить типы int, string, DateTime на классы, т.е. убрать boxing и последующий unboxing, то разрыв с прямыми делегатами еще сильнее сократится.

Wrapper-ы можно генерировать, как в дизайне, так и в runtime. Можно также попытаться воспользоваться шаблонами.

зы
Жаль, что framework (или компилятор) сам автоматически не создает такие wrapper-ы.
Re: Скорость Reflection .Net
От: timafyozzi  
Дата: 03.11.07 00:30
Оценка: 6 (1)
Здравствуйте, Михаил Полюдов, Вы писали:

МП>Статья:

МП>Скорость Reflection .Net
Автор(ы): Михаил Полюдов
Дата: 11.04.2004
Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection "в лоб" может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.





МП>Авторы:

МП> Михаил Полюдов

МП>Аннотация:

МП>Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection ”в лоб” может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.

Режет глаза то, что не хватает самого производительного (ГИПОТЕЗА) после директа варианта — IL-генерации.
Рассказываю людям, а они делают круглые глаза, мол, это как это так ?!
Re: Скорость Reflection .Net
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.02.04 04:58
Оценка:
Где можно взять исходники к статье?
На CD к журналу их нет.
Re[2]: Скорость Reflection .Net
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.02.04 05:00
Оценка:
DG>На CD к журналу их нет.

Sorry. Уже нашел.
Но вот этот текст:

> Полные исходные тексты тестовой программы и класса PerfCounter находятся на компакт-диске, прилагаемом к журналу, имя архива — ReflectionSpeedSrc.zip


сбивает столку.
Re: Качество исходного кода примеров
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.02.04 05:07
Оценка:
Млин. Кто же так пишет код... Ни добавить еще один метод, ни увидеть результат в нормальном виде...
Re[2]: dummy int-ы в index-ерах
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.02.04 05:46
Оценка:
Вместо dummy int-ов лучше было делать DummyClass-ы, это очень прибавило бы наглядности, а также бы точно поставило бы всех в равные положения.
Также намного легче было бы добавлять новые версии тестируемых методов.

Пример:
            public class WithReflection{}
            public object this[WithReflection dummy, string pName]
            {
                get 
                {
                                  ...
                }
            }
            public class OptimizeReflection{}
            public object this[OptimizeReflection dummy, string pName]
            {
                get 
                {
                                  ...
                }
            }
//вызовы
            TestClass.WithReflection reflection = null;
                        ...
                int ti = (int)t[reflection, "IntValue"];
                string si = (string)t[reflection, "StringValue"];
                        ...
Re[3]: Скорость Reflection .Net
От: Hacker_Delphi Россия  
Дата: 18.02.04 09:04
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>>На CD к журналу их нет.


DG>Sorry. Уже нашел.

DG>Но вот этот текст:

>> Полные исходные тексты тестовой программы и класса PerfCounter находятся на компакт-диске, прилагаемом к журналу, имя архива — ReflectionSpeedSrc.zip

А это — не ко мне... не я же компакт писал
... << RSDN@Home 1.1.3 beta 2 >>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Скорость Reflection .Net
От: TATAPuH США  
Дата: 03.11.07 10:36
Оценка:
Здравствуйте, timafyozzi, Вы писали:

T>Здравствуйте, Михаил Полюдов, Вы писали:


МП>>Статья:

МП>>Скорость Reflection .Net
Автор(ы): Михаил Полюдов
Дата: 11.04.2004
Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection "в лоб" может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.





МП>>Авторы:

МП>> Михаил Полюдов

МП>>Аннотация:

МП>>Использование Reflection позволяет увеличить гибкость приложения. К сожалению, использование Reflection ”в лоб” может значительно снизить производительность. В статье приводятся примеры различных способов оптимизации и производится сравнение их производительности с неоптимизированными вариантами.

T>Режет глаза то, что не хватает самого производительного (ГИПОТЕЗА) после директа варианта — IL-генерации.

T>Рассказываю людям, а они делают круглые глаза, мол, это как это так ?!

действительно очень странно — так как использовать заранее созданные делегаты это уже не рефлекшин и сравнивать этот способ с получением значения по именни как то не коректно
Re[3]: Скорость Reflection .Net
От: orangy Россия
Дата: 03.11.07 11:32
Оценка:
Здравствуйте, TATAPuH, Вы писали:

T>>Режет глаза то, что не хватает самого производительного (ГИПОТЕЗА) после директа варианта — IL-генерации.

T>>Рассказываю людям, а они делают круглые глаза, мол, это как это так ?!

TAT>действительно очень странно — так как использовать заранее созданные делегаты это уже не рефлекшин и сравнивать этот способ с получением значения по именни как то не коректно


Вы бы еще более древнюю статью выбрали бы и изумлялись бы, что ж так бедно-то...
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Develop with pleasure!"
Re[4]: Скорость Reflection .Net
От: TATAPuH США  
Дата: 03.11.07 11:34
Оценка:
Здравствуйте, orangy, Вы писали:

O>Здравствуйте, TATAPuH, Вы писали:


T>>>Режет глаза то, что не хватает самого производительного (ГИПОТЕЗА) после директа варианта — IL-генерации.

T>>>Рассказываю людям, а они делают круглые глаза, мол, это как это так ?!

TAT>>действительно очень странно — так как использовать заранее созданные делегаты это уже не рефлекшин и сравнивать этот способ с получением значения по именни как то не коректно


O>Вы бы еще более древнюю статью выбрали бы и изумлялись бы, что ж так бедно-то...


упс — чот я не посмотрел на дату статьи
смотрю в топе висит — почитал удивился
Re[4]: Скорость Reflection .Net
От: TATAPuH США  
Дата: 03.11.07 11:35
Оценка:
Здравствуйте, orangy, Вы писали:

O>Здравствуйте, TATAPuH, Вы писали:


T>>>Режет глаза то, что не хватает самого производительного (ГИПОТЕЗА) после директа варианта — IL-генерации.

T>>>Рассказываю людям, а они делают круглые глаза, мол, это как это так ?!

TAT>>действительно очень странно — так как использовать заранее созданные делегаты это уже не рефлекшин и сравнивать этот способ с получением значения по именни как то не коректно


O>Вы бы еще более древнюю статью выбрали бы и изумлялись бы, что ж так бедно-то...


значит мальборо должно написать новую — вот
Re: Скорость Reflection .Net
От: criosray  
Дата: 03.11.07 18:52
Оценка:
Вот еще интересный OSS проект http://sourceforge.net/projects/runsharp
Рекомендую к ознакомлению.
Re[4]: Скорость Reflection .Net
От: timafyozzi  
Дата: 04.11.07 11:53
Оценка:
Здравствуйте, orangy, Вы писали:
O>Вы бы еще более древнюю статью выбрали бы и изумлялись бы, что ж так бедно-то...

Может быть она и древняя, но тема, которая в ней затронута, очень даже актуальна и врядли потеряет актуальность с выходом новых фремворков.
Re: Скорость Reflection .Net
От: FLUID Украина http://yuriy-okhmat.blogspot.com/
Дата: 06.11.07 09:08
Оценка:
Вместо:

PerfCounter pc = new PerfCounter();
pc.Start();

в FW2.0 лучше использовать Stopwatch watch = Stopwatch.StartNew();
Мы не владеем тем, чего мы не понимаем....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.