powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Тоже самое, но LINQом?
20 сообщений из 20, страница 1 из 1
Тоже самое, но LINQом?
    #39789812
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть метод:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        internal static void ImportNamespaces6(CodeNamespace codeNamespace, Type[] pTypes)
        {
            Hashtable hashtable = new Hashtable();
            object dummy = new object();
            int num6;
            foreach (Type type in pTypes)
            {
                string fullName = type.FullName;
                if ((num6 = fullName.LastIndexOf('.')) > 0)
                {
                    hashtable[fullName.Substring(0, num6)] = dummy;
                }
            }
            // key are unique
            foreach (String key in hashtable.Keys)
            {
                codeNamespace.Imports.Add(new CodeNamespaceImport(key));
            }
        }



Есть тормозящий примерно в трое LINQ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
        public static void AddCodeNamespaces(Type[] pTypes)
        {
            CodeNamespaceImport[] uniqueKeys = pTypes
                .Where(t => t.FullName.LastIndexOf('.') > 0)
                .Select(n => n.FullName.Substring(0, n.FullName.LastIndexOf('.')))
                .Distinct() // ? slow/many?
                .Select(n => new CodeNamespaceImport(n))
                .ToArray()
                ;

            CodeNamespace.Imports.AddRange(uniqueKeys);
        }



Есть ли возможность нарисовать LINQ работающий с той же скоростью?

Фактически интересует возможность транслировать LINQ во время компиляции - без этого, похоже, не вытянуть.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789815
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся - перекиньте в нужный форум, плс...

Модератор: Тема перенесена из форума "WinForms, .Net Framework".
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789817
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatЕсть ли возможность нарисовать LINQ работающий с той же скоростью?Зачем?
Код: c#
1.
new HashSet<string>(выборка).Select(n => new CodeNamespaceImport(n).ToArray()

такой Linq подойдет или не считается?
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789824
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

На входе - массив типов Type[]
На выходе - заполненный CodeNamespace.Imports - дистинктивный список намеспасов

P.S. CodeNamespace.Imports.AddRange() - не умеет работать с IEnumerable() - понимает только массив
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789826
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Зачем?
-----
Есть ли смысл переходить на LINQ?

Все же в 3 раза медленнее... хотя обычно у меня получалось наоборот....
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789833
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatНа входе - массив типов Type[]
На выходе - заполненный CodeNamespace.Imports - дистинктивный список намеспасов

P.S. CodeNamespace.Imports.AddRange() - не умеет работать с IEnumerable() - понимает только массиви? это и так понятно из кода
PinkCatЕсть ли смысл переходить на LINQ?что значит "переходить"?
Любым инструментом надо пользоваться по назначению, понимая, как он работает
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789835
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

и? это и так понятно из кода
-----
В предложенном тобою коде делается другое.


Любым инструментом надо пользоваться по назначению, понимая, как он работает
-----
Моих навыков достаточно только для получения заданного результата, но не производительности.
Вот и ищу того кто "умеет и понимает" - до уровня когда можно сравнять производительность - может чему еще научусь.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789839
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCatВ предложенном тобою коде делается другое.Разве? Тот же самый массив CodeNamespaceImport[], который можешь добавлять в свой Imports


PinkCatВот и ищу того кто "умеет и понимает" - до уровня когда можно сравнять производительность - может чему еще научусь.Ну я тебе предложил использовать HashSet вместо Distinct, то есть нечто среднее между двумя твоими вариантами - попробуй
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39789842
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Тот же самый массив
-----
Значит Я не понял.


попробуй
----
Пора домой - завтра не буду, потом выходные - буду ковырять в понедельник.

Но пробовать - буду - спасибки за вариант.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790430
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, зачем тут вообще расчленение FullName, если у типа есть свойство Namespace?
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790547
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовать можно заменить Distinct() на ToHashSet(). Хотя я подозреваю, что Distinct() и так внутри что-то такое и делает.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790548
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatПопробовать можно заменить Distinct() на ToHashSet(). Хотя я подозреваю, что Distinct() и так внутри что-то такое и делает.ToHashSet появился только в 4.7.2, поэтому я на всякий случай предложил использовать конструктор HashSet.
Distinct не то же самое делает, судя по исходникам, там используются internal-коллекции
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790549
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытства для посмотрел - на самом деле он использует не HashSet а обычный Set - может быть дело в этом.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790916
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Кстати, зачем тут вообще расчленение FullName, если у типа есть свойство Namespace?
-----
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.CodeDom;
using System.Diagnostics;

namespace Xsd_a.Tests
{
    [TestClass]
    public class UnitTest2
    {
        const Int32 TopLimit = 10000;
        Type[] types;

        [TestMethod]
        public void TestMethod1()
        {
            List<Type> typeslist = new List<Type>();
            Type[] types1 = typeof(System.String).Assembly.GetTypes();
            typeslist.AddRange(types1);
            Type[] types2 = typeof(System.Xml.Serialization.XmlAttributeAttribute).Assembly.GetTypes();
            typeslist.AddRange(types2);

            types = new Type[typeslist.Count];
            typeslist.CopyTo(types, 0);

            Debug.Print("Total types: " + types.Length + " (" + TopLimit + " cycles)");

            Stopwatch sw = new Stopwatch();

            // Force LINQ compilation & load
            CodeNamespaceImport[] imports0 = LinqNS.Model(0, types);

            CodeNamespaceImport[] imports = null;
            for (int model = 1; model <= 4; ++model)
            {
                sw.Restart();
                for (int loop = 0; loop <= TopLimit; ++loop)
                {
                    imports = LinqNS.Model(model, types);
                }
                sw.Stop();
                Debug.Print("Linq model " + model + " : " + sw.ElapsedMilliseconds + " ms. Items = " + imports.Length);
            }
        }
    }

    internal static class LinqNS
    {
        public static CodeNamespaceImport[] Model(int pModel, Type[] pTypes)
        {
            CodeNamespaceImport[] uniqueKeys = null;
            
            switch (pModel)
            {
                case 0:
                    // to force compilation
                    uniqueKeys = pTypes
                        .Where(t => t.FullName.LastIndexOf('.') > 0)
                        .Select(n => n.FullName.Substring(0, n.FullName.LastIndexOf('.')))
                        .Distinct()
                        .Select(n => new CodeNamespaceImport(n))
                        .ToArray()
                        ;
                    break;

                case 1:
                    uniqueKeys = pTypes
                        .Where(t => t.FullName.LastIndexOf('.') > 0)
                        .Select(n => n.FullName.Substring(0, n.FullName.LastIndexOf('.')))
                        .Distinct()
                        .Select(n => new CodeNamespaceImport(n))
                        .ToArray()
                        ;
                    break;

                case 2:
                    var selection2 = pTypes
                        .Where(t => t.FullName.LastIndexOf('.') > 0)
                        .Select(n => n.FullName.Substring(0, n.FullName.LastIndexOf('.')))
                        ;
                    uniqueKeys = new HashSet<string>(selection2).Select(n => new CodeNamespaceImport(n)).ToArray();
                    break;

                case 3:
                    var selection3 = pTypes
                        .Select(x => new { LastIndexOf = x.FullName.LastIndexOf('.'), FullName = x.FullName })
                        .Where(t => t.LastIndexOf > 0)
                        .Select(n => n.FullName.Substring(0, n.LastIndexOf))
                        ;
                    uniqueKeys = new HashSet<string>(selection3).Select(n => new CodeNamespaceImport(n)).ToArray();
                    break;

                case 4:
                    var selection4 = pTypes
                        .Select(x => x.Namespace)
                        ;
                    uniqueKeys = new HashSet<string>(selection4).Select(n => new CodeNamespaceImport(n)).ToArray();
                    break;

                default:
                    break;

            }
            // enshure accessible
            foreach(CodeNamespaceImport imp in uniqueKeys)
            {
                string ns = imp.Namespace;
            }
            return uniqueKeys;
        }
    }
}


Linq model 1 : 27165 ms. Items = 78
Linq model 2 : 26986 ms. Items = 78
Linq model 3 : 27186 ms. Items = 78
Linq model 4 : 3972 ms. Items = 79

Но с этой стороны Я на код не смотрел - интересовал только LINQ vs static method.
У каких-то классов Namespace равен null - не задан - лишнее ентри.

Код: c#
1.
2.
3.
4.
5.
6.
7.
                case 5:
                    var selection5 = pTypes
                        .Where(x => x.Namespace != null)
                        .Select(x => x.Namespace)
                        ;
                    uniqueKeys = new HashSet<string>(selection5).Select(n => new CodeNamespaceImport(n)).ToArray();
                    break;



Linq model 5 : 4623 ms. Items = 78
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790920
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вишь, я прав насчет хэшсета

PinkCatУ каких-то классов Namespace равен null - не задан - лишнее ентри.Ты его не туда пихаешь, зачем в общий цикл-то?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
                case 6:
                    var selection6 = pTypes
                        .Select(x => x.Namespace)
                        ;
                    uniqueKeys = new HashSet<string>(selection6)
                       .Where(x => x != null)
                       .Select(n => new CodeNamespaceImport(n)).ToArray();
                    break;
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790924
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        internal static void AddImports5(CodeNamespace codeNamespace, Type[] pTypes)
        {
            HashSet<string> hashset = new HashSet<String>();
            foreach (Type type in pTypes)
            {
                if (type.Namespace != null)
                {
                    hashset.Add(type.Namespace);
                }
            }
            // key are unique
            foreach (String s in hashset)
            {
                codeNamespace.Imports.Add(new CodeNamespaceImport(s));
            }
        }



HashSet/NS ver : 4036 ms; items 78
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790926
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Сейчас посмотрю эту версию.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39790937
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Static func HashSet/NS2 ver : 3641 ms; items 78
Linq: Linq model 6 : 3947 ms. items 78

Хммм... в 6 раз быстрее кода мелкомягких...
Но все же LINQ в данном решении немного медленее.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39791202
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ради прикола, проверил в Core 2. Distinct() vs ToHashSet() vs new HashSet(...). Набор данных - мильон случайных строк длиной по 128 символов каждая. Distinct() сосет у двух других практически всегда, но не так, чтобы прямо уж так с глубоким заглотом ToHashSet() и просто new HashSet() как бы, сосут друг у друга понемножку с переменным успехом. Скорее всего зависит от того, как хэши раскинулись. Внутри себя Distinct() использует нечто очень похожее на хешсет, но не тот хешсет, который общедоступный HashSet, а какой-то свой internal - я в душе не знаю, почему, м.б., какое-то наследие самого древнего LINQ, м.б. тогда HashSet-а еще не было.
...
Рейтинг: 0 / 0
Тоже самое, но LINQом?
    #39791205
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вот еще прикол сейчас проверил - если строки предварительно интернировать (ну или изначально иметь дело с интернироваными), то сосать начинает наоборот ToHashSet().
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Тоже самое, но LINQом?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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