Pull to refresh
0
0
Send message
Решил попробовать Вашу задачу на
Intel Core i5-6440HQ CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 4 physical cores
.NET Core SDK=2.2.110
[Host] : .NET Core 2.2.8 (CoreCLR 4.6.28207.03, CoreFX 4.6.28208.02), X64 RyuJIT
DefaultJob : .NET Core 2.2.8 (CoreCLR 4.6.28207.03, CoreFX 4.6.28208.02), X64 RyuJIT

Для 100_000: 6 мин,
если преждевременно нормализировать данные 2 мин.
Загрузил все ядра процессора, плюс использовал SIMD.

Учитывая стоимость видяшки, не такой большой прирост получился

К обфускации стоит подходить очень осторожно. Уже на этом примере заметно, насколько медленнее становится код((( Бедный JIT(

1. Не думаю что тут уместно нравится, не нравится!
2. В любом эксперименте эсть погрешность. В данном случае, если Вы дочитаете чуть ниже, увидете не более 10^-15 относительная погрешность.
Эсли такое и случится, то думаю скорее всего придется переписать уравнения Максвелла для массы фотона чуть больше 0.
1. СТО стоит всего на двух постулатах, приняв их и зная школьную геометрию Вам хватит сил чтоб вывести практически все выводы (Сокращения длины, относительность времени ну и кинетическую енергию), и сможете сами убедится что Ваши выводы не верны!
2. Так же стоит понять что скорость електромагнитных волн никак не влияет на максимальную скорость обьектов в нашей вселенной, просто так получилось что мы эту константу для нашего мира назвали скоростью света в вакууме. Скорость света такая, потому что маса покоя фотона равна нулю!
3. Допустим Вы правы, будем рассуждать в Ваших рамках, тогда получается что тот же БАК не правильно расчитан, так как на эфект Вавилова — Черенкова ушло бы большинство енергии (на основание этого кстати как раз есть експеременты для высокоенергитечских лучей, и как раз с Вашим вопросом) да и правильно подобрать електромагнитное поле для разгона бы не получалось!

Пропертя DebugView от Expression, суто для дебага того что получилось

Сделал генератор на подобии Вашего наитивного:
.Lambda #Lambda1<System.Action`2[FastReslectionForHabrahabr.Hydrators.Contact,FastReslectionForHabrahabr.Hydrators.FastContactHydrator+ReadOnlyListWrapper]>(
    FastReslectionForHabrahabr.Hydrators.Contact $contact,
    FastReslectionForHabrahabr.Hydrators.FastContactHydrator+ReadOnlyListWrapper $correlations) {
    .Block(
        FastReslectionForHabrahabr.Services.PropertyNameEqualityComparerHolder+ReferenceEqualityComparer $comparer,
        System.Int32 $i) {
        $comparer = (FastReslectionForHabrahabr.Services.PropertyNameEqualityComparerHolder+ReferenceEqualityComparer)FastReslectionForHabrahabr.Services.PropertyNameEqualityComparerHolder.Instance;
        $i = 0;
        .Loop  {
            .Block(
                FastReslectionForHabrahabr.Models.PropertyToValueCorrelation $item,
                System.String $propName,
                System.Int32 $hashcode) {
                .If ($i >= $correlations.Count) {
                    .Break #Label1 { }
                } .Else {
                    .Default(System.Void)
                };
                $item = $correlations.Item[$i];
                $propName = $item.PropertyName;
                $hashcode = .Call $comparer.GetHashCode($propName);
                .Switch ($hashcode) {
                .Case (45988614):
                        .If (
                            .Call $comparer.Equals(
                                "FullName",
                                $propName)
                        ) {
                            $contact.FullName = $item.Value
                        } .Else {
                            .Default(System.Void)
                        }
                .Case (11244347):
                        .If (
                            .Call $comparer.Equals(
                                "Phone",
                                $propName)
                        ) {
                            $contact.Phone = $item.Value
                        } .Else {
                            .Default(System.Void)
                        }
                .Case (34090260):
                        .If (
                            .Call $comparer.Equals(
                                "Age",
                                $propName)
                        ) {
                            $contact.Age = $item.Value
                        } .Else {
                            .Default(System.Void)
                        }
                };
                ++$i
            }
        }
        .LabelTarget #Label1:
    }
}
``` ini

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.18362.720 (1903/May2019Update/19H1)
Intel Core i5-6440HQ CPU 2.60GHz (Skylake), 1 CPU, 4 logical and 4 physical cores
.NET Core SDK=2.2.110
  [Host]     : .NET Core 2.2.8 (CoreCLR 4.6.28207.03, CoreFX 4.6.28208.02), X64 RyuJIT
  DefaultJob : .NET Core 2.2.8 (CoreCLR 4.6.28207.03, CoreFX 4.6.28208.02), X64 RyuJIT


```
|              Method |     Mean |    Error |   StdDev | Ratio |  Gen 0 | Gen 1 | Gen 2 | Allocated |
|-------------------- |---------:|---------:|---------:|------:|-------:|------:|------:|----------:|
|   FastHydrationLinq | 22.54 μs | 0.171 μs | 0.160 μs |  1.14 | 3.8452 |     - |     - |  11.91 KB |
|       FastHydration | 19.81 μs | 0.084 μs | 0.066 μs |  1.00 | 3.0518 |     - |     - |   9.47 KB |
|   SlowHydrationLinq | 29.76 μs | 0.156 μs | 0.146 μs |  1.51 | 4.4556 |     - |     - |  13.72 KB |
|       SlowHydration | 26.34 μs | 0.202 μs | 0.189 μs |  1.33 | 3.6621 |     - |     - |  11.28 KB |
| ManualHydrationLinq | 22.75 μs | 0.114 μs | 0.106 μs |  1.15 | 3.9673 |     - |     - |  12.22 KB |
|     ManualHydration | 19.75 μs | 0.056 μs | 0.052 μs |  1.00 | 3.1738 |     - |     - |   9.78 KB |

1. Инициализацию нужно проводить в [GlobalSetup], ваши моки и тому подобное!
1.a Нету смысла в цикле
for (int i = 0; i < N; i++)
, этим занимается Benchmarkdotnet!
2.b Немогу скзать точно, но думаю асинк-машину стоит убрать для бенчмаркинга єтой задачи!
2. в FastContactHydrator используете ConcurrentDictionary, в SlowContactHydrator массив и потом примитивный проход (так не честно :), ConcurrencyDictionary нелинейно пробегает по связаному списку, смотрит в разные массивы, Для массива наоборот линейный пробег, плюс енумератор структурка. Используются оптимизации. Вообще смысла нету в Вашем случае в Collections.Concurrent!
3. Если создаете словарь, используйте его по назанчению (DefaultRawStringParser), Хотя как по мне лучше подготовить словарь для ContactHydratorBase._mapSchemas
Как сборщик мусора смотрит на все это? Как вообще с быстродействием у функциональной парадигмы под CLR?
  1. Пожалуйста, избавтесь от лямбды, зачем нагружать сборщик мусора вот етим
    Lock.Invoke(SyncRoot, () => RawToRipe.TryGetValue(type, out typeData)
    Вы, при каждом вызове алокуете два обьекта.
  2. ConcurrentDictionary — внутри использует спиновые синхронизации.
  3. В class TypeOf избавтесь от стольких статик филдов.
Испоользуйте BenchmarkDotNet.
Он более акуратно проведет тесты, плюс выдаст ошибку измерений!
Нравится простота в использовании.
У Вас ошибка в листинге кода: TestNative и TestDelegateNative используют метод SaveString, но не через вызов делегата NativeDelegate.
Не знаю какой прирост даст в данном примере, но думаю статик филды делегатов лучше кешировать в локальную переменную, для чистоты теста!

Information

Rating
Does not participate
Registered
Activity