Два статических метода... или 4 строки LINQ?
Два статических метода... или 4 строки LINQ?
internal static void AddImports(CodeNamespace codeNamespace, string[] namespaces){string[] strArrays = namespaces;for (int i = 0; i < (int)strArrays.Length; i++){string str = strArrays;codeNamespace.Imports.Add(new CodeNamespaceImport(str));}}
internal static string[] GetNamespacesForTypes(Type[] types){Hashtable hashtables = new Hashtable();for (int i = 0; i < (int)types.Length; i++){string fullName = types.FullName;int num = fullName.LastIndexOf('.');if (num > 0){hashtables[fullName.Substring(0, num)] = types;}}string[] strArrays = new string[hashtables.Keys.Count];hashtables.Keys.CopyTo(strArrays, 0);return strArrays;}
вызов - однократный - второй метод отдает результат первомu
Замена:
public void AddCodeNamespaces(Type[] pTypes){CodeNamespaceImport[] uniqueKeys = pTypes.Where(t => t.FullName.LastIndexOf('.') > 0).Distinct().Select(n => new CodeNamespaceImport(n.FullName.Substring(0, n.FullName.LastIndexOf('.')))).ToArray();codeNamespace.Imports.AddRange(uniqueKeys);}
Если все так симпатично - пошто мелкомягкие пишуть два метода?
Предлагаю посчитать количество аллокаций и memory traffic там и там, а заодно и быстродействие сравнить.
Да ещё и страницу сломал, всё курсивом пишет.
Тест:
CodeNamespace codeNamespace;const Int32 TopLimit = 1000000;[TestMethod]public void TestMethod1(){Type[] types = typeof(System.Xml.Serialization.XmlAttributeAttribute).Assembly.GetTypes();Stopwatch stopwatch1 = new Stopwatch();stopwatch1.Restart();for (int i = 0; i < TopLimit; ++i){codeNamespace = new CodeNamespace();AddImports(codeNamespace, GetNamespacesForTypes(types));}stopwatch1.Stop();Debug.Print("Static methods : " + stopwatch1.ElapsedMilliseconds + " ms");Stopwatch stopwatch2 = new Stopwatch();stopwatch2.Restart();for (int i = 0; i < TopLimit; ++i){codeNamespace = new CodeNamespace();AddCodeNamespaces(types);}stopwatch2.Stop();Debug.Print("Using LINQ : " + stopwatch2.ElapsedMilliseconds + " ms");}
Static methods : 317983 ms
Using LINQ : 935715 ms
Надо посмотреть можно ли вынести компиляцию сборки из цикла...
Ладушки - починим страничку -
Неудивительно, что у тебя там 2Гб исходников :)
-----
Не совсем так - это не мой и не у меня - код. Это код мелкомягких - фрагменты из XSD.EXE.
Ну Я просто пытаюсь победить Circular Reference...
Три оператора:
hashtables[fullName.Substring(0, num)] = types;
hashtables[fullName.Substring(0, num)] = 100;
hashtables[fullName.Substring(0, num)] = null;Один - существенно медленнее двух других.
Какой и почему?
Можно ли родить LINQ обеспечивающий такое же быстродействие?
internal static void AddImports3(CodeNamespace codeNamespace, Type[] pTypes){Hashtable hashtables = new Hashtable();object obj = new object();int num6;foreach (Type type in pTypes){string fullName = type.FullName;if ((num6 = fullName.LastIndexOf('.')) > 0){hashtables[fullName.Substring(0, num6)] = obj;}}// key are uniqueforeach (String s in hashtables.Keys){codeNamespace.Imports.Add(new CodeNamespaceImport(s));}}
20398 ms для 10.000 циклов по 4533 типам.
Твой тест быстродействия - фуфло. Не надо так тестить. Для этого есть специализированные инструменты, которые измеряют правильно.
А как этот бенчмарк в виндоусях CPU Time меряет, не знаете? В документации не увидел...
Почему спрашиваю - я помню раньше у мелкомягких большие проблемы с этим были. Опрос по прерыванию, сколько-то раз в секунду, какой процесс в этот момент на ядре висит, тому всё время, прошедшее с предыдущего опроса, и приписывалось.
Самый точный это rdtsc. Но с ним нужно аккуратно со старыми процами. У них частота плавала.
Ну и конечно система должна быть пустая, с выключёнными обновлениямт и антивирям.
Чукча не читатель, чукча писатель?
We strongly discourage using the RDTSC or RDTSCP processor instruction to directly query the TSC because you won't get reliable results on some versions of Windows, across live migrations of virtual machines, and on hardware systems without invariant or tightly synchronized TSCs. Instead, we encourage you to use QPC to leverage the abstraction, consistency, and portability that it offers.
фуфло.
------
Мне как-то совсем без разницы чем его считают - есть приблизительные данные - достаточные чтобы увидеть что именно медленнее других - мне этого сейчас хватает.
специализированные инструменты
------
Которые надо изучать.
Надо. Но в текущей задаче они не дадут выигрыша...
Да, поковырявшись и посоветовавшись получилось:
- упростить код
- сделать его быстрее почти на порядок
- почти сравнять производительность статики и линка....
Но линк в этой задаче все одно медленнее,