IInterface. Какая реализация метода отработает быстрее: в которой создаётся новый значимый тип или же ссылочный? Вроде как при значимом будет производиться боксинг, что довольно дорогое удовольствие, но в то же время для ссылочного компилятор генерирует callvirt вместо call, который тоже добавляет тормозов. В общем для проверки написал маленький тест.Собственно, объявление типов:
Ну и сам вызов:* This source code was highlighted with Source Code Highlighter.
- interface IInterface
- {
- string field { get; }
- }
- struct Struct : IInterface
- {
- public string field { get; set; }
- }
- class Class : IInterface
- {
- public string field { get; set; }
- }
- static IInterface method1()
- {
- return new Struct() { field = "0" };
- }
- static IInterface method2()
- {
- return new Class() { field = "0" };
- }
- Stopwatch sw = new Stopwatch();
- sw.Start();
- for (int i = 0; i < 100000; i++)
- {
- IInterface I = method1();
- }
- sw.Stop();
- Console.WriteLine("Test1: On struct elapsed: " + sw.Elapsed.ToString());
- sw.Reset();
- sw.Start();
- for (int i = 0; i < 100000; i++)
- {
- IInterface I = method2();
- }
- sw.Stop();
- Console.WriteLine("Test1: On class elapsed: " + sw.Elapsed.ToString());
- Console.ReadLine();
* This source code was highlighted with Source Code Highlighter.В результате получилось:Test1: On struct elapsed: 00:00:00.0110243
Test1: On class elapsed: 00:00:00.0075070
В общем получилось, что боксинг медленнее виртуального вызова, но учитывая, что на 100 000 экземпляров разница составила 4 миллисекунды (это максимальная увиденная мной разница), с этим вполне себе можно жить.
Если же всётаки методы 1 и 2 будут возвращать не интерфейс, а структуру и класс соотвественно, то метод со структурой выполнится быстрее своего собрата.
Test1_1: On struct elapsed: 00:00:00.0042494
Test1_1: On class elapsed: 00:00:00.0067243
Оценивая полученные результаты, можно сказать,что работать со значимыми типами гораздо быстрее, а, порой и удобнее, но до тех пор, пока не требуется упаковывать эти значения. При боксинге значимые типы теряют своё преимущество в быстродействии.


Комментариев нет:
Отправить комментарий