Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Два статических метода... или 4 строки LINQ?

515  
Murr патриот20.03.19 18:18
Murr
NEW 20.03.19 18:18 

Два статических метода... или 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);

}

Если все так симпатично - пошто мелкомягкие пишуть два метода?

#1 
dymanoid местный житель20.03.19 18:47
dymanoid
20.03.19 18:47 
в ответ Murr 20.03.19 18:18

Предлагаю посчитать количество аллокаций и memory traffic там и там, а заодно и быстродействие сравнить.

#2 
Срыв покровов коренной житель20.03.19 23:11
NEW 20.03.19 23:11 
в ответ Murr 20.03.19 18:18

У тебя даже copy/paste глючит.

string[] strArrays = namespaces;
string str = strArrays
;
#3 
dymanoid местный житель20.03.19 23:36
dymanoid
NEW 20.03.19 23:36 
в ответ Срыв покровов 20.03.19 23:11

Да ещё и страницу сломал, всё курсивом пишет.

#4 
Программист коренной житель21.03.19 07:40
NEW 21.03.19 07:40 
в ответ Murr 20.03.19 18:18, Последний раз изменено 21.03.19 07:42 (Программист)

Неудивительно, что у тебя там 2Гб исходников :)

Type.Namespace Property

#5 
Murr патриот21.03.19 11:29
Murr
NEW 21.03.19 11:29 
в ответ dymanoid 20.03.19 23:36

Тест:



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


Надо посмотреть можно ли вынести компиляцию сборки из цикла...

#6 
Murr патриот21.03.19 11:30
Murr
NEW 21.03.19 11:30 
в ответ Срыв покровов 20.03.19 23:11

Глючит местный парсер тегов...

#7 
Murr патриот21.03.19 11:34
Murr
NEW 21.03.19 11:34 
в ответ Программист 21.03.19 07:40

Ладушки - починим страничку -


Неудивительно, что у тебя там 2Гб исходников :)

-----

Не совсем так - это не мой и не у меня - код. Это код мелкомягких - фрагменты из XSD.EXE.

Ну Я просто пытаюсь победить Circular Reference...

#8 
Murr патриот21.03.19 16:13
Murr
NEW 21.03.19 16:13 
в ответ Murr 21.03.19 11:34

Три оператора:

hashtables[fullName.Substring(0, num)] = types;

hashtables[fullName.Substring(0, num)] = 100;

hashtables[fullName.Substring(0, num)] = null;


Один - существенно медленнее двух других.

Какой и почему?


#9 
Murr патриот21.03.19 16:29
Murr
NEW 21.03.19 16:29 
в ответ Murr 21.03.19 16:13

Можно ли родить 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 unique
foreach (String s in hashtables.Keys)
{
codeNamespace.Imports.Add(new CodeNamespaceImport(s));
}
}

20398 ms для 10.000 циклов по 4533 типам.

#10 
dymanoid местный житель21.03.19 22:12
dymanoid
NEW 21.03.19 22:12 
в ответ Murr 21.03.19 11:29

Твой тест быстродействия - фуфло. Не надо так тестить. Для этого есть специализированные инструменты, которые измеряют правильно.

BenchmarkDotNet

#11 
MrSanders старожил22.03.19 11:01
NEW 22.03.19 11:01 
в ответ dymanoid 21.03.19 22:12, Последний раз изменено 22.03.19 11:07 (MrSanders)

А как этот бенчмарк в виндоусях CPU Time меряет, не знаете? В документации не увидел...

Почему спрашиваю - я помню раньше у мелкомягких большие проблемы с этим были. Опрос по прерыванию, сколько-то раз в секунду, какой процесс в этот момент на ядре висит, тому всё время, прошедшее с предыдущего опроса, и приписывалось.

#12 
dymanoid местный житель22.03.19 21:23
dymanoid
NEW 22.03.19 21:23 
в ответ MrSanders 22.03.19 11:01

Для Винды используется QPC. Это самые точные таймеры на этой ОС - разрешение менее 1 мкс.

#13 
vovancpp постоялец22.03.19 22:21
NEW 22.03.19 22:21 
в ответ dymanoid 22.03.19 21:23

Самый точный это rdtsc. Но с ним нужно аккуратно со старыми процами. У них частота плавала.

Ну и конечно система должна быть пустая, с выключёнными обновлениямт и антивирям.

#14 
dymanoid местный житель22.03.19 22:32
dymanoid
NEW 22.03.19 22:32 
в ответ vovancpp 22.03.19 22:21

Чукча не читатель, чукча писатель?


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.
#15 
vovancpp постоялец22.03.19 23:55
NEW 22.03.19 23:55 
в ответ dymanoid 22.03.19 22:32

Чукча хочет точность или повторяемость?

Мерять производительность в ВМ это высший пилотаж.

#16 
Murr патриот25.03.19 15:50
Murr
NEW 25.03.19 15:50 
в ответ dymanoid 21.03.19 22:12

фуфло.

------

Мне как-то совсем без разницы чем его считают - есть приблизительные данные - достаточные чтобы увидеть что именно медленнее других - мне этого сейчас хватает.



специализированные инструменты

------

Которые надо изучать.

Надо. Но в текущей задаче они не дадут выигрыша...


#17 
Murr патриот25.03.19 15:55
Murr
NEW 25.03.19 15:55 
в ответ Murr 25.03.19 15:50

Да, поковырявшись и посоветовавшись получилось:

- упростить код

- сделать его быстрее почти на порядок

- почти сравнять производительность статики и линка....

Но линк в этой задаче все одно медленнее,

#18