powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
25 сообщений из 72, страница 2 из 3
Почему LINQ такой тормозной?
    #38656265
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
потому что передаются по значению
при каждом ob.enumeraror будет новая структура вываливать из объекта
по этому цикл не кончится, текущим будет дефолтное значение.
public IEnumerator<int> enumerator; - тут Вы ее упаковали. все в порядке.
Могли бы и поставить List<int>.Enumerator тоже бы скорее всего произошла бы упаковка
так как типы разные.
Структуры странные типы и надо с ними очень осторожно..
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656269
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
потому что передаются по значению
при каждом ob.enumeraror будет новая структура вываливать из объекта
по этому цикл не кончится, текущим будет дефолтное значение.
public IEnumerator<int> enumerator; - тут Вы ее упаковали. все в порядке.
Могли бы и поставить List<int>.Enumerator тоже бы скорее всего произошла бы упаковка
так как типы разные.
Структуры странные типы и надо с ними очень осторожно..
что-то я не очень понял где упаковка?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
IL_0019: callvirt instance valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> class [mscorlib]System.Collections.Generic.List`1<int32>::GetEnumerator()
		IL_001e: newobj instance void class '<>f__AnonymousType0`1'<valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>>::.ctor(!0)
		IL_0023: stloc.0
		IL_0024: br.s IL_003c
		// loop start (head: IL_003c)
			IL_0026: nop
			IL_0027: ldloc.0
			IL_0028: callvirt instance !0 class '<>f__AnonymousType0`1'<valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>>::get_enumerator()
			IL_002d: stloc.3
			IL_002e: ldloca.s CS$0$0000
			IL_0030: call instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>::get_Current()
			IL_0035: call void [mscorlib]System.Console::Write(int32)
			IL_003a: nop
			IL_003b: nop

			IL_003c: ldloc.0
			IL_003d: callvirt instance !0 class '<>f__AnonymousType0`1'<valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>>::get_enumerator()
			IL_0042: stloc.3
			IL_0043: ldloca.s CS$0$0000
			IL_0045: call instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<int32>::MoveNext()
			IL_004a: stloc.s CS$4$0001
			IL_004c: ldloc.s CS$4$0001
			IL_004e: brtrue.s IL_0026
		// end loop
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656277
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,
Код: c#
1.
2.
3.
4.
  class My
        {
            public IEnumerator<int> enumerator;//Упаковка?
        }


приведение значимых к интерфейсу не?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656286
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиnetivan,
Код: c#
1.
2.
3.
4.
  class My
        {
            public IEnumerator<int> enumerator;//Упаковка?
        }


приведение значимых к интерфейсу не?
да. все равно не понял причем тут упаковка.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656291
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivan,
может так попонятней будет
Код: c#
1.
2.
3.
4.
5.
 var ob = new {enumerator =(IEnumerator<int>)new List<int> {1, 2}.GetEnumerator()};
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656293
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиnetivan,
может так попонятней будет
Код: c#
1.
2.
3.
4.
5.
 var ob = new {enumerator =(IEnumerator<int>)new List<int> {1, 2}.GetEnumerator()};
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }


завтра покумекаю :)
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656350
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Хотя, анонимные типы тут не причём. Вот так, например, всё работает

Код: c#
1.
2.
3.
4.
5.
6.
            var ob = new { enumerator = new List<int> { 1, 2 } };
            var o = ob.enumerator.GetEnumerator();
            while (o.MoveNext())
            {
                Console.Write(o.Current);
            }

o - у тя не является уже анонимным типом - что ты здесь хотел проверить?

Дело как раз в неизменяемости анонимного типа, а не в упаковке-распаковке.
Когда в анонимном типе структура - ее не изменить. Когда объект(или ссылка на интерфейс) ссылку тоже не изменить, но объект на которую указывает ссылка - пожалуйста.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656386
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreguser7320Хотя, анонимные типы тут не причём. Вот так, например, всё работает

Код: c#
1.
2.
3.
4.
5.
6.
            var ob = new { enumerator = new List<int> { 1, 2 } };
            var o = ob.enumerator.GetEnumerator();
            while (o.MoveNext())
            {
                Console.Write(o.Current);
            }

o - у тя не является уже анонимным типом - что ты здесь хотел проверить?

Дело как раз в неизменяемости анонимного типа, а не в упаковке-распаковке.
Когда в анонимном типе структура - ее не изменить. Когда объект(или ссылка на интерфейс) ссылку тоже не изменить, но объект на которую указывает ссылка - пожалуйста.
Дело всё же в структуре, по-моему.

Я привёл пример с кастомным классом My и с переменной var o.

Если Му и без переменной, то не работает.
Если анонимный класс и без переменной, то не работает.
Если Му и с переменной, то работает.
Если анонимный тип и с переменной, то работает.

Значит, анонимный тип тут не причём.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656409
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Если Му и без переменной, то не работает.
Если анонимный класс и без переменной, то не работает .
Если Му и с переменной, то работает.
Если анонимный тип и с переменной, то работает.поправил
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656415
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreguser7320Если Му и без переменной, то не работает.
Если анонимный класс и без переменной, то не работает .
Если Му и с переменной, то работает.
Если анонимный тип и с переменной, то работает.поправил
Да, точно.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656431
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, положим, анонимные типы действительно незименяемые в том смысле, что содержат рид-онли свойства.
http://stackoverflow.com/questions/14336669/why-anonymous-type-are-immutable-in-c

Но почему всё же нуль постоянно?

Код: c#
1.
2.
3.
4.
5.
var ob = new { enumerator = new List<int> { 1, 2 }.GetEnumerator() };
while (ob.enumerator.MoveNext()) 
{
    Console.Write(ob.enumerator.Current);
}



Вот возьмём строчку

new { enumerator = new List<int> { 1, 2 }.GetEnumerator() }

В ob.enumerator хранится копия энумератора из списка. Я так понимаю, ключ в том, что эта копия не имеет связи со списком ? Т. е. это объект структуры, вытащенный из объекта списка, и имеющий поэтому только MoveNext, Reset и Current, который по дефолту всегда 0?

Теперь возьмём строчку

ob.enumerator.MoveNext()

ob.enumerator вернёт снова копию структуры, а значит, что Current снова будет 0.

Но почему возвращается всегда true, а не false? Ведь со списком-то связи нет. Это что, особенность внтуренней реализации Enumerator.MoveNext() , что она всегда true возвращает в такой ситуации?



А в общей картине получается, что у нас и в условии цикла и в теле постоянно создаются новые копии структуры. Т. е. на каждую итерацию по 2 копии структуры. Правильно я понимаю?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656449
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

enumerator работает примерно так:

Current=default(T) - 0
State=0 - готовность!!! (приватная переменная, мы не видим)
MoveNext() - на выходе true - так как есть первый элемент
Current=1 (первый элемент)
State=1 - первый элемент показываем
MoveNext() - на выходе true - так как есть второй элемент
Current=2 (второй элемент)
State=2 - второй элемент показываем
MoveNext() - на выходе false - так как нет третьего элемента
Current=хз (не определено)
State=хз - не определено

Так вот State мы в анонимном типе не можем изменить - впрочем, как и Current - они так нулями и остаются
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656450
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
гыгыгыггыг у меня нет слов
еще раз и последний ( я сто раз пожалел что не свалил отсюда, потерял весь день с вами..)
while (ob.enumerator.MoveNext()) // получает новую структуру со списком, делает шаг
{
Console.Write(ob.enumerator.Current);// получает новую структуру со списком указатель позиции -1, шага нет, по контракту возвращает default(T)
}
и т.д и т.д.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656889
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёта структуры какие-то замороченные. Слишком им много внимания надо уделять. new забудешь написать, и уже проблемы . После С++, где структуры это те же классы, непросто из головы вытолкать старые привычки и втолкнуть новые.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656895
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Чёта структуры какие-то замороченные.
оптимизация, ничего особенного
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656924
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
авторПосле С++, где структуры это те же классы
Давайте ++ трогать не будем, у Страуструппа и так судьба была не простой...
хочу опять взорвать ваш мозг
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
 class Program
    {
        private struct MyStruct
        {
            public int Id;
            public void Addint(int i)
            {
                Id = Id + i;
            }
        }

        class MyClass
        {
            public readonly MyStruct Struct = new MyStruct();
            public  MyStruct Struct2 = new MyStruct();
        }
        static void Main(string[] args)
        {
            var w = new MyClass();
            w.Struct.Addint(100);
            Console.WriteLine(w.Struct.Id);

            w.Struct2.Addint(100);
            Console.WriteLine(w.Struct2.Id);
            Console.Read();
        }
    }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657016
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
ldfld vs ldflda
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657051
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВГде-то в степи,
ldfld vs ldflda
это следствие, а не причина
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657321
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Чет Вы меня удивляете, я вам в прошлом примере дал объяснения, вы промолчали - поняли, тут показал - опять молчание.
а что же вы не кричали в прошлом примере - почему постоянно новая структура вылазит из анонимного типа, при обращению к полю?
этот пример как бы продолжение первого.
Поля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить, в анонимных типах , там нет авто свойств, там есть свойство только с одним акцессором ( без мутатора), которое возвращает
закрытое поле помеченное readonly , ну и исходя из этого инициализируемое через конструктор..
Структуры хитрая штука..
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657325
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к кстати кто пользуется решарпером, решарпер вежливо напоминает про эти нюансы.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657347
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи Структуры хитрая штука..
Потому и не делаю никогда своих. Выигрыш в производительности сомнительный, а проблем создают много!
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657351
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что мне попалось
http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2]
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657369
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степичто мне попалось
http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2]
Начали за здравие, кончили за упокой.
Какое отношение Паша Дуров имеет к внутренней организации LINQ? :)
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657385
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,
а что такого, я всегда иногда вставляю ссылки не по теме ( но имхо интер -я)
да и ветка можно сказать закончена... или вы хотите еще загадку- вопрос?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657452
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
Чет Вы меня удивляете, я вам в прошлом примере дал объяснения, вы промолчали - поняли, тут показал - опять молчание.
а что же вы не кричали в прошлом примере - почему постоянно новая структура вылазит из анонимного типа, при обращению к полю?
этот пример как бы продолжение первого.
Поля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить, в анонимных типах , там нет авто свойств, там есть свойство только с одним акцессором ( без мутатора), которое возвращает
закрытое поле помеченное readonly , ну и исходя из этого инициализируемое через конструктор..
Структуры хитрая штука..
Да я прошлый пример, вроде, уже понял. Но скоро опять забуду. ))

Я это, как бы ещё и работать пытаюсь. Не всё же сидеть на форуме. )))

В любом случае, спасибо, что помогали понять.

Где-то в степиили вы хотите еще загадку- вопрос?
Вы их откуда берёте?

А потом на собеседованиях джуниорам задаёте? :)

Где-то в степичто мне попалось
http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2]
Всё правильно сделал. Только непонятно, почему в Литву (которая, на мой взгляд, сама является полудепрессивной страной - население убывает, экономика не на высоте), а не в Америку, Австралию, Канаду или Британию, которые, ходят слухи, являются раем для айти-компаний. Да и в последних скорее можно найти говорящих по-английски, чем в Литве, где надо ещё и по-литовски (а накой оно надо, язык местечковый, никому в мире не нужный изучать?).
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]