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

Откуда: Москва
Сообщений: 4695
fkthat
ЕвгенийВ,

Зато много раз видал, как из-за статиков утечки памяти возникают. Утечки памяти на платформе со сборкой мусора, Карл. Собственно, статик это фактически, наверное, единственный способ утечку памяти вызвать. Хотя, если, честно, то с синглетоном тоже такую бяку легко сделать.

А ну ка друг мой, приведи работающий пример утечки памяти из за статиков.
8 май 19, 14:39    [21881111]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

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

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

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

      static void StaticMethod()
        { }
       void NonStaticMethod()
        { }

        static void Main(string[] args)
        {
            Program program = new Program();
            StaticMethod();
            program.NonStaticMethod();

// Program program = new Program();
	IL_0001: newobj instance void ConsoleApp2.Program::.ctor()
	IL_0006: stloc.0
	// StaticMethod();
	IL_0007: call void ConsoleApp2.Program::StaticMethod()
	// (no C# code)
	IL_000c: nop
	// program.NonStaticMethod();
	IL_000d: ldloc.0
	IL_000e: callvirt instance void ConsoleApp2.Program::NonStaticMethod()
	// (no C# code)

callvirt - Карл!
8 май 19, 14:47    [21881123]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

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

А потом, если продукт взлетит, упрешься в перфоманс и вернешься к статикам.
А я от них и не бегал) Наоборот, заметил панику в этой теме - "только для расширений!!11".
8 май 19, 14:47    [21881124]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
Плюс
IL_0001: newobj instance void ConsoleApp2.Program::.ctor()
	IL_0006: stloc.0
8 май 19, 14:48    [21881127]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
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();
}

Наиболее часто встречающаяся ситуация сродни этой - это подписаться на какой-нибудь статический ивент, а потом от него не отписаться.
8 май 19, 14:58    [21881144]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
Проще говоря вызов через инстанц.
1. Создание объекта - выделение памяти.
2. Сохранение ссылки на него в памяти.
3. Извлечение ссылки из памяти в стек (this передается первым параметром в метод)
4. Поиск ссылки на метод в таблице виртуальных методов
5. Вызов метода
6. GC собирает объект

Это те пункты, которых не будет при вызове статик метода.

Не нужен в методе this - делай статик!
Нужен простой публичный утилитный метод - суй его в статик класс.
8 май 19, 14:59    [21881148]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4695
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();
}


Ты привел очень сложный пример, попробуй так
ulong[] arr = new ulong[ulong.MaxValue];

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

Откуда:
Сообщений: 1163
ЕвгенийВ
callvirt - Карл!

Что мне твой машинный код - ты приведи реальный пример из жизни, когда бы статик/нестатик реально влиял на производительность. Так и представил себе какое-нибудь десктопное приложение тормозящее из-за того что там вместо статиков нестатики. А сallvirt ничего не означает - он используется для вызова любого инстанс-метода, хоть виртуального, хоть нет. Вызываются они при этои по разному. Иначе все методы были бы виртуальными, как в Java, кажись - кстати, что-то не слышал, чтобы они из-за этого изстрадались.
8 май 19, 15:04    [21881162]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Не нужен в методе this - делай статик!
Нужен простой публичный утилитный метод - суй его в статик класс.


И пиши все на статиках, блеат. Ога. :- D
8 май 19, 15:06    [21881164]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3377
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое
8 май 19, 15:08    [21881170]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Не путай нехватку памяти и утечку памяти.

Там и есть именно утечка памяти. Но, поскольку, судя по твоему прошлому сообщению ты имеешь очень слабое представление о том как на самом деле в .NET работает выделение памяти и GC, то объяснять тебе тут это получится слишком долго. Начни лучше с чтения Рихтера, что ли.
8 май 19, 15:10    [21881175]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.
8 май 19, 15:14    [21881185]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
fkthat
ЕвгенийВ
callvirt - Карл!

Что мне твой машинный код - ты приведи реальный пример из жизни, когда бы статик/нестатик реально влиял на производительность. Так и представил себе какое-нибудь десктопное приложение тормозящее из-за того что там вместо статиков нестатики. А сallvirt ничего не означает - он используется для вызова любого инстанс-метода, хоть виртуального, хоть нет. Вызываются они при этои по разному. Иначе все методы были бы виртуальными, как в Java, кажись - кстати, что-то не слышал, чтобы они из-за этого изстрадались.


HttpClient
8 май 19, 15:42    [21881247]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
fkthat
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.


под нагрузкой IoC добавляет тормозов. лично я на затыки тут не натыкался, но, теоретически, они могут быть
8 май 19, 15:48    [21881259]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72749
fkthat
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики. Слепое и маниакальное следование всем этим принципам превращает хэлло ворлд в многослойное говно, в котором абстракция на абстракции едет и абстракцией погоняет, в результате чего вообще непонятно, как это работает, и куда заныкана реализация. А если еще и DI прикручено - вообще туши свет.

Как раз с таким хелловорлдом я на днях мучался. Тот, кто его писал, по-моему применил все принципы, паттерны и бест-кейсы, которые знал. Казалось бы, тривиальная задача - сохранить дюжину настроек в xml: формочка + save/load, да еще до сервера достучаться, чтобы логин/пароль проверить. И задача эта разбита на 4 (четыре, карл!) проекта. В одном модели и абстракции для UI, в другом модели и абстракции для хранилища, 3 и 4, соответственно UI (из одной формочки) и хранилище. В результате workflow этого говна совершенно невразумительно. Не говоря уж о том, что на все 4 кучки нужны ссылки в основном проекте.
8 май 19, 15:53    [21881265]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 1797
love_bach
fkthat
пропущено...


Нет, не десятое. Статический метод означает что все что от него зависит должно его вызывать напрямую и, значит, зависеть от него напрямую. Есть принципы SOLID, и это их нарушает (тот, что "D"). Эти принципы придумали люди, которые намного умнее и опытнее и меня и тебя вместе взятых - мне этого уже достаточно, чтобы стараться им следовать.


под нагрузкой IoC добавляет тормозов. лично я на затыки тут не натыкался, но, теоретически, они могут быть

да, да, ребята из stackoverflow по этой причине и не используют DI
правда нам до их нагрузок как пешком до Луны, но это же мелочи, правда? :)
8 май 19, 15:55    [21881268]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики.

А инженеры Тойоты придумали что надо заправлять её 98-м бензином, потому что им это во сне приснилось. Но мы-то умнее их и лучше их машину знаем - так что будем экономить и в соседнем колхозе заливать 76-й.

Вот же белять, российский менталитет. Напиши человеку аршинным капсом, что сюда лезть нельзя, потому что током долбанет, но, он все равно решит, что ему виднее, чем тому, кто это писал и обязательно туда полезет.
8 май 19, 16:24    [21881315]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes
Смахивает на юношеский максимализм\нигилизм. Все полезно в меру.
Мне кажется проблема больше не в статических методах, а в статических полях, а какой метод, статический или нет, это дело десятое

Статические поля - сразу же возможная засада с thread-safety.
8 май 19, 16:27    [21881317]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
love_bach
HttpClient


Cерьезно? HttpClient потенциально тормозной не из-за того что в интернет лезет, а из-за того, что он не статический? Ты хоть понял, что ты за бугагос сейчас написал?

Кстати, это еще один класс, который у нас везде завернут в обертку с интерфейсом. Ибо писать и гонять юнит-тесты, которые зависят от каких-то других сетевых сервисов, это было бы вообще писец. Точнее это были бы вообще даже близко не юнит тесты.
8 май 19, 16:31    [21881322]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
love_bach
лично я на затыки тут не натыкался

Первый же запрос к i/o (БД, хттп, файловая система) накроет все дополнительные расходы на виртуальные вызовы, DI и подобное, как бык овцу.
8 май 19, 16:38    [21881327]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72749
fkthat
Antonariy
Эти принципы придумали люди, исходя из собственной конкретной практики, которая может в значительной мере отличаться от любой другой практики.

А инженеры Тойоты придумали что надо заправлять её 98-м бензином, потому что им это во сне приснилось. Но мы-то умнее их и лучше их машину знаем - так что будем экономить и в соседнем колхозе заливать 76-й.
А я тоже могу придумать якобы аналогию, которая на самом деле нифига не аналогия, и выставить себя дураком. Но я-то умнее, поэтому делать этого не буду.

Автомобиль не поставляется в виде конструктора "сделай сам", в отличие от нашей предметной области.

fkthat
Вот же белять, российский менталитет. Напиши человеку аршинным капсом, что сюда лезть нельзя, потому что током долбанет, но, он все равно решит, что ему виднее, чем тому, кто это писал и обязательно туда полезет.
Глупость, написанная капсом, умностью не становится.
8 май 19, 16:44    [21881333]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
fkthat
love_bach
HttpClient


Cерьезно? HttpClient потенциально тормозной не из-за того что в интернет лезет, а из-за того, что он не статический? Ты хоть понял, что ты за бугагос сейчас написал?

Кстати, это еще один класс, который у нас везде завернут в обертку с интерфейсом. Ибо писать и гонять юнит-тесты, которые зависят от каких-то других сетевых сервисов, это было бы вообще писец. Точнее это были бы вообще даже близко не юнит тесты.


Ну вашето это не я только натыкался. Народ юзал Статик, и МС пошёл навстречу страждущим и сделал фабрику - тот же Статик, только с интеллигентным лицом
8 май 19, 16:47    [21881336]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
Глупость, написанная капсом, умностью не становится.


Antonariy
Но я-то умнее


8 май 19, 17:16    [21881356]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
fkthat
love_bach
лично я на затыки тут не натыкался

Первый же запрос к i/o (БД, хттп, файловая система) накроет все дополнительные расходы на виртуальные вызовы, DI и подобное, как бык овцу.


ну, есть же поддержка async в проваедерах БД, хттп...
8 май 19, 18:29    [21881392]     Ответить | Цитировать Сообщить модератору
 Re: Инициализация статического класса  [new]
love_bach
Member

Откуда:
Сообщений: 496
короче, я против статиков, я за IoC, но, есть же случаи, когда у кого-то, когда это не подходит :)
8 май 19, 18:32    [21881396]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 [6] 7 8 9 10 .. 12   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить