Re[4]: Oberon vs C#
От: _FRED_ Черногория
Дата: 12.04.24 15:31
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Ух ты еще и делегат пришпандорил!

S>                Swap(ref a[j + 1], ref a[j]);

S>//[MethodImpl(MethodImplOptions.AggressiveInlining)] можно попробовать. Хотя и так должен быть инлайнинг
S>     void Swap(ref double x, ref double y)


Это не делегат, а обычная локальная функция.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.04.24 16:55
Оценка:
Здравствуйте, _FRED_, Вы писали:


S>>Ух ты еще и делегат пришпандорил!

_FR>
S>>                Swap(ref a[j + 1], ref a[j]);

S>>//[MethodImpl(MethodImplOptions.AggressiveInlining)] можно попробовать. Хотя и так должен быть инлайнинг
S>>     void Swap(ref double x, ref double y)
_FR>


_FR>Это не делегат, а обычная локальная функция.


То что выше это локальная функция, которую я предложил вместо.

static void Sort(double[] a)
{
    var Swap = (ref double x, ref double y) =>
    {
        var t = x;
        x = y;
        y = t;
    };

    for (var i = 0; i < a.Length; i++)
        for (var j = 0; j < a.Length - 1 - i; j++)
            if (a[j + 1] < a[j])
                Swap(ref a[j + 1], ref a[j]);
}


Там явно проблема с инлайнингом.

https://stackoverflow.com/questions/40943117/local-function-vs-lambda-c-sharp-7-0

Смотри TestLambda
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.04.2024 16:56 Serginio1 . Предыдущая версия .
Re[4]: Oberon vs C#
От: syrompe  
Дата: 12.04.24 21:01
Оценка:
Окей, принимается. В исходном варианте такой же N^2.
Запустил ваш код и дело таки похоже в делегате. Ну скорее всего в лишнем копировании данных для его вызова.

Вот такой код работает на 12 секунд быстрее вашего (21с против 33с) на моей машине:
using System.Diagnostics;

var m = 100_000;
var a = new double[m];
var s = (double)m;
for (var i = 0; i < m; i++)
{
    a[i] = s;
    s = s - 1;
}
var sw = new Stopwatch();
sw.Start();
Sort(a);

Console.WriteLine("HeLLO");
Console.WriteLine(sw.Elapsed);

static void Sort(double[] a)
{
    for (var i = 0; i < a.Length; i++)
        for (var j = 0; j < a.Length - 1 - i; j++)
            if (a[j + 1] < a[j])
            {
                var t = a[j+1];
                a[j + 1] = a[j];
                a[j] = t;
            }
}
Отредактировано 12.04.2024 21:07 syrompe . Предыдущая версия .
Re[4]: Oberon vs C#
От: syrompe  
Дата: 12.04.24 21:44
Оценка: 4 (2)
S>Попробуй
S>[cs]
S>static void Sort(double[] a)
S>{

Исходный вариант автора в релизе — 9с, в дебаге — 30с
Ваш вариант: в релизе — 5,5с, в дебаге 26с
Вариант совсем без отдельного метода Swap: в релизе — 5,5с, в дебаге 21.5
Re[4]: Oberon vs C#
От: Разраб  
Дата: 13.04.24 01:25
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Ух ты еще и делегат пришпандорил!


S>Попробуй

Тоже самое, была мысль что раз после сортировки нигде не пользуется массив, то и сортировки нет,
заменил вывод "hello" на a[0]. не помогло.
Мерял под виндой

(Measure-Command { dotnet run -c release | Out-Default }).ToString()
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.04.24 09:06
Оценка: 1 (1)
Здравствуйте, Разраб, Вы писали:

S>>Ух ты еще и делегат пришпандорил!


S>>Попробуй

Р>Тоже самое, была мысль что раз после сортировки нигде не пользуется массив, то и сортировки нет,
Р>заменил вывод "hello" на a[0]. не помогло.
Р>Мерял под виндой
Р>

Р>(Measure-Command { dotnet run -c release | Out-Default }).ToString()

Р>


Ну вот syrompe

https://rsdn.org/forum/flame.comp/8730466.1
Автор: syrompe
Дата: 13.04.24

https://rsdn.org/forum/flame.comp/8730474.1
Автор: syrompe
Дата: 13.04.24

говорит, что разница есть

Исходный вариант автора в релизе — 9с, в дебаге — 30с
Ваш вариант: в релизе — 5,5с, в дебаге 26с
Вариант совсем без отдельного метода Swap: в релизе — 5,5с, в дебаге 21.5


То есть Swap как локальная функция инлайнится
и солнце б утром не вставало, когда бы не было меня
Отредактировано 13.04.2024 11:29 Serginio1 . Предыдущая версия . Еще …
Отредактировано 13.04.2024 9:17 Serginio1 . Предыдущая версия .
Отредактировано 13.04.2024 9:17 Serginio1 . Предыдущая версия .
Re[3]: Oberon vs C#
От: Разраб  
Дата: 15.04.24 00:01
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>чуть выше шарп, а еще попробовал на F#, вот он вообще не завершается. тут вообще чертовщина))

Р>

Р>let sort arr =

Р>

Оказалось, всего-навсего надо было:

let sort (arr: float array) = ()


Теперь F# всего на 1 секунду медленней C#
не так уж и плохо, странно, что вывод типа, получился неверный, даже если вызвать как arr |> sort,
такая запись обычно помогает с выводом типа. Возможно пофиксять в 9ке. Запостил на форуме сообщества.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Выводы-то какие ?
От: LaptevVV Россия  
Дата: 15.04.24 03:30
Оценка: 3 (1)
Я однажды писал на С++ прогу, в которой использовал стандартный дек.
Пишу, никого не трогаю, примуса починяю: сначала в Студии, потом в Кодеблоксе на винде.
Стандартный С++.
Оптимизация, все дела.
И тут выясняется, что прога из-под mingw работает в 5 (ПЯТЬ) раз быстрее из-под-студийной.
В релизе!
Что за хрень?!
Всегда было не более 10-12-15%!
А тут в 5 раз!

Я в конце-концов задал вопрос на РСДН
Один перец, имевший аналогичный опыт ответил, что дек в STL из-под Студии реализован через задницу.
Типа используй вектор.

Я, конечно так и поступил
И получил свои стандартные 10-12-15%.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Oberon vs C#
От: _FRED_ Черногория
Дата: 15.04.24 08:18
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>>>Ух ты еще и делегат пришпандорил!

_FR>>Это не делегат, а обычная локальная функция.
S>То что выше это локальная функция, которую я предложил вместо.

Точно, виноват, у топикстартера действительно делегат вместо функции.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Oberon vs C#
От: _FRED_ Черногория
Дата: 15.04.24 08:36
Оценка: +1
Здравствуйте, syrompe, Вы писали:

S>Вот такой код работает на 12 секунд быстрее вашего (21с против 33с) на моей машине:


Попробуйте ещё ссылки использовать:
S>for (var j = 0; j < a.Length - 1 - i; j++)
  {
    ref double current = ref a[j];
    ref double next = ref a[j + 1];
S>    if (next < current)
S>    {
S>        (next, current) = (current, next);
S>    }
  }
Help will always be given at Hogwarts to those who ask for it.
Re[6]: Oberon vs C#
От: Разраб  
Дата: 15.04.24 11:31
Оценка:
Здравствуйте, Serginio1, Вы писали:


S>https://rsdn.org/forum/flame.comp/8730466.1
Автор: syrompe
Дата: 13.04.24

S>https://rsdn.org/forum/flame.comp/8730474.1
Автор: syrompe
Дата: 13.04.24

S>говорит, что разница есть

специально замерил сегодня под виндой
локальную функцию
делегат
без фукции(с аот и без)
по среднему никакой разницы между 1 и 2, небольшое ускорение во 3 но без заметной разницы с аот.
инициализация порядка 0,010-0,020 мс
т.е. все время уходит на сортировку.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[7]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 15.04.24 12:59
Оценка:
Здравствуйте, Разраб, Вы писали:

S>>https://rsdn.org/forum/flame.comp/8730466.1
Автор: syrompe
Дата: 13.04.24

S>>https://rsdn.org/forum/flame.comp/8730474.1
Автор: syrompe
Дата: 13.04.24

S>>говорит, что разница есть

Р>специально замерил сегодня под виндой

Р>локальную функцию
Р>делегат
Р>без фукции(с аот и без)
Р>по среднему никакой разницы между 1 и 2, небольшое ускорение во 3 но без заметной разницы с аот.
Р>инициализация порядка 0,010-0,020 мс
Р>т.е. все время уходит на сортировку.
Странно, что разное время у тебя и syrompe разные результаты.

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

Странно, что нет разницы между делегатом и локальной функцией. То есть основное время уходит на сравнение.
А твой REAL точно соответствует double?
А атрибут не влияет?
  [MethodImpl(MethodImplOptions.AggressiveInlining)]// можно попробовать. Хотя и так должен быть инлайнинг
   void Swap(ref double x, ref double y)
и солнце б утром не вставало, когда бы не было меня
Re[7]: Oberon vs C#
От: rudzuk  
Дата: 15.04.24 14:19
Оценка:
Здравствуйте, Разраб, Вы писали:

Р> т.е. все время уходит на сортировку.


Покажи, как ты вообще этот обероновский код собрал. Я поставил восток, но при попытке собрать получаю ошибку в первой же строке. Видимо делаю что-то не так.
avalon/3.0.2
Re[8]: Oberon vs C#
От: Разраб  
Дата: 21.04.24 12:39
Оценка: +1
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Разраб, Вы писали:


Р>> т.е. все время уходит на сортировку.


R>Покажи, как ты вообще этот обероновский код собрал. Я поставил восток, но при попытке собрать получаю ошибку в первой же строке. Видимо делаю что-то не так.


из рабочего каталога(где лежит модуль)
vostok to-bin <Имя главного модуля> . -m .

(-m — это где искать модули, первая точка куда бинарь положить)

Что еще удивительно, так это то что сам алгоритм на обероне
выглядит наиболее просто и вызывает меньше всего сомнений
особенно если сравнивать с зиг который позиционирует себя как дзен.
Отсутствие в нем for i to m заставило меня совершить ошибку при работе со счетчиком вложенного цикла.
ближе всего синтаксически оказался F#
хотя и он неожиданно сломался на выводе типов(obj вместо double) ))
В защиту dotnet могу сказать, что питон оказался невероятно медленным в этой задаче
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[8]: Oberon vs C#
От: Разраб  
Дата: 21.04.24 12:44
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> А твой REAL точно соответствует double?

оттранслировал в си. да.
S> А атрибут не влияет?
заметной нет. Я тестил только релизы и только в консоли.
Енесколько раз запускал, т.к. все время что-то параллельно мешает.
Но среднее все время стабильно.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[9]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.04.24 13:38
Оценка:
Здравствуйте, Разраб, Вы писали:

S>> А твой REAL точно соответствует double?

Р>оттранслировал в си. да.
S>> А атрибут не влияет?
Р>заметной нет. Я тестил только релизы и только в консоли.
Р>Енесколько раз запускал, т.к. все время что-то параллельно мешает.
Р>Но среднее все время стабильно.
Вот интересно тогда ассемблерный код сравнить AOT и сишный
и солнце б утром не вставало, когда бы не было меня
Re[9]: Oberon vs C#
От: rudzuk  
Дата: 21.04.24 14:02
Оценка:
Здравствуйте, Разраб, Вы писали:

Р> из рабочего каталога(где лежит модуль)

Р> vostok to-bin <Имя главного модуля> . -m .

Все так и делал, получаю (исходник — твой Hello.mod; vostok --version: ost 0.0.10.dev):
0) Expected statement 1 : 1
avalon/3.0.2
Re[10]: Oberon vs C#
От: Разраб  
Дата: 22.04.24 00:18
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Разраб, Вы писали:


Р>> из рабочего каталога(где лежит модуль)

Р>> vostok to-bin <Имя главного модуля> . -m .

R>Все так и делал, получаю (исходник — твой Hello.mod; vostok --version: ost 0.0.10.dev):

R>
0) Expected statement 1 : 1


Скачал последний релиз 9-10(исходники)
собрал бутстрап(init)
потом Build
в папке vostok создал папке bb(положил в нее Hello.mod, BubblSort.mod)
из родительской
result/ost run to-bin Hello bb/hello -infr . -m bb
xubuntu lts последняя
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Oberon vs C#
От: Разраб  
Дата: 22.04.24 00:19
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Вот интересно тогда ассемблерный код сравнить AOT и сишный

хотел, но sharplab.io заругался да и не силен я в асм
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[11]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.04.24 07:18
Оценка:
Здравствуйте, Разраб, Вы писали:


S>> Вот интересно тогда ассемблерный код сравнить AOT и сишный

Р>хотел, но sharplab.io заругался да и не силен я в асм
Не там надо дисассемблировать. А народ здесь поможет!
«Хакер»: Учимся анализировать программы для x86 с нуля
и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.