Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
1

Абстрактрый класс vs Интерфейс. Немного "тиков" и ассемблера

20.10.2013, 01:31. Показов 1466. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Правильно ли я понимаю, что абстрактный класс более предпочтителен интерфейсу в вопросах производительности?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface Iinter
{
    void SomeMethod();
}
 
public abstract class A : Iinter
{
    public abstract void SomeMethod();
}
 
public class B : A
{
    public override void  SomeMethod()
{
    int i = 10;
    double z = Math.Sqrt((double)i);
}
сам запуск
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var time = new Stopwatch();
            var time1 = new Stopwatch();
            var time0 = new Stopwatch();
 
            A temp110 = new B();
            A temp11 = new B();
            Iinter temp10 = new B();
            //для того, чтобы разогреться
            time0.Start();
            
            temp110.SomeMethod();
            time0.Stop();
 
 
            
 
            time.Start();
            temp10.SomeMethod();
            time.Stop();
 
            time1.Start();
            temp11.SomeMethod();
            time1.Stop();
первый прогон для разогрева)
итого (по итогам 7-10 запусков):
Интерфейс: 20-50 Ticks
Абстрактный класс: 0-10 Ticks
Более того, не поленился и полез в дизасемблер:
Интерфейс:
Assembler
1
2
0000020a  mov         ecx,dword ptr [ebp-44h] 
0000020d  call        dword ptr ds:[0335005Ch]
Абстрактный класс:
Assembler
1
2
3
4
00000229  mov         ecx,dword ptr [ebp-40h] 
0000022c  mov         eax,dword ptr [ecx] 
0000022e  mov         eax,dword ptr [eax+28h] 
00000231  call        dword ptr [eax+10h]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2013, 01:31
Ответы с готовыми решениями:

Ищу таблицу тиков каждой команды ассемблера для современных процессоров Intel
Приветствую всех! Есть ли у кого ссылки на таблицу тиков каждой команды ассемблера для современных...

Интерфейс Ассемблера с языками высокого уровня. Обработка массивов данных
Доброго времени суток, форумчане! Нужна ваша помощь! Требуется написать ассемблерную процедуру,...

Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует интерфейс
Можно ли создать интерфейс, в котором один из методов будет возвращать класс, который реализует...

Геометрическое тело (ISolid) – интерфейс, Шар (Sphere) – класс, реализующий интерфейс ISolid
Есть отношение наследования: геометрическое тело (ISolid) – интерфейс, Шар (Sphere) – класс,...

5
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
20.10.2013, 02:23 2
Скажем так, интерфейс и абстрактный класс — это понятия архитектурные, а не процедурные, потому при выборе что из них использовать вопрос о производительности не должен стоять. Это раз.
Два. Нативный код, генерируемый рантаймом для вызова виртуального метода через ссылку на интерфейс или на родительский класс — это деталь реализации, которая не оговаривается спецификацией языка, а значит не является величиной постоянной. Одна версия рантайма под одной системой на одном процессоре сгегерирует один код, другая версия на другой системе с другим процессором сгенерирует совсем другой.
Вы, как разработчик на языке C#, повлиять на количество АСМ-инструкций не в силах по объективным причинам, потому не запаривайтесь по этому поводу.

Интересно как работает — это круто. Главное, чтобы этот интерес не являлся решающим фактором при выборе интерфейс вс. абстрактный класс.

Как-то так.
1
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
20.10.2013, 02:40  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
при выборе что из них использовать вопрос о производительности не должен стоять
пока для себя решил так:
1.) если набор методов для разных по смыслу классов, то 100% интерфейс (тем более, что это не запрещает наследовать от другого класса)
2.) если нужны какие-то стандартные методы или стандартная реализация, то абстрактный класс
а в остальных случаях...понятно, что для шарпа очень "непривычно" видеть чисто виртуальный абстрактный класс. Ведь, по сути, это и есть интерфейс...но почему бы, когда вопрос производительности стоит не на последнем месте, а набор свойств/методов разрабатывается только для обеспечения полиморфизма не сделать упор именно на производительноть? И ещё: каких правил "интерфейс или абстрактный класс" придерживаетесь лично Вы?
P.s. во всём остальном солидарен и всё это изучаю исключительно из любопытства
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
20.10.2013, 02:56 4
Правил придерживаюсь простецких: что сказал начальник, то и реализую
Шутка. Отчасти.

Принцип выбора интерфейса или абстрактного класса достаточно прост: абстрактный класс описывает сущность, часть которой не может иметь реализации по умолчанию, а интерфейс описывает поведение.

Лирическое отступление: суть объектно-ориентированного программирования — моделирование привычной нам реальности в компьютерной системе. Объект — это некая сущность, состоящая из свойств, ее описывающих, и действий, с ней производимых. Если об этом не забывать, то выбирать будет просто: там, где нужно тупо определить поведение без привязки к конкретной сущности (типа "летать") — это интерфейс, т.к. летать могут птицы, самолеты, ракеты, стрелы и камни — абсолютно разные сущности.
Ну а там, где есть сущность, но часть ее нужно "допилить" — это уже абстрактный класс, например "летательный аппарат".
Что, конечно, не мешает абстрактному классу реализовать интерфейс
1
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
20.10.2013, 03:00  [ТС] 5
Цитата Сообщение от kolorotur Посмотреть сообщение
Что, конечно, не мешает абстрактному классу реализовать интерфейс
Именно! Всё чаще это встречаю. А при работе с List<T> предпочитаю List<AbstractClass>, чем List<Interface>
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
20.10.2013, 12:10 6
Цитата Сообщение от IcyWind Посмотреть сообщение
Всё чаще это встречаю.
Тут, конечно, важно понимать, что наличие или отсутсвие интерфейса зависит исключительно от архитектуры приложения. Никто не запрещает создавать отдельный интерфейс на каждый чих, но если в программе нет сценария использования этих интерфейсов, то зачем они нужны?
Бритва Оккама в действии.

Цитата Сообщение от IcyWind Посмотреть сообщение
А при работе с List<T> предпочитаю List<AbstractClass>, чем List<Interface>
Опять же, зависит от архитектуры
Но по умолчанию, конечно же, используется класс.
То есть для использования интерфейса должен иметься повод.
0
20.10.2013, 12:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2013, 12:10
Помогаю со студенческими работами здесь

Создать класс ACipher, реализующий интерфейс ICipher. Класс шифрует строку посредством сдвига каждого символа
Создать класс ACipher, реализующий интерфейс ICipher. Класс шифрует строку посредством сдвига...

Создать класс BCipher, реализующий интерфейс ICipher. Класс шифрует строку, выполняя замену каждой буквы
Создать класс BCipher, реализующий интерфейс ICipher. Класс шифрует строку, выполняя замену каждой...

Нужно немного доработать класс Особь
Задание заключается в том, чтобы создать класс Особь, в котором реализовать функцию определения...

Разработать абстрактный класс Геометрическая Фигура, Реализовать интерфейс ПростойНУгольник, класс Составная Фигура
/* 1 . Разработать абстрактный класс Геометрическая Фигура с полями ПлощадьФигуры и...

Как именовать интерфейс, от которого наследуется класс, если класс начинается c "I"
Здравствуйте, как обозвать интерфейс, от которого наследуется класс, если класс начинается c &quot;I&quot;. ...

Абстрактный класс/Класс интерфейс
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету...

Построить класс для работы с односвязным списком. Немного переделать
Здравствуйте, понимаю что подобных тем много, и есть даже решение(с Template которыми даже еще не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru