Здравствуйте, 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.
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]);
}
Окей, принимается. В исходном варианте такой же 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;
}
}
S>Попробуй S>[cs] S>static void Sort(double[] a) S>{
Исходный вариант автора в релизе — 9с, в дебаге — 30с
Ваш вариант: в релизе — 5,5с, в дебаге 26с
Вариант совсем без отдельного метода Swap: в релизе — 5,5с, в дебаге 21.5
Здравствуйте, Serginio1, Вы писали:
S>Ух ты еще и делегат пришпандорил!
S>Попробуй
Тоже самое, была мысль что раз после сортировки нигде не пользуется массив, то и сортировки нет,
заменил вывод "hello" на a[0]. не помогло.
Мерял под виндой
(Measure-Command { dotnet run -c release | Out-Default }).ToString()
Здравствуйте, Разраб, Вы писали:
S>>Ух ты еще и делегат пришпандорил!
S>>Попробуй Р>Тоже самое, была мысль что раз после сортировки нигде не пользуется массив, то и сортировки нет, Р>заменил вывод "hello" на a[0]. не помогло. Р>Мерял под виндой Р>
Р>(Measure-Command { dotnet run -c release | Out-Default }).ToString()
Р>
Исходный вариант автора в релизе — 9с, в дебаге — 30с
Ваш вариант: в релизе — 5,5с, в дебаге 26с
Вариант совсем без отдельного метода Swap: в релизе — 5,5с, в дебаге 21.5
То есть Swap как локальная функция инлайнится
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Разраб, Вы писали:
Р>чуть выше шарп, а еще попробовал на F#, вот он вообще не завершается. тут вообще чертовщина)) Р>
Р>let sort arr =
Р>
Оказалось, всего-навсего надо было:
let sort (arr: float array) = ()
Теперь F# всего на 1 секунду медленней C#
не так уж и плохо, странно, что вывод типа, получился неверный, даже если вызвать как arr |> sort,
такая запись обычно помогает с выводом типа. Возможно пофиксять в 9ке. Запостил на форуме сообщества.
Я однажды писал на С++ прогу, в которой использовал стандартный дек.
Пишу, никого не трогаю, примуса починяю: сначала в Студии, потом в Кодеблоксе на винде.
Стандартный С++.
Оптимизация, все дела.
И тут выясняется, что прога из-под mingw работает в 5 (ПЯТЬ) раз быстрее из-под-студийной.
В релизе!
Что за хрень?!
Всегда было не более 10-12-15%!
А тут в 5 раз!
Я в конце-концов задал вопрос на РСДН
Один перец, имевший аналогичный опыт ответил, что дек в STL из-под Студии реализован через задницу.
Типа используй вектор.
Я, конечно так и поступил
И получил свои стандартные 10-12-15%.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Serginio1, Вы писали:
S>>>Ух ты еще и делегат пришпандорил! _FR>>Это не делегат, а обычная локальная функция. S>То что выше это локальная функция, которую я предложил вместо.
Точно, виноват, у топикстартера действительно делегат вместо функции.
Help will always be given at Hogwarts to those who ask for it.
специально замерил сегодня под виндой
локальную функцию
делегат
без фукции(с аот и без)
по среднему никакой разницы между 1 и 2, небольшое ускорение во 3 но без заметной разницы с аот.
инициализация порядка 0,010-0,020 мс
т.е. все время уходит на сортировку.
S>>говорит, что разница есть
Р>специально замерил сегодня под виндой Р>локальную функцию Р>делегат Р>без фукции(с аот и без) Р>по среднему никакой разницы между 1 и 2, небольшое ускорение во 3 но без заметной разницы с аот. Р>инициализация порядка 0,010-0,020 мс Р>т.е. все время уходит на сортировку.
Странно, что разное время у тебя и syrompe разные результаты.
Такое возможно если данные упорядоченные изначально.
А они в твоем тесте упорядочены, но обратную сторону, то есть должна постоянно вызываться Swap
Странно, что нет разницы между делегатом и локальной функцией. То есть основное время уходит на сравнение.
А твой REAL точно соответствует double?
А атрибут не влияет?
[MethodImpl(MethodImplOptions.AggressiveInlining)]// можно попробовать. Хотя и так должен быть инлайнингvoid Swap(ref double x, ref double y)
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Разраб, Вы писали:
Р> т.е. все время уходит на сортировку.
Покажи, как ты вообще этот обероновский код собрал. Я поставил восток, но при попытке собрать получаю ошибку в первой же строке. Видимо делаю что-то не так.
Здравствуйте, rudzuk, Вы писали:
R>Здравствуйте, Разраб, Вы писали:
Р>> т.е. все время уходит на сортировку.
R>Покажи, как ты вообще этот обероновский код собрал. Я поставил восток, но при попытке собрать получаю ошибку в первой же строке. Видимо делаю что-то не так.
из рабочего каталога(где лежит модуль)
vostok to-bin <Имя главного модуля> . -m .
(-m — это где искать модули, первая точка куда бинарь положить)
Что еще удивительно, так это то что сам алгоритм на обероне
выглядит наиболее просто и вызывает меньше всего сомнений
особенно если сравнивать с зиг который позиционирует себя как дзен.
Отсутствие в нем for i to m заставило меня совершить ошибку при работе со счетчиком вложенного цикла.
ближе всего синтаксически оказался F#
хотя и он неожиданно сломался на выводе типов(obj вместо double) ))
В защиту dotnet могу сказать, что питон оказался невероятно медленным в этой задаче
Здравствуйте, Serginio1, Вы писали:
S> А твой REAL точно соответствует double?
оттранслировал в си. да. S> А атрибут не влияет?
заметной нет. Я тестил только релизы и только в консоли.
Енесколько раз запускал, т.к. все время что-то параллельно мешает.
Но среднее все время стабильно.
Здравствуйте, Разраб, Вы писали:
S>> А твой REAL точно соответствует double? Р>оттранслировал в си. да. S>> А атрибут не влияет? Р>заметной нет. Я тестил только релизы и только в консоли. Р>Енесколько раз запускал, т.к. все время что-то параллельно мешает. Р>Но среднее все время стабильно.
Вот интересно тогда ассемблерный код сравнить AOT и сишный
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, 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 последняя
Здравствуйте, Serginio1, Вы писали:
S> Вот интересно тогда ассемблерный код сравнить AOT и сишный
хотел, но sharplab.io заругался да и не силен я в асм
S>> Вот интересно тогда ассемблерный код сравнить AOT и сишный Р>хотел, но sharplab.io заругался да и не силен я в асм
Не там надо дисассемблировать. А народ здесь поможет! «Хакер»: Учимся анализировать программы для x86 с нуля
и солнце б утром не вставало, когда бы не было меня