Дело было вечером, делать было нечего.
Наткнулся на компилятор восток, работал в убунте
стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod
сбинарил. размер массива 100К.
потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.
восток выполняется меньше 3 сек.
дотнет более 10. ну я бы понял, если бы 1-2 сек. но в 3 раза!
Даже zig в режиме fast оказался чуточку медленнее(а в нем даже сборщика мусора нет).
Вообщем, я озадачен. Есть предположения почему так?
Здравствуйте, Разраб, Вы писали:
Р>Дело было вечером, делать было нечего. Р>Наткнулся на компилятор восток, работал в убунте Р>стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod Р>сбинарил. размер массива 100К. Р>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.
Собрал Native AOT?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, 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]);
}
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Разраб, Вы писали:
Р>>Дело было вечером, делать было нечего. Р>>Наткнулся на компилятор восток, работал в убунте Р>>стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod Р>>сбинарил. размер массива 100К. Р>>потом стараясь максимально идентично сделал в NET8 последней, собрал релиз.
S> Собрал Native AOT?
перепроверил, под аот стабильно на 3,5 сек медленнее. еще страньше
Здравствуйте, 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"
Р>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++)
и солнце б утром не вставало, когда бы не было меня
Ну неплохо было бы код метода BubbleSort.Sort(a) посмотреть и убедиться что они таки идентичны.
По реализации C#: насколько помню, в классическом пузырьке нужно во внешнем цикле постоянно чекать что ни одного swap не произошло и тогда завершаться.
Ну т.е. у пузырька худший случай O(N^2), а если повезет, то выпадет O(N). Ваш же код гарантированно N^2 молотит.
Р>Вообщем, я озадачен. Есть предположения почему так?
не вижу в коде замера времени. ты вместе с запуском и завершением процесса мерил, что ли?
замерь строго вызов метода Sort(), причем как минимум второго вызова (при первом может работать JIT) и надежнее несколько замеров в цикле сделать
Здравствуйте, syrompe, Вы писали:
S>Ну неплохо было бы код метода BubbleSort.Sort(a) посмотреть и убедиться что они таки идентичны.
S>По реализации C#: насколько помню, в классическом пузырьке нужно во внешнем цикле постоянно чекать что ни одного swap не произошло и тогда завершаться.
S>Ну т.е. у пузырька худший случай O(N^2), а если повезет, то выпадет O(N). Ваш же код гарантированно N^2 молотит.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Разраб, Вы писали:
Р>>Вообщем, я озадачен. Есть предположения почему так?
G>Неправильно мерил?
/bin/time app
Здравствуйте, rudzuk, Вы писали:
R>Здравствуйте, Разраб, Вы писали:
Р>> Дело было вечером, делать было нечего. Р>> Наткнулся на компилятор восток, работал в убунте
R>Это же не компилятор, а транслятор
Р>> стало интересно, взял https://github.com/Vostok-space/vostok/blob/master/example/BubbleSort.mod Р>> сбинарил.
R>В какой язык транслировал и какой код получился на выходе? Чем компилировал? Просто интересно.
ставил из снап компилил опцией to-bin думаю clang
Здравствуйте, L_G, Вы писали:
Р>>Вообщем, я озадачен. Есть предположения почему так?
L_G>не вижу в коде замера времени. ты вместе с запуском и завершением процесса мерил, что ли? L_G>замерь строго вызов метода Sort(), причем как минимум второго вызова (при первом может работать JIT) и надежнее несколько замеров в цикле сделать
Здравствуйте, _FRED_, Вы писали:
FRE> Р>/bin/time app
FRE> То есть вы и время инициализации данных заодно и замерили? В дотнете воспользуйтесь стопвотчем и выведите на консоль результат.
Р>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;
}
}