Информация об изменениях

Сообщение Re[39]: dotnet vs java 2016-2020 от 17.10.2016 14:27

Изменено 17.10.2016 14:27 Serginio1

Здравствуйте, ·, Вы писали:

·>Здравствуйте, Serginio1, Вы писали:1


S>>·>Это может говорить о качестве такого компилятора, то что для него это — мучение. Правильно, как там vdimas упомянул? "зачем мучить компьютер компиляцией, когда у нас есть девушки".

S>>·>Если придётся по какой-то причине понадобится реализовать похожий алгортим самому, в своём коде — компилятор тоже не осилит, и здравствуй unsafe, каша из топора.
S>> Вот для .Net Native можно писать как угодно. Там скорость компиляции не важна. А вот jit малооптимизирующий компилятор.
·>java native тоже было, см. GCJ, но померло, ибо не нужен, как оказалось, JIT мало в чём уступает AOT. Если понадобится — возродят, проблем нет.

.Net Native хорош для мобильных устройств. На яблоках кстати Java нет, а .Net есть.

S>>>>Многие в нативе вообще ассемблерные вставки используют.

S>>·>Если вставки для системных вещей — ок, если для прикладных, — не ок.
S>> Так String это чуть ли не основной класс. Его стоит вылизать. То есть на C++ это нормально, а для C# это нонсенс.
·>Я в C++ не видел ассемблерных вставок в реализации std::basic_string или std::vector, в java тоже всё в пределах языка, без всяких native. А c# — это да, нонсенс.
Я рад за вас.
S>> То есть вполне возможно появление
·>Денег нет, вы держитеть.
Так уже же появлся

Example input code

public int Method1()
{
    var arr = new[] { 1, 2, 3, 4 };
    var q = 2;
    return arr.Where(x => x > q).Select(x => x + 3).Sum();
}

Allocations: input array, array enumerator, closure for q , Where delegate, Select delegate, Where enumerator, Select enumerator.

Decompiled output code

public int Method1()
{
    int[] arr = new[] { 1, 2, 3, 4 };
    int q = 2;
    return this.Method1_ProceduralLinq1(arr, q);
}
private int Method1_ProceduralLinq1(int[] _linqitems, int q)
{
    if (_linqitems == null) throw new ArgumentNullException();

    int num = 0;
    for (int i = 0; i < _linqitems.Length; i++)
    {
        int num2 = _linqitems[i]; 
        if (num2 > q)
            num += num2 + 3;
    }
    return num;
}
Re[39]: dotnet vs java 2016-2020
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Serginio1, Вы писали:1


S>>·>Это может говорить о качестве такого компилятора, то что для него это — мучение. Правильно, как там vdimas упомянул? "зачем мучить компьютер компиляцией, когда у нас есть девушки".

S>>·>Если придётся по какой-то причине понадобится реализовать похожий алгортим самому, в своём коде — компилятор тоже не осилит, и здравствуй unsafe, каша из топора.
S>> Вот для .Net Native можно писать как угодно. Там скорость компиляции не важна. А вот jit малооптимизирующий компилятор.
·>java native тоже было, см. GCJ, но померло, ибо не нужен, как оказалось, JIT мало в чём уступает AOT. Если понадобится — возродят, проблем нет.

.Net Native хорош для мобильных устройств. На яблоках кстати Java нет, а .Net есть.

S>>>>Многие в нативе вообще ассемблерные вставки используют.

S>>·>Если вставки для системных вещей — ок, если для прикладных, — не ок.
S>> Так String это чуть ли не основной класс. Его стоит вылизать. То есть на C++ это нормально, а для C# это нонсенс.
·>Я в C++ не видел ассемблерных вставок в реализации std::basic_string или std::vector, в java тоже всё в пределах языка, без всяких native. А c# — это да, нонсенс.
Я рад за вас.
S>> То есть вполне возможно появление
·>Денег нет, вы держитеть.
Так уже же появлся https://github.com/antiufo/roslyn-linq-rewrite

Example input code

public int Method1()
{
    var arr = new[] { 1, 2, 3, 4 };
    var q = 2;
    return arr.Where(x => x > q).Select(x => x + 3).Sum();
}

Allocations: input array, array enumerator, closure for q , Where delegate, Select delegate, Where enumerator, Select enumerator.

Decompiled output code

public int Method1()
{
    int[] arr = new[] { 1, 2, 3, 4 };
    int q = 2;
    return this.Method1_ProceduralLinq1(arr, q);
}
private int Method1_ProceduralLinq1(int[] _linqitems, int q)
{
    if (_linqitems == null) throw new ArgumentNullException();

    int num = 0;
    for (int i = 0; i < _linqitems.Length; i++)
    {
        int num2 = _linqitems[i]; 
        if (num2 > q)
            num += num2 + 3;
    }
    return num;
}