Есть ли разница в быстродействии???
От: Alexander_fx  
Дата: 08.10.06 09:19
Оценка:
Есть ли разница в быстродействии если я унаследуюсь от интерфейса или базового типа
Например можно обьявить интерфейс с функцией
а можно сделать базовый класс с такой же функцией.
Вопрос — будет ли разница в быстродействии при обращении к этим методам.
Просто предпологается что обращений будут миллионы — и хочется заранее выбрать правильную стратегию.
Есть ли разница в быстродействии???
От: Аноним  
Дата: 08.10.06 09:29
Оценка: +4
Не задумывайтесь об этом, делайте так, как удобнее — если базовый класс должен определять какие-то методы и свойства с реализацией по уолчанию, то, разумеется, используте класс, если же нет, то интерфейс.
--
Гайдар Магдануров
[email]mailto:gaidar.magdanurov@gmail.com[/email] | Блог | Сайт
Difficult I do now, impossible will take a while...


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Есть ли разница в быстродействии???
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.10.06 12:30
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>Есть ли разница в быстродействии если я унаследуюсь от интерфейса или базового типа

A_>Например можно обьявить интерфейс с функцией
A_>а можно сделать базовый класс с такой же функцией.
A_>Вопрос — будет ли разница в быстродействии при обращении к этим методам.
A_>Просто предпологается что обращений будут миллионы — и хочется заранее выбрать правильную стратегию.

Виртуальная функция быстрее (раза в 3), но заметить это можно только если ее вызывать в огромных циклах и при этом тело метода будет содержаь нечто вроде операций сложения или умножения. Так что в 99% случаев разница будет даже в микроскоп не видна.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Есть ли разница в быстродействии???
От: Alexander_fx  
Дата: 10.10.06 13:37
Оценка:
Здравствуйте, VladD2, Вы писали:

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


A_>>Есть ли разница в быстродействии если я унаследуюсь от интерфейса или базового типа

A_>>Например можно обьявить интерфейс с функцией
A_>>а можно сделать базовый класс с такой же функцией.
A_>>Вопрос — будет ли разница в быстродействии при обращении к этим методам.
A_>>Просто предпологается что обращений будут миллионы — и хочется заранее выбрать правильную стратегию.

VD>Виртуальная функция быстрее (раза в 3), но заметить это можно только если ее вызывать в огромных циклах и при этом тело метода будет содержаь нечто вроде операций сложения или умножения. Так что в 99% случаев разница будет даже в микроскоп не видна.


Так же пишу — вызываться будут миллионы — если не миллиарды раз.
У меня програ считает по несколько дней.

Только я пока не образованный.
Виртуальная функция это интерфейс или наследование от базового класса????
Re[3]: Есть ли разница в быстродействии???
От: Lloyd Россия  
Дата: 10.10.06 13:41
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>Только я пока не образованный.

A_>Виртуальная функция это интерфейс или наследование от базового класса????

Виртуальная — это способ вызова.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Есть ли разница в быстродействии???
От: Alexander_fx  
Дата: 10.10.06 13:58
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


A_>>Только я пока не образованный.

A_>>Виртуальная функция это интерфейс или наследование от базового класса????

L>Виртуальная — это способ вызова.


Ребята — простите — но есть ли в VBNET эта виртуальность — и как она реализуется.
А то что то хелп с первого раза ничего не дал.
Re[5]: Есть ли разница в быстродействии???
От: Lloyd Россия  
Дата: 10.10.06 14:03
Оценка: +1
Здравствуйте, Alexander_fx, Вы писали:

A_>Ребята — простите — но есть ли в VBNET эта виртуальность — и как она реализуется.

A_>А то что то хелп с первого раза ничего не дал.

Public Overridable Function ToString() As String

Public Overrides Function ToString() As String
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Есть ли разница в быстродействии???
От: Alexander_fx  
Дата: 10.10.06 14:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


A_>>Ребята — простите — но есть ли в VBNET эта виртуальность — и как она реализуется.

A_>>А то что то хелп с первого раза ничего не дал.

L>
L>Public Overridable Function ToString() As String

L>Public Overrides Function ToString() As String
L>


Ok — с этими фичами знаком — только не знал что это так называется.
Спасибо.
Re: Есть ли разница в быстродействии???
От: Аноним  
Дата: 10.10.06 14:35
Оценка:
Здравствуйте, gaidar, Вы писали:

G>Не задумывайтесь об этом, делайте так, как удобнее


С этой философией собственно .NET и разрабатывался
Re[3]: Есть ли разница в быстродействии???
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.10.06 17:24
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>Так же пишу — вызываться будут миллионы — если не миллиарды раз.

A_>У меня програ считает по несколько дней.

Тогда однозначно виртуальная функция. А еще лучше обойтись обычной фукнцией. Ее заинлайнят и будет еще раза в 3-4 быстрее.
Только еще раз подчеркну, что разницу ты увидишь, если функция примитивна (1-3 простых команды). Если там цикл, то можно начхать на то что это за реализация.

A_>Только я пока не образованный.

A_>Виртуальная функция это интерфейс или наследование от базового класса????

Наследование от базовго класса. Реализация функции интерфейса она и есть реализация.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Есть ли разница в быстродействии???
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.10.06 17:24
Оценка: +3
Здравствуйте, <Аноним>, Вы писали:

G>>Не задумывайтесь об этом, делайте так, как удобнее


А>С этой философией собственно .NET и разрабатывался


С этой философией жувут те ктого не принято называть маняками битодробителями. И это верно, так как случаев оптимизации по делу в тысячи раз меньше чем случаев когда оптимизации не по делу усложняли решения и даже губили проекты.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Есть ли разница в быстродействии???
От: Dufrenite Дания  
Дата: 10.10.06 17:56
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>Есть ли разница в быстродействии если я унаследуюсь от интерфейса или базового типа

A_>Например можно обьявить интерфейс с функцией
A_>а можно сделать базовый класс с такой же функцией.
A_>Вопрос — будет ли разница в быстродействии при обращении к этим методам.
A_>Просто предпологается что обращений будут миллионы — и хочется заранее выбрать правильную стратегию.

Можно провести такой эксперимент:

namespace Calls
{
    class Base
    {
        public virtual void Foo()
        {
        }
    }

    class Derived : Base
    {
        public override void Foo()
        {
        }
    }

    interface IBase
    {
        void Bar();
    }

    class Realizer : IBase
    {
        public void Bar()
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Base b = new Derived();
            IBase ib = new Realizer();
            b.Foo();
            ib.Bar();
        }
    }
}

Just-in-time компилятор генерирует такой код:

            b.Foo();
00000053  mov         ecx,edi 
00000055  mov         eax,dword ptr [ecx] 
00000057  call        dword ptr [eax+38h] 
0000005a  nop              
            ib.Bar();
0000005b  mov         ecx,ebx 
0000005d  call        dword ptr ds:[00920018h] 
00000063  nop

Здесь видно, что вызов по интерфейсу компилятор оптимизирует в статический.
Вот такая вот петрушка...
Re: Есть ли разница в быстродействии???
От: Dufrenite Дания  
Дата: 10.10.06 20:11
Оценка:
Вдогонку:
Я проводил эксперименты по измерению времени виртуального вызова.
На Pentium4 Prescott он выполняется за 15 машинных тактов. Для сравнения команда деления выполняется за 40 тактов, вычисление синуса за 270 тактов. То есть за время одного деления можно выполнить почти 2.5 виртуальных вызова.
Если например в твоей программе выполняется 1,000,000 виртуальных вызовов в секунду, то это примерно 15,000,000 машинных тактов. При тактовой частоте 3 ГГц это будет 15 / 3000 * 100% = 0.5%. То есть при 1,000,000 вызовов в секунду мы тратим всего пол процента машинного времени.
Много это или мало — решать тебе.
Re: Есть ли разница в быстродействии???
От: TK Лес кывт.рф
Дата: 10.10.06 20:43
Оценка: 3 (2) +1
Здравствуйте, Alexander_fx, Вы писали:

A_>Есть ли разница в быстродействии если я унаследуюсь от интерфейса или базового типа

A_>Например можно обьявить интерфейс с функцией
A_>а можно сделать базовый класс с такой же функцией.
A_>Вопрос — будет ли разница в быстродействии при обращении к этим методам.
A_>Просто предпологается что обращений будут миллионы — и хочется заранее выбрать правильную стратегию.

В MSDN есть табличка со списком того, сколько стоит тот или иной вызов. Статья называется Writing Faster Managed Code: Know What Things Cost

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

Соотношение может быть примерно следующим
вирт. метод: 1.0
интерфейсный метод: 1.1
generic вирт. метод: 7.0

Но, как уже говорили, надо смотреть на сам метод. Скорее всего, самым медленным будет именно его тело, а накладные расходы на вызов метода пару миллионов раз будут не видны даже в микроскоп...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Есть ли разница в быстродействии???
От: Аноним  
Дата: 11.10.06 02:36
Оценка:
Производительность вызова кода в порядке убывания.

1. Метод в том же классе.
2. Метод в базовом классе.
3. Абстрактный метод.
4. Метод интерфейса.

Интерфейсы и генерики самое тормознутое из ООП, по возможности нужно не использовать их.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Есть ли разница в быстродействии???
От: Аноним  
Дата: 11.10.06 04:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>С этой философией жувут те ктого не принято называть маняками битодробителями. И это верно, так как случаев оптимизации по делу в тысячи раз меньше чем случаев когда оптимизации не по делу усложняли решения и даже губили проекты.


Да, преждевременная оптимизация — зло.
Re: Есть ли разница в быстродействии???
От: Аноним  
Дата: 12.10.06 00:33
Оценка:
Dufrenite

Если например в твоей программе выполняется 1,000,000 виртуальных вызовов в секунду, то это примерно 15,000,000 машинных тактов. При тактовой частоте 3 ГГц это будет 15 / 3000 * 100% = 0.5%. То есть при 1,000,000 вызовов в секунду мы тратим всего пол процента машинного времени.
Много это или мало — решать тебе.


Ты не учел только одного, что команды на конвеер подаются со скоростью системной шины, много это или мало решать тебе
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Есть ли разница в быстродействии???
От: eugen1001  
Дата: 17.10.06 09:05
Оценка:
Здравствуйте, TK, Вы писали:


TK>Соотношение может быть примерно следующим

TK>вирт. метод: 1.0
TK>интерфейсный метод: 1.1
TK>generic вирт. метод: 7.0

А можно ссылку на источник с данными про вызовы в generic?

В приведенной статье нет информации про Generic, а мне кажется, что коэффициенты 1.0 и 7.0 не соответствуют действительности. Не знаю как это реализовали в Microsoft, но вызов в Generic по логике не должен отличаться от интерфейсного метода, так как в C# generic точно знает VTable от объектов, к которым обращается. К тому, что Generic не знает, он и обратиться не даст (в отличие от С++ )
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Есть ли разница в быстродействии???
От: TK Лес кывт.рф
Дата: 17.10.06 09:34
Оценка:
Hello, "eugen1001"
>
> TK>Соотношение может быть примерно следующим
> TK>вирт. метод: 1.0
> TK>интерфейсный метод: 1.1
> TK>generic вирт. метод: 7.0
>
> А можно ссылку на источник с данными про вызовы в generic?
>
> В приведенной статье нет информации про Generic, а мне кажется, что
> коэффициенты 1.0 и 7.0 не соответствуют действительности.

Можно написать простейший тест и, посмотреть самому...
Posted via RSDN NNTP Server 2.0
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Есть ли разница в быстродействии???
От: Аноним  
Дата: 12.10.06 05:39
Оценка:
>>Интерфейсы и генерики самое тормознутое из ООП, по возможности нужно не использовать их.

А что насчет боксинга?

Две капли морфия облегчат тебе жизнь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.