Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 [8] 9 10 11 12   вперед  Ctrl      все
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6319
fkthat
И даже так

    internal interface IProgram
    {
        void Interface();
    }

    internal class Program : IProgram
    {
        public void Interface()
        {
        }


Static:     00:00:00.3932091
Not static: 00:00:00.2832406
Virtual:    00:00:00.2452205
Interface:  00:00:00.2511343


Статик самый медленный. Причем, что интересно, что вызовы виртуального метода и метода интерфейса быстрее чем обычного.

Бред какой то. Протестируй нормально.

В любом случае, при такой разнице в пределах погрешности, скорость не аргумент. {C# и скорость ахах....}
10 май 19, 01:31    [21881973]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
Siemargl
Бред какой то. Протестируй нормально.


Код я привел. Можешь сам его собрать, запустить и посмотреть

Siemargl
В любом случае, при такой разнице в пределах погрешности, скорость не аргумент.


Я тоже самое писал. Только некоторые стали тут доказывать что разница в несколько тактов на вызове метода это писец как важно.

Siemargl
C# и скорость ахах.


Есть ряд случаев, когда нетовский рантайм может уделать по производительности unmanaged языки.
10 май 19, 04:07    [21881980]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member

Откуда:
Сообщений: 376
Siemargl,
Да. Скорость не аргумент в данной теме.
Только как дымовая завеса при обсуждении.
10 май 19, 08:38    [21882013]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
WebPrj
Siemargl,
Да. Скорость не аргумент в данной теме.
Только как дымовая завеса при обсуждении.


Мне, однако, все-таки, пипец любопытно стало - как так выходит, что статический метод по вызову самый медленный. Релизная сборка, чистый запуск из командной строки - и он стабильно отстаёт по скорости от любого другого вызова в полтора раза.
10 май 19, 09:15    [21882024]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4464
fkthat, вы жо умный посмотрите во что скомпилилось... происки оптимизатора?
10 май 19, 10:39    [21882045]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4464
fkthat, вот тут простым языком немного общих рассуждений на эту тему... х.з. ни когда не приходилось биться за микросекунды... в основном исходят из здравого смысла, семантики самой задачи, а не тупо следуют скрижалям... так что спор инстанс вс статик - это спор между "тупоконечниками и остроконечниками"
10 май 19, 11:02    [21882049]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
buser
fkthat, вы жо умный посмотрите во что скомпилилось... происки оптимизатора?

Оптимизация дефолтная. Для чистоты эксперимента поставил еще аттрибуты
[MethodImpl(MethodImplOptions.NoInlining)]

и даже попробовал сделать наоборот
[MethodImpl(MethodImplOptions.AggressiveInlining)]

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

Собирал под .net core 3 и под обычный .net 4.6 и никакой разницы - везде статик тормозит.
10 май 19, 11:25    [21882061]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member

Откуда:
Сообщений: 376
fkthat,
Не знаю. Никогда не интересовало.
Как тут сказали, мне платят за другие вопросы)
10 май 19, 11:26    [21882062]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
buser
fkthat, вот тут простым языком немного общих рассуждений на эту тему


автор
In theory, a static method should perform slightly better than an instance method


Ну вот в том-то и дело, что "in theory", а вот я смотрю и вижу сейчас, что все совсем наоборот. Разница, конечно, совершенно ерундовая, как я уже говорил я бы даже внимания обращать на неё не стал бы никогда, но мне вот интересно, почему все-таки так получается.
10 май 19, 11:38    [21882070]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2528
ЕвгенийВ
Antonariy
В общем, я понял:

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?
10 май 19, 11:58    [21882081]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9622
Дмитрий Мух
ЕвгенийВ
пропущено...

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?

мазохист
10 май 19, 16:46    [21882163]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2528
ViPRos
Дмитрий Мух
пропущено...

ваш взлетел? что за продукт? любопытно, какую архитектура и принципы разработки используете?

мазохист


Мазохизм - склонность получать удовольствие, испытывая унижения, насилие или мучения.

Что же из вышеперечисленного нас ожидает? Картинка с другого сайта.
10 май 19, 16:53    [21882167]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9622
Дмитрий Мух,

счас будет тебе делать мозги, а ты получишь от этого кайф
10 май 19, 16:59    [21882169]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2528
ViPRos
Дмитрий Мух,

счас будет тебе делать мозги, а ты получишь от этого кайф

Что мне будут делать? Выражайся, если можно, понятным языком.
10 май 19, 17:05    [21882171]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9622
Дмитрий Мух,

е***ь мозг всякими лаунчерами
10 май 19, 17:28    [21882180]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 2528
ViPRos
Дмитрий Мух,

е***ь мозг всякими лаунчерами

ЕвгенийВ - это же не ВМоисеев. Я надеюсь :)
10 май 19, 17:41    [21882181]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ViPRos
Member

Откуда:
Сообщений: 9622
Дмитрий Мух
ViPRos
Дмитрий Мух,

е***ь мозг всякими лаунчерами

ЕвгенийВ - это же не ВМоисеев. Я надеюсь :)

ааааааааааа
перепутал, блин :)
10 май 19, 17:51    [21882189]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6319
fkthat
ЕвгенийВ
пропущено...

А ну ка друг мой, приведи работающий пример утечки памяти из за статиков.


class Foo {
    private static List<Foo> _theListOfAllFoo = new LIst<Foo>();

    private byte[] _someVeryLargeArray = new byte[100500];  

    public Foo() {
        _theListOfAllFoos.Add(this);
    }
}

for(var i = 0; i < 100500; i++) {
    new Foo();
}

Наиболее часто встречающаяся ситуация сродни этой - это подписаться на какой-нибудь статический ивент, а потом от него не отписаться.

Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.
11 май 19, 02:58    [21882336]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6319
fkthat
Siemargl
Бред какой то. Протестируй нормально.

Код я привел. Можешь сам его собрать, запустить и посмотреть

Проверил, добавил тестирование вызова стат.класса, попробовал убрать накладные от лямбды, исключить выбрасывание кода оптимизатором.
У меня в виртуалке (VS2017, release, NET4.6)
Not static: 00:00:00.3894198
Virtual: 00:00:00.5584478
Interface Call: 00:00:00.3800740
Static: 00:00:00.3692603

В ideone https://ideone.com/qTPeHC
Not static: 00:00:00.1811481
Virtual: 00:00:00.2084212
Interface Call: 00:00:00.1812678
Static: 00:00:00.1848647

Собственно, только виртуальный вызов заметно медленнее, остальное в пределах погрешностей
11 май 19, 03:53    [21882339]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
Siemargl
Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.


Объекты Foo никогда освобождены не будут, потому что указатели на них сохранены в статической (т.е. глобальной переменной). Пока их оттуда руками не уберешь, то они так и будут там висеть, пока приложение не завершится. Если такая шляпа происходит, например в веб-приложении, то в итоге будет жопа - я на практике такое наблюдал и даже не раз. А так-то можно сказать, что, типа, да, утечек вообще никогда не бывает, потому что из приложения, типа, все равно когда-нибудь выйдем и память при этом освободится, по-твоему так, что ли?

Есть еще более смешная известная шляпа, называется "воскрешение объекта" ("object resurrection"). Правда, это уже из разряда извращений.

public class Foo {
    private static Foo _foo;

    ~Foo() {
        _foo = thiis;
    }
}


Объект, уже идя под сборку мусора, сам себя вытягивает за волосы. :))
11 май 19, 03:55    [21882340]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
WebPrj
Member

Откуда:
Сообщений: 376
fkthat
Siemargl
Этот не утечка памяти. Здесь все указатели на выделенную память сохранены и могут быть освобождены в любой момент.
Утечка - это выделенная память, на которую нет указателей и программа потеряла над ней контроль.


Объекты Foo никогда освобождены не будут, потому что указатели на них сохранены в статической (т.е. глобальной переменной). Пока их оттуда руками не уберешь, то они так и будут там висеть, пока приложение не завершится. Если такая шляпа происходит, например в веб-приложении, то в итоге будет жопа - я на практике такое наблюдал и даже не раз. А так-то можно сказать, что, типа, да, утечек вообще никогда не бывает, потому что из приложения, типа, все равно когда-нибудь выйдем и память при этом освободится, по-твоему так, что ли?

Именно это и нужно программисту при статик.
Освобождение памяти при завершении процесса.
11 май 19, 07:52    [21882349]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6319
Siemargl,

Результаты тестирования отменяются, оптимизатор выкинул _ВСЁ_

+
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Размер кода:       141 (0x8d)
  .maxstack  3
  .locals init ([0] class Program prog,
           [1] int64 result)
  IL_0000:  newobj     instance void Program::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldc.i4     0x5fd8220
  IL_000b:  conv.i8
  IL_000c:  stloc.1
  IL_000d:  ldloca.s   result
  IL_000f:  call       void SClass::StatClassCall(int64&)
  IL_0014:  ldstr      "Not static: {0}"
  IL_0019:  ldloc.0
  IL_001a:  ldloca.s   result
  IL_001c:  callvirt   instance valuetype [mscorlib]System.TimeSpan Program::NonStaticCall(int64&)
  IL_0021:  box        [mscorlib]System.TimeSpan
  IL_0026:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
  IL_002b:  ldstr      "Virtual: {0}"
  IL_0030:  ldloc.0
  IL_0031:  ldloca.s   result
  IL_0033:  callvirt   instance valuetype [mscorlib]System.TimeSpan Program::VirtCall(int64&)
  IL_0038:  box        [mscorlib]System.TimeSpan
  IL_003d:  call       void [mscorlib]System.Console::WriteLine(string,
                                                                object)
11 май 19, 09:14    [21882370]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6319
Хотя нет, показалось с непросыпу
Дебажная сборка тоже самое распределение
Not static: 00:00:02.1452922
Virtual: 00:00:02.2355484
Interface Call: 00:00:01.3028084
Static: 00:00:01.5658457
NNNs - 502500001, 0
11 май 19, 09:23    [21882373]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2008
>ViPRos, вчера, 17:28 [21882180]
>е***ь мозг всякими лаунчерами
<Интересно, чем же тебя так достал пускач. У меня инфосистема реализуется многими приложениями, а к ним надо иметь доступ, их надо запускать, надо смотреть за их изменениями. Этим и занимается лаунчар. Что здесь плохого - то?
11 май 19, 09:37    [21882376]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1607
WebPrj
Именно это и нужно программисту при статик.
Освобождение памяти при завершении процесса.

А серверных приложений у нас не бывает вообще? Или ты уроки, где про них рассказывали, прогулял? :))
11 май 19, 11:16    [21882391]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 3 4 5 6 7 [8] 9 10 11 12   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить