powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
72 сообщений из 72, показаны все 3 страниц
Почему LINQ такой тормозной?
    #38655788
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Skip(n) is O(n).

Получается, что, если n достаточно велико, то быстрее (по выполнению, а не по написанию) будет страрый добый for сделать, где сразу начать операции с нужного индекса. И с фором будет O(1).

Я понимаю, что LINQ надо использовать только в местах, где скорость не важна. Но всё же не могли бы они его немного ускорить? Ну чтобы хотя бы вот такие вещи, как Skip.

Люди страшные вещи говорят: http://stackoverflow.com/questions/9718117/selecting-first-10-records-then-next-10-paging-using-linq#comment12354639_9718155 .
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655805
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной".
P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ...
P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655817
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
 class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<int> s = GetInts();
            //foreach (var i in s)
            //{
            //    Console.Write(i);
            //}
            for (int i = 0; i < s.Count(); i++)
            {
                Console.Write(i);
            }

        }

        static IEnumerable<int> GetInts()
        {
            while (true)
            {
                yield return new Random().Next(int.MinValue, int.MaxValue);
            }
        }
    }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655818
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

там код в цикле ни разу не выполнится, потому что на Count() будет вечный цикл.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655822
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchuser7320,

Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной".
P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ...
P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу.
1. А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс?

2. Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса?

3. А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655826
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степивсе в природе енумераторов..
Да знаю я (кстати, спасибо, что напомнили - постоянно забываю).

А почему нельзя для узких мест сделать отдельные проверки и ускорить эти места? Внутри Линка, я имею ввиду.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655833
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

user7320 А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс?

1) Ну напишите свой Ext метод, который будет переопределять поведение для List ))

user7320 Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса?

2) На форуме упоминалось, что, например ElementAt для List именно по индексу работает

user7320А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов?

3) А вы таки разберитесь как LINQ работает)) Ответ: нет, о причинах подумайте сами )
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655834
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
  static void Main(string[] args)
        {
            IEnumerable<int> s = GetInts();
            //foreach (var i in s)
            //{
            //    Console.Write(i);
            //}
            for (int i = 0; i < s.Count(); i++)
            {
                Console.Write(i);
            }

        }

        static IEnumerable<int> GetInts()
        {
            var i = 0;
            while (i<10)
            {
                i++;
                yield return new Random().Next(int.MinValue, int.MaxValue);
            }
        }


и посмотри под отладчиком, как ведет себя метод s.Count() при каждой итерации по циклу.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655892
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
не слышу возмущений, что абстракция потекла..
как быть?
Код: c#
1.
2.
3.
4.
5.
           var enumerable = s as int[] ?? s.ToArray(); 
            for (int i = 0; i < enumerable.Count(); i++)
            {
                Console.Write(i);
            }


а если много? сожрет память(, зато быстрый доступ)
Это Вам решать, есть расширения и вперед..
И обещанная головоломка, ( не от меня) типа: а схуяли так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 static void Main(string[] args)
        {
            var ob = new { enumerator = new List<int> { 1, 2 }.GetEnumerator() };
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }
        }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656107
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи И обещанная головоломка, ( не от меня) типа: а схуяли так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 static void Main(string[] args)
        {
            var ob = new { enumerator = new List<int> { 1, 2 }.GetEnumerator() };
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }
        }


Это связано с анонимными типами. Чёта как-то так , хотя и не совсем в тему, по-моему (т. к. в вашем примере никто этот анонимный тип не заставляет реализовывать интерфейс, у него есть всего лишь свойство с таким интерфейсом).

Вот так работает

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        class My
        {
            public IEnumerator<int> enumerator;
        }

        static void Main(string[] args)
        {
            var ob = new My() { enumerator = new List<int> { 1, 2 }.GetEnumerator() };

            while (ob.enumerator.MoveNext())
            {
                Console.Write(ob.enumerator.Current);
            }

            Console.Read();
        }



Ну а вообще, я думаю, сборщик мусора постарался. Списка уже не существует. Вернее,
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656117
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ваще, надо внутрь List<T>.Enumerator смотреть, как он MoveNext реализует.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656123
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
не слышу возмущений, что абстракция потекла..
как быть?
Код: c#
1.
2.
3.
4.
5.
           var enumerable = s as int[] ?? s.ToArray(); 
            for (int i = 0; i < enumerable.Count(); i++)
            {
                Console.Write(i);
            }


а если много? сожрет память(, зато быстрый доступ)
Это Вам решать, есть расширения и вперед.
Чего ты мне Count() суёшь? Он же будет каждый раз итератором по все коллекции ходить. Либо Length, либо Count() до цикла один раз вызвать и в переменную результат запихать.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656124
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

анонимный тип неизменяем?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656143
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);
            }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656151
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, список инстанцироваться не успел? Причина может быть в структуре Enumerator списка - структуры же копируются при их назначении - т. е. каждый раз новый объект создаётся. Т. е. он назначил структуру Enumerator, когда ещё список не имел значений 1 и 2, поэтому Enumerator всегда возвращает дефолтное значение для int.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656152
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, в этом случае бы он завершился сразу бы после первой же итерации, наверное, а он в бесконечный цикл вошёл.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656155
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656170
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
Отгадка-то есть?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656194
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656213
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
Это "джамп ту метод" который? Ну дошёл я до

public bool MoveNext();

в теле List<T>. Дальше что?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656217
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
GetEnumerator() это структура.......
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656221
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
28.
29.
30.
31.
  // Summary:
        //     Enumerates the elements of a System.Collections.Generic.List<T>.
        [Serializable]
        public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
        {

            // Summary:
            //     Gets the element at the current position of the enumerator.
            //
            // Returns:
            //     The element in the System.Collections.Generic.List<T> at the current position
            //     of the enumerator.
            public T Current { get; }

            // Summary:
            //     Releases all resources used by the System.Collections.Generic.List<T>.Enumerator.
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
            public void Dispose();
            //
            // Summary:
            //     Advances the enumerator to the next element of the System.Collections.Generic.List<T>.
            //
            // Returns:
            //     true if the enumerator was successfully advanced to the next element; false
            //     if the enumerator has passed the end of the collection.
            //
            // Exceptions:
            //   System.InvalidOperationException:
            //     The collection was modified after the enumerator was created.
            public bool MoveNext();
        }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656222
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
GetEnumerator() это структура.......
Я знаю. Это тип значения.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656226
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Current всё время возвращает 0. Это потому, что он неопределён. Я так понимаю, что для неопределённого значения Current возвращается дефолтное значение для T.

Теперь почему MoveNext() каждый раз делает Current нулём?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656227
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Current всё время возвращает 0. Это потому, что он неопределён
В смысле, до первого вызова MoveNext
...
Рейтинг: 0 / 0
Почему 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
Почему LINQ такой тормозной?
    #38657456
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиПоля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию
Так вроде, все структуры и так выдают копию при запросе?

Кстати, когда вы ввели в структуру метод, изменяющий её поле, вы сделали свою структуру мутабельной?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657461
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что интересно, под дебагом внутри метода Addint для перового экземпляра структуры видно, что поле изменяется и равно 100. А когда вышли из этого метода - поле снова равно 0. Это почему?

Мой ответ: потому, что это не поле в методе, а его копия в виде локальной переменной. И изменилась с 0 до 100 копия, а не поле. Когда метод закончился, локальная переменная досталась сборщику мусора, а поле осталось неизменным. Правильно?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657463
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиПоля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить
А откуда эта аксиома выводится? Я вот МСДН читаю, и там не нахожу такого в одном месте. Это что, надо по крупицам собирать из нескольких статей?

Ну, при попытке сделать так

w.Struct.Id = w.Struct.Id + 2;

компилятор выдаёт такое

Members of readonly field 'ConsoleApplication1.Program.MyClass.Struct' cannot be modified (except in a constructor or a variable initializer

А если бы Struct был не структурой, а классом, пусть даже под readonly, то всё нормально меняется.

Т. е. где-то в компиляторе есть такое правило, но в явном виде оно нигде не упоминается?

Т. е. пока на нечто такое не наткнёшься, не поймёшь?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657464
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
вот аксиома
user7320Когда метод закончился, локальная переменная досталась сборщику мусора
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657467
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут посмотрел. Похоже, что, чтобы это понять, надо просто запомнить маааленький алгоритмец доступа к членам
http://msdn.microsoft.com/en-us/library/aa691353(v=vs.71).aspx

Этакий набор аксиом, хе-хе.

Лично я никуя не понял и закрыл это дело. До лучших времён. Голову можно сломать. Доступ к членам в С# - это просто!
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657469
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Я тут посмотрел. Похоже, что, чтобы это понять, надо просто запомнить маааленький алгоритмец доступа к членам
http://msdn.microsoft.com/en-us/library/aa691353(v=vs.71).aspx

Этакий набор аксиом, хе-хе.

Лично я никуя не понял и закрыл это дело. До лучших времён. Голову можно сломать. Доступ к членам в С# - это просто!
В смысле, что там есть вариант ридонли структур, только я его не нашёл - там для меня какая-то каша.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657472
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторOne unfortunate design weakness in .net is that there is no means by which struct methods can indicate whether or not they will modify this.

Из дырявых абстракций прямо хлещет.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657474
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ну нафиг эти структуры! Я ж теперь их как огня бояться буду!
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657479
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://blogs.msdn.com/b/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx The relevant section of the specification is 7.5.4, which states that when resolving "E.I" where E is an object and I is a field...

...if the field is readonly and the reference occurs outside an instance constructor of the class in which the field is declared, then the result is a value, namely the value of the field I in the object referenced by E.

The important word here is that the result is the value of the field, not the variable associated with the field. Readonly fields are not variables outside of the constructor. (The initializer here is considered to be inside the constructor; see my earlier post on that subject.)

Great. What about that second dot, as in ".Mutate()"? We look at section 7.4.4 to find out how to invoke E.M():
Ну, мля, так нечестно! Они напридумывали там своих дырявых абстракций десятиуровневых. Они в этом аду варятся каждый день, а прикладным разработчикам задачи решать надо, а не в тонкостях языка разбираться. Прикладные разработчики только время от времени в это дело лезут, и сразу обратно, махнув рукой.

Лучше раз в сутки сервера с утекающей памятью перегружать, чем разбираться в этой мозголомной помойке, которая, к тому же, через лет 5-7 снова станет не нужной МС и она снова сменит тренд. Липперт за мозголомство бабки получает, а я - за решение задач.

Как грица, думать надо меньше, а соображать - больше.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657485
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, кто осилил в спецификацию Сишарпа и может все эти section 7.5.4, section 7.x.y и пр. в голове одновременно и в разных вариациях держать на каждую строчку кода (а вдруг чего не так?! - оппа, справочка под рукой) - прётся, остальные могут идти накуй запоминают кучку "аксиом" в количестве нескольких тысяч штук на весь язык - всего лишь другой вариант спецификации.

Короче, жопа с какой стороны ни посмотри.

Конечно, Решарпер это хорошо. Но почему сама Студия или компилятор не подсказывают? Из первых комментариев к этой статье я так понял, что Решарпер где-то в средней категории и работает - где дизайнеры C# не решились вставить сообщение об ошибке или предупреждение, Решарпер решился.

Вот это вот

авторError 1 Members of readonly field 'ConsoleApplication1.Program.MyClass.Struct' cannot be modified (except in a constructor or a variable initializer)

мало инфы даёт, потому что не уточняет, что это только для структур. Кажется, что это для всех ридонли членов, но по факту для ридонли классов-то таких ограничений нет. А вот этого из ошибки и не ясно.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657621
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Что интересно, под дебагом внутри метода Addint для перового экземпляра структуры видно, что поле изменяется и равно 100. А когда вышли из этого метода - поле снова равно 0. Это почему?

Мой ответ: потому, что это не поле в методе, а его копия в виде локальной переменной. И изменилась с 0 до 100 копия, а не поле. Когда метод закончился, локальная переменная досталась сборщику мусора, а поле осталось неизменным. Правильно?Нет. Думаю, уже сам это понял.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657625
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
вот аксиома
user7320Когда метод закончился, локальная переменная досталась сборщику мусораИ, совсем не аксиома. В общем случае это не так. И, конкретно, в рассматриваемом примере это не так
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657630
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
вы тоже считаете что сборщик проверяет локальные переменные при удалении?
чистка стека это очень просто, передвигаем указатель в низ до первого еще живого, и все
сборщику ваще до фонаря до локальных п. значимые ему не интересны, указатель на кучу тоже..
может имелось в виду, локальная переменная замкнутая на лябду - так она уже не локальная
она в куче через служебный класс...
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657634
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиrefreg,
вы тоже считаете что сборщик проверяет локальные переменные при удалении?
чистка стека это очень просто, передвигаем указатель в низ до первого еще живого, и все
сборщику ваще до фонаря до локальных п. значимые ему не интересны, указатель на кучу тоже..
может имелось в виду, локальная переменная замкнутая на лябду - так она уже не локальная
она в куче через служебный класс...Вот сейчас согласен. Сборщику мусора плевать на структуру. Если, только она не упакована.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657661
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
Говорить о сборщике и стеке это вообще бессмысленно.
У сборщика своя жизнь - у стека своя, и нигде они не пересеваются
Вообще сборщик может не вызваться никогда за время жизни приложения ,
и что тогда ? стек впадет в уныние...?
ЕвгенийПотому и не делаю никогда своих. Выигрыш в производительности сомнительный, а проблем создают много!
где то читал , раз спросили Липперта, чем Вы руководствуетесь выбирая структуру и класс.
он ответил - поведением типа, ему - так вроде ж очевидно одна там другая тут лежит?.
Он ответил - поведение важнее, где лежит это уже вторично..
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657674
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиrefreg,
Говорить о сборщике и стеке это вообще бессмысленно.С этим согласен. Тогда объясните, что Вы тут 16099524 назвали аксиомой.
Или просто указали, что переменная не нужна, оборотом "сборщик мусора" (я понимаю, что там цитата, не Ваша речь).
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657676
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
так это тролинг, я и хотел выяснить
что это было
авторКогда метод закончился, локальная переменная досталась сборщику мусора
или парапраксис или тонкий троллинг или неудачный выстрел в голову при чистке оружия....
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38657917
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320 Липперт за мозголомство бабки получает, а я - за решение задач.

Эрик один самых толковых среди ныне живущих и уже давно не работает в Microsoft.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38658153
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВuser7320 Липперт за мозголомство бабки получает, а я - за решение задач.

Эрик один самых толковых среди ныне живущих и уже давно не работает в Microsoft.
Я к тому, что в Сишарпе уже настолько всё переусложнили, что знать все тонкости в любой момент может разве что этот Эрик и ему подобные, которые годами спецификацию Сишарпа грызут. А люди, которые не теорию учат, а должны решать задачи, просто уже не в состоянии угнаться за всеми нюансами языка... И при всём при этом абстракции у них всё равно изрядно протекают - т. е. таки спецификация начинает походить не на логически отстроенную систему, а на сборник кейсов и исключений, который надо не понять, а тупо запомнить. А чтобы понять, откуда эти исключения взялись - таки вылезти за рамки спецификации и посмотреть, что внутрях.

Они бы хоть вычёркивали всякое, которое в Сишарпе уже устарело. Ну, не знаю... Взять ту же книжку "C# in Depth" Скита - он там приводит разные кейсы на разные аспекты языка и как они изменялись от версии 2.0 к версии 4.0. Вот почему бы не оставить всерсию 4.0, а на остальное забить? Да я понимаю, что совместимость и всё такое, но от обилия "как сделать одно и то же кучей разных способов" уже в голове калейдоскоп и это ведёт скорее не к гибкости языка, а к увеличению количества ошибок.

Сишарп хорош тем, что пока говна в нём поменьше, чем в той же Джаве, а возможностей побольше в общем и целом.

Не принимайте близко к сердцу - это мнение диванного аналитика.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38658167
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

И где ты в java говно видишь, уточни.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38658168
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Да бросьте свою истерику, язык как язык, скажу более ( имхо) писать можно на нем как хочешь и куда хочешь, не утруждая себя
знаниями и т.д. ( например можно забыть что такое энумератор, можно перечисление назвать деревом выражений, и них-я, скомпилится родной))
автор а на сборник кейсов и исключений, который надо не понять, а тупо запомнить
дак если не понимаете, приходится запоминать как аксиому, например замыкать на ref out незя...,
в джаве или С вас бы в угол запинали да системником припечатали, а тут ( в этом языке все в порядке вещей)
Зы в нем не говна меньше, в нем просто любое говно может писать любое говно... ( сборщике подтерет ) :)
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38658190
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всю жисть юзал линкью и ни о чем таком не думал.

Я вапасносте???
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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