Oberon vs C#
От: Разраб  
Дата: 12.04.24 02:00
Оценка:
Дело было вечером, делать было нечего.
Наткнулся на компилятор восток, работал в убунте
стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod
сбинарил. размер массива 100К.
потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.
восток выполняется меньше 3 сек.
дотнет более 10. ну я бы понял, если бы 1-2 сек. но в 3 раза!
Даже zig в режиме fast оказался чуточку медленнее(а в нем даже сборщика мусора нет).
Вообщем, я озадачен. Есть предположения почему так?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Oberon vs C#
От: rudzuk  
Дата: 12.04.24 07:14
Оценка:
Здравствуйте, Разраб, Вы писали:

Р> сбинарил. размер массива 100К.

...
Р> Вообщем, я озадачен. Есть предположения почему так?

А массив как инициализируется?
avalon/3.0.2
Re: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.04.24 07:24
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Дело было вечером, делать было нечего.

Р>Наткнулся на компилятор восток, работал в убунте
Р>стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod
Р>сбинарил. размер массива 100К.
Р>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.

Собрал Native AOT?
и солнце б утром не вставало, когда бы не было меня
Re: Oberon vs C#
От: Darky Darkov Россия  
Дата: 12.04.24 07:46
Оценка:
Здравствуйте, Разраб, Вы писали:


Р>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.

А покажите исходники
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 07:58
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


Р>> сбинарил. размер массива 100К.

R>...
Р>> Вообщем, я озадачен. Есть предположения почему так?

R>А массив как инициализируется?

MODULE Hello;
IMPORT 
    Out, 
    BubbleSort;

CONST 
    hello = "HELLO";
    m = 100000;
VAR 
    a : ARRAY m OF REAL;
    i : INTEGER;
    e : REAL;
BEGIN
    
    e := FLT(m);
    
    FOR i:=0 TO m - 1 DO
        a [ m  - i - 1 ] := e;
        e := e - 1.0;
    END;

    BubbleSort.Sort(a);
    
    Out.String(hello); 
    Out.Ln;
    
END Hello.


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;
}

Sort(a);

Console.WriteLine("HeLLO");

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]);
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 07:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


Р>>Дело было вечером, делать было нечего.

Р>>Наткнулся на компилятор восток, работал в убунте
Р>>стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod
Р>>сбинарил. размер массива 100К.
Р>>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.

S> Собрал Native AOT?

перепроверил, под аот стабильно на 3,5 сек медленнее. еще страньше
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 08:00
Оценка:
Здравствуйте, Darky Darkov, Вы писали:

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



Р>>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.

DD>А покажите исходники
чуть выше шарп, а еще попробовал на F#, вот он вообще не завершается. тут вообще чертовщина))
let len = Array.length

let swap<'a> (arr: array<'a>, i, j) =
    let t = arr[i]
    arr[i] <- arr[j]
    arr[j] <- t

let sort arr =
    let ln = len(arr)
    for i = 0 to ln - 1 do
        for j = 0 to ln - 2 - i do
            if arr[j + 1] < arr[j] then
                swap (arr, j + 1, j)


let max = 100_000
let value = float(max)
let arr = Array.init max (fun i -> value - float (i))

sort arr
printfn "HELLO"
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.04.24 08:20
Оценка:
Здравствуйте, Разраб, Вы писали:



Р>
Р>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;
Р>}

[cs]
for (var i = 0; i < a.Length; i++)
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.04.2024 8:22 Serginio1 . Предыдущая версия . Еще …
Отредактировано 12.04.2024 8:21 Serginio1 . Предыдущая версия .
Re[3]: Oberon vs C#
От: syrompe  
Дата: 12.04.24 08:24
Оценка: +2
Ну неплохо было бы код метода BubbleSort.Sort(a) посмотреть и убедиться что они таки идентичны.

По реализации C#: насколько помню, в классическом пузырьке нужно во внешнем цикле постоянно чекать что ни одного swap не произошло и тогда завершаться.

Ну т.е. у пузырька худший случай O(N^2), а если повезет, то выпадет O(N). Ваш же код гарантированно N^2 молотит.
Отредактировано 12.04.2024 8:26 syrompe . Предыдущая версия . Еще …
Отредактировано 12.04.2024 8:26 syrompe . Предыдущая версия .
Re: Oberon vs C#
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.04.24 08:44
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>Вообщем, я озадачен. Есть предположения почему так?


Неправильно мерил?
Re: Oberon vs C#
От: rudzuk  
Дата: 12.04.24 09:16
Оценка:
Здравствуйте, Разраб, Вы писали:

Р> Дело было вечером, делать было нечего.

Р> Наткнулся на компилятор восток, работал в убунте

Это же не компилятор, а транслятор

Р> стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod

Р> сбинарил.

В какой язык транслировал и какой код получился на выходе? Чем компилировал? Просто интересно.
avalon/3.0.2
Re: Oberon vs C#
От: L_G Россия  
Дата: 12.04.24 09:19
Оценка:
Р>Вообщем, я озадачен. Есть предположения почему так?

не вижу в коде замера времени. ты вместе с запуском и завершением процесса мерил, что ли?
замерь строго вызов метода Sort(), причем как минимум второго вызова (при первом может работать JIT) и надежнее несколько замеров в цикле сделать
Каша в голове — пища для ума (с)
Отредактировано 12.04.2024 9:23 L_G . Предыдущая версия . Еще …
Отредактировано 12.04.2024 9:22 L_G . Предыдущая версия .
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 11:07
Оценка:
Здравствуйте, Darky Darkov, Вы писали:

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



Р>>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.

DD>А покажите исходники
зиг:
const std = @import("std");
const print = std.debug.print;

pub fn main() !void {
    const m = 100000;
    var arr: [m]f64 = undefined;
    var s: f64 = @floatCast(m);
    for (&arr) |*elem| {
        elem.* = s;
        s = s - 1.0;
    }
    //display(&arr);
    sort(&arr);
    print("HELLO\n", .{});
    // display(&arr);
}

fn swap(a: *f64, b: *f64) void {
    const t: f64 = a.*;
    a.* = b.*;
    b.* = t;
}

// fn display(a: []f64) void {
//     for (a) |value| {
//         print("{}\n", .{value});
//     }
// }

fn sort(a: []f64) void {
    var i: usize = 0;
    var j: usize = 0;
    while (i < a.len) : (i += 1) {
        j = 0;
        while (j < (a.len - 1 - i)) : (j += 1) {
            if (a[j + 1] < a[j]) {
                swap(&a[j + 1], &a[j]);
            }
        }
    }
}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 11:09
Оценка:
Здравствуйте, syrompe, Вы писали:

S>Ну неплохо было бы код метода BubbleSort.Sort(a) посмотреть и убедиться что они таки идентичны.


S>По реализации C#: насколько помню, в классическом пузырьке нужно во внешнем цикле постоянно чекать что ни одного swap не произошло и тогда завершаться.


S>Ну т.е. у пузырька худший случай O(N^2), а если повезет, то выпадет O(N). Ваш же код гарантированно N^2 молотит.


оригинальный Код в стартовом сообщении по ссылке,
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 11:09
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


Р>>Вообщем, я озадачен. Есть предположения почему так?


G>Неправильно мерил?

/bin/time app
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 11:10
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


Р>> Дело было вечером, делать было нечего.

Р>> Наткнулся на компилятор восток, работал в убунте

R>Это же не компилятор, а транслятор


Р>> стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod

Р>> сбинарил.

R>В какой язык транслировал и какой код получился на выходе? Чем компилировал? Просто интересно.

ставил из снап компилил опцией to-bin думаю clang
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Oberon vs C#
От: Разраб  
Дата: 12.04.24 11:11
Оценка:
Здравствуйте, L_G, Вы писали:

Р>>Вообщем, я озадачен. Есть предположения почему так?


L_G>не вижу в коде замера времени. ты вместе с запуском и завершением процесса мерил, что ли?

L_G>замерь строго вызов метода Sort(), причем как минимум второго вызова (при первом может работать JIT) и надежнее несколько замеров в цикле сделать

утилитой /bin/time
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Oberon vs C#
От: _FRED_ Черногория
Дата: 12.04.24 11:52
Оценка: +1
Здравствуйте, Разраб, Вы писали:

Р>>>Вообщем, я озадачен. Есть предположения почему так?

G>>Неправильно мерил?
Р>/bin/time app

То есть вы и время инициализации данных заодно и замерили? В дотнете воспользуйтесь стопвотчем и выведите на консоль результат.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Oberon vs C#
От: rudzuk  
Дата: 12.04.24 12:20
Оценка: +2
Здравствуйте, _FRED_, Вы писали:

FRE> Р>/bin/time app


FRE> То есть вы и время инициализации данных заодно и замерили? В дотнете воспользуйтесь стопвотчем и выведите на консоль результат.


Да плевать, там той инициализации...
avalon/3.0.2
Re[3]: Oberon vs C#
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.04.24 12:51
Оценка:
Здравствуйте, Разраб, Вы писали:


Р>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]);
Р>}
Р>[/cs]

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

Попробуй
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])
                Swap(ref a[j + 1], ref a[j]);

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


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

Там тесты лямбд и локальных функций смотри TestLambda
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.04.2024 17:53 Serginio1 . Предыдущая версия . Еще …
Отредактировано 12.04.2024 17:51 Serginio1 . Предыдущая версия .
Отредактировано 12.04.2024 14:21 Serginio1 . Предыдущая версия .
Отредактировано 12.04.2024 14:21 Serginio1 . Предыдущая версия .
Отредактировано 12.04.2024 12:56 Serginio1 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.