Re[31]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 21:47
Оценка: -3
Здравствуйте, Ночной Смотрящий, Вы писали:

_>> Именно это и надо для теста.

НС>Нет, для теста надо идентичные алгоритмы.

Для теста нужны идентичные данные на входе и на выходе. А в середине крутись как можешь. Это и будет объективное сравнение языков, потому что так оно происходит в реальности.
Re[17]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 21:48
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

A>>Нафиг не надо. Ты там написал "А давай ка посмотрим на более близкий к реальности код?", но кто будет в реальности писать свою сортировку, если однострочный Array.Sort быстрее. Быстрее работает, быстрее писать, быстрее понимать, легче поддерживать.

CM>Спасибо, Кэп. Вопрос в том, что внутри реализация может быть сильно разной.

Неважно. Если в JS нет указателей, к примеру, это его проблемы. Ты ведь не будешь писать код на C#, постоянно вспоминая, что в JS нет указателей? Если в JS нет quick sort (может и есть, я не знаю), то пусть тот, кто пишет на JS, сам делает свою реализацию.
Отредактировано 18.09.2017 23:38 alexzzzz . Предыдущая версия . Еще …
Отредактировано 18.09.2017 21:50 alexzzzz . Предыдущая версия .
Re[17]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 21:48
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Там писать то https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0

S> При этом внутри Array.Sort там была отдельная реализация для примитивных типов.
S>При этом мы оцениваем именно скорость Jit ров выполнения, а не конкретной реализации, которая может быть нативной на C++. Просто копироваться массивы

На jit-компиляцию уходит пара миллисекунд, пренебрежимо мало на фоне времени выполнения самого теста. Я даже предварительный прогрев делать не стал.
Re[16]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 21:49
Оценка:
Здравствуйте, Ikemefula, Вы писали:

A>>Самодельный quick sort непонятно зачем. Стандартный Array.Sort работает немного быстрее.

I>А мы сравниваем языки по перформансу, а не либы.

Тип System.Array в C# есть всегда. Входит в CLR наравне с System.Int32 или System.String. Мы же не станем велосипедить ещё и конкатенацию строк?

A>>А с такой реализацией TestClass:

A>>
class TestClass
A>>{
A>>    private Guid idGuid = Guid.NewGuid();
A>>    private Guid valueGuid = Guid.NewGuid();

A>>    public string Id => Format(idGuid);
A>>    public string Value => Format(valueGuid);
A>>}

A>>инициализация массива минимум в 3 раза быстрее начальной, а его сортировка минимум в 11 раз быстрее. Общее ускорение по сравнению с оригинальным кодом — более чем в 7 раз.
I>Я чет не понял, ты собираешься конвертить в строку при каждом доступе к свойству ? И зачем тебе гуид хранить, что бы памяти больше съесть ?

1. Я не вижу в коде никого, кому были бы нужны строковые представления гуидов. Ни одного их потребителя. Разве что TestClass.ToString, но и тот нигде не вызывается.
2. Guid — value-тип длинной 16 байт. В виде строки он занимает (навскидку) 32*2+6 байт + оверхед + 4/8 байт под ссылку на эту строку. Гуиды экономнее аналогичных строк раз в пять.

Я бы TestClass вообще в TestStruct переделал. ТЗ нет, JS нам не указ, никто так делать не запрещает, памяти расходуется ещё меньше, локальность данных лучше, скорость инициализации и сортировки ещё выше.

I>Выложи полную версию кода, только напиши на какой версии фремворка/шарпа надо сранивать. У меня, скажем, только 4.0 есть


Код и бинарники: https://bitbucket.org/alexzzzz/perftest
Кого Mercurial пугает, ссылка на zip: https://bitbucket.org/alexzzzz/perftest/downloads/
Framework 4.0, C# 6.0

Сейчас перетестил поаккуратнее, получилось, что оптимизированная версия быстрее оригинальной в 11 раз, а оптимизированная со структурами — в 16 раз.

Оригинальная версия на C#:
Initialization: 1710 ms, Sorting: 5464 ms, Total: 7174 ms
Initialization: 1847 ms, Sorting: 5162 ms, Total: 7009 ms
Initialization: 1976 ms, Sorting: 4937 ms, Total: 6913 ms
Initialization: 1729 ms, Sorting: 5275 ms, Total: 7004 ms
Initialization: 1988 ms, Sorting: 5031 ms, Total: 7019 ms
GC: 360 131 17 <-- количество сборок мусора по поколениям 0, 1, 2

Оптимизированная версия C#:
Initialization: 232 ms, Sorting: 398 ms, Total: 630 ms
Initialization: 265 ms, Sorting: 403 ms, Total: 668 ms
Initialization: 321 ms, Sorting: 394 ms, Total: 715 ms
Initialization: 271 ms, Sorting: 395 ms, Total: 666 ms
Initialization: 279 ms, Sorting: 404 ms, Total: 683 ms
GC: 46 24 8

Оптимизированная версия C# с заменой TestClass на TestStruct:
Initialization: 184 ms, Sorting: 256 ms, Total: 440 ms
Initialization: 185 ms, Sorting: 251 ms, Total: 436 ms
Initialization: 185 ms, Sorting: 248 ms, Total: 433 ms
Initialization: 185 ms, Sorting: 249 ms, Total: 434 ms
Initialization: 185 ms, Sorting: 247 ms, Total: 432 ms
GC: 4 4 4

I>Предлагаешь запилить рей-трейсинг алгоритм или обработку звука ? Не многовато ли для форумной беседы ?


Предлагаю запилить что-нибудь менее абстрактное, более практичное и с понятными конкретными требованиями. Например:

1. Считать png-картинку размера 1024x1024, перевести в чёрно-белый, заблюрить, повернуть на 90 градусов по часовой стрелке, сохранить обратно в png рядом с исходным.
2. Считать png-картинку размера 1024x1024 с лабиринтом (черные пикселы — препятствия, белые — проходимые). Найти кратчайший путь из левого нижнего угла в правый верхний. Результат сохранить в текстовый файл в виде количества узлов пути и списка их координат
N
(x1, y1)
(x2, y2)
...
(xN, yN)
Отредактировано 18.09.2017 23:38 alexzzzz . Предыдущая версия . Еще …
Отредактировано 18.09.2017 22:01 alexzzzz . Предыдущая версия .
Отредактировано 18.09.2017 21:54 alexzzzz . Предыдущая версия .
Отредактировано 18.09.2017 21:53 alexzzzz . Предыдущая версия .
Re[31]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 18.09.17 21:50
Оценка: +1 -1 :)
Здравствуйте, CoderMonkey, Вы писали:

_>>Тебе вроде как уже несколько человек сказали, что при тестах производительности надо выбирать самую быструю реализацию на данном языке, а не самую медленную. А то иначе можно доказать что и bash быстрее ассемблера x64...

CM>Сравнивать надо, по возможности, аналоги, а не выбирать "что с чем мне выгоднее сравнить". Иначе грош цена таким сравнениям.

Нужно сравнивать не аналоги и не "что с чем выгодно", а вполне конкретную вещь: наиболее эффективное решение на данном языке для конкретной, точно сформулированной задачи. Т.е. вот твоя постановка задачи (но не реализация!) с quicksort для некого однозначно определённого (два строковых id поля фиксированной ширины) объекта — это в принципе очень даже не плохой пример. А вот как его будут реализовывать на каждом конкретном языке — это уже личное дело данного языка.

_>>Вообще то ничего не обнаружилось и никакого мухлежа естественно не было. Но ты знаешь, я согласен даже считать что проигрыш C# всего в 3 раза относительно аналогичного JS кода, чтобы не препираться лишний раз. Всё равно итоговая ситуация получается крайне забавной. )))

CM>Обнаружилось. Ты взял минимальный возможный замер, а не среднее значение.

Оу, т.е. ты кроме всего прочего ещё и ничего не понимаешь в тестах производительности... Среднее значит, понятненько...
Re[31]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 18.09.17 21:56
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

_>>Что значит хуже?

НС>То и значит что сравнить ты пытаешься разные алгоритмы.
_>> Как раз лучше, т.к. быстрее при тех же самых входных/выходных данных.
НС>Это называется мухлеж.
_>> Именно это и надо для теста.
НС>Нет, для теста надо идентичные алгоритмы.

Я правильно тебя понял, что в отличие от CoderMonkey ты считаешь, что C# пример в конце этого http://rsdn.org/forum/flame.comp/6905867.1
Автор: alex_public
Дата: 16.09.17
сообщения не эквивалентен JS коду из того же сообщения? И если это именно так, то тебя конечно же не затруднит продемонстрировать уже полностью эквивалентный тому же самому JS коду вариант на C#? А мы тогда все вместе его потестируем и наконец сделаем выводы, с которыми уже никто не будет спорить (надеюсь)...
Re[32]: Реальная производительность WebAssembly?
От: Ночной Смотрящий Россия  
Дата: 18.09.17 22:04
Оценка:
Здравствуйте, alex_public, Вы писали:

_> И если это именно так, то тебя конечно же не затруднит продемонстрировать уже полностью эквивалентный тому же самому JS коду вариант на C#?


Конечно же затруднит. Я сейчас в отпуске в южных широтах и код тут писать, корячась на ноуте, не собираюсь.
Re[18]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 22:43
Оценка:
[del]
Отредактировано 18.09.2017 23:34 alexzzzz . Предыдущая версия . Еще …
Отредактировано 18.09.2017 23:13 alexzzzz . Предыдущая версия .
Отредактировано 18.09.2017 23:05 alexzzzz . Предыдущая версия .
Re[19]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 18.09.17 23:16
Оценка:
  JS
var now = require("performance-now")
var padStart = require("pad-start")

function CreateId()
{
    return padStart(Math.floor(Math.random() * 1e8).toString(), 10, '0');
}

class TestClass
{
    constructor() {
        this.Id = CreateId();
        this.Value = CreateId();
    }
}
        
for (var t = 0; t < 5; t++)
{
    var startInit = now();
    var vals = [];
    for (var i = 0; i < 1000 * 1000; i++)
    {
        vals.push(new TestClass());
    }
    var endInit = now();
    
    console.log("Init: " + (endInit - startInit) + " msecs");
}

Init: 675.224758 msecs
Init: 580.368585 msecs
Init: 627.1724730000001 msecs
Init: 642.6952870000002 msecs
Init: 572.5845920000002 msecs

  C#
using System;
using System.Diagnostics;

namespace QuickSort
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var watch = new Stopwatch();
            for (int i = 0; i < 5; i++)
            {
                watch.Restart();
                var vals = new TestClass[1000 * 1000];
                for (int j = 0; j < vals.Length; j++)
                {
                    vals[j] = new TestClass();
                }
                watch.Stop();
                Console.WriteLine($"Total: {watch.ElapsedMilliseconds} ms");
            }
            Console.WriteLine($"GC: {GC.CollectionCount(0)} {GC.CollectionCount(1)} {GC.CollectionCount(2)}");
            Console.ReadLine();
        }
    }

    internal class TestClass
    {
        public string Id = CreateGuid();
        public string Value = CreateGuid();
        private static readonly Random gen = new Random();

        private static string CreateGuid() => gen.Next(100000000).ToString("0000000000");
    }
}

Total: 567 ms
Total: 652 ms
Total: 641 ms
Total: 606 ms
Total: 638 ms
GC: 114 60 15

Одинаково.

В C# в районе 40% времени приходится на стандартный рандом и 50% на ToString с параметром.
Отредактировано 19.09.2017 0:34 alexzzzz . Предыдущая версия . Еще …
Отредактировано 19.09.2017 0:32 alexzzzz (Чуть упростил) . Предыдущая версия .
Отредактировано 18.09.2017 23:33 alexzzzz . Предыдущая версия .
Отредактировано 18.09.2017 23:22 alexzzzz (Ещё немного ускорил) . Предыдущая версия .
Re[33]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 19.09.17 00:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

_>> И если это именно так, то тебя конечно же не затруднит продемонстрировать уже полностью эквивалентный тому же самому JS коду вариант на C#?

НС>Конечно же затруднит. Я сейчас в отпуске в южных широтах и код тут писать, корячась на ноуте, не собираюсь.

Ну да, ну да. )))

Кстати, я же так понял, что у тебя к моему варианту C# кода ровно одна претензия — в том что использованная там функция ToString() вроде как не эквивалентна toString() из JS, т.к. использует системную локаль (хотя куда там расходовать ресурсы на целых числах без группировки не очень понятно, ну да ладно, поверим тебе на слово). Соответственно тебе достаточно подсказать какую именно .net функцию использует правильный программист на C# для написания подобного оптимального кода.
Re[20]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 19.09.17 00:35
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Одинаково.


Подтверждаю. Для данного C# кода и данного JS кода, запущенного через node, у меня очень близкие цифры.

Только вот теперь рекомендую запустить этот же самый JS код в Firefox. Например с помощью такой странички:
  HTML
<!doctype>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Тест</title>
<script>
function CreateId()
{
    return Math.floor(Math.random()*1e8).toString().padStart(10, '0');
}

class TestClass
{
    constructor() {
        this.Id = CreateId();
        this.Value = CreateId();
    }
}
        
function Test()
{
    for (var t = 0; t < 5; t++)
    {
        var startInit = performance.now();
        var vals = [];
        for (var i = 0; i < 1000 * 1000; i++)
        {
            vals.push(new TestClass());
        }
        var endInit = performance.now();
        
        time.innerText+=endInit - startInit+' мс\n';
    }
}
</script>
</head>
<body style="text-align: center">
<button onclick="Test()">Запускаем!</button><br>
<span id=time></span>
</body>
</html>
Re[17]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:15
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Оптимизированная версия C#:


а зачем ты убрал сам алгоритм ? Мы же не сравниваем библиотеки. Вопрос в том, насколько качественный код будет выполняться.

A>Предлагаю запилить что-нибудь менее абстрактное, более практичное и с понятными конкретными требованиями. Например:


Ну раз реальное, практичное, с понятными требованиями, то вот https://www.techempower.com/benchmarks/
Re[19]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:22
Оценка: :)
Здравствуйте, CoderMonkey, Вы писали:

I>>И ты уверен, что на любом рантайме и железе будет тот же результат?


CM>Я уверен, что разница в 2-3 раза, причем в одном случае в большую сторону, а в другой раз в меньшую, и оба раза — в твою пользу, то это крайне странно и подозрительно.


> Вообще стоит читать, что тебе пишут. Проблема в твоём коде, ты сам его сделал тормозом


>Ну а поскольку твой код, который ты запостил, даже не запускается — скорее всего, ты просто наврал.


И как же ты его запустил ?

I>>На чем запускаешь, в браузере каком?


CM>Толстолис v55, 64 бита.


Я так и думал. Хорошо хоть не интернет эксплорер.

Запусти его в хроме последнем, в ноде 6м или 8м. Ты в курсе, что разные рантаймы имеют сильно разный перформанс ? Вот скажем MS Edge вообще 20 секунд сортирует.
Re[37]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:26
Оценка:
Здравствуйте, CoderMonkey, Вы писали:

I>>А ты крут — на коленке честный табличный процессор запилить со всеми фичами, как у гугла.


CM>Тест запилить могу, естественно. Если ты сумеешь убедить меня, что стоит тратить на тебя время. А пилить именно всё приложение — необязательно.


Браво, ты предлагаешь сравнить гуглошит с наколеночной поделкой ?

I>>Собственно сравнение некорректное.


CM>Вот уже и превентивная попытка поюлить началась


Наоборот, ты предлагаешь сравнить память на данные +память на код с памятью толко на данные у экселя.
Re[31]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:32
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

I>>Я как ни зайду на форум, у тебя вечно ктото сливает Ты себя лучше после такого чувствуешь или что ?


НС>При чем тут я? Я на личности не переходил. А вы только этим и занимаетесь, потому что аргументов нет.


Ага, ты точно ни при чем. Когда следующий слив планируешь ?
Re[33]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:34
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

_>> И если это именно так, то тебя конечно же не затруднит продемонстрировать уже полностью эквивалентный тому же самому JS коду вариант на C#?


НС>Конечно же затруднит. Я сейчас в отпуске в южных широтах и код тут писать, корячась на ноуте, не собираюсь.


Собственно, как и всегда. У тебя кроме морализаторства ничего и нет.
Re[20]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:37
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Одинаково.


Да, серьезный тест, практичный и реальный.
Re[17]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 06:44
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>1. Я не вижу в коде никого, кому были бы нужны строковые представления гуидов. Ни одного их потребителя. Разве что TestClass.ToString, но и тот нигде не вызывается.

A>2. Guid — value-тип длинной 16 байт. В виде строки он занимает (навскидку) 32*2+6 байт + оверхед + 4/8 байт под ссылку на эту строку. Гуиды экономнее аналогичных строк раз в пять.

А что, конверсия в строку при каждом доступе ничего не стоит ?
Кроме того, в тесте ведь не важно, что в строке. Главное что бы одинаково в обоих языках и были более-менее случайные символы.

Тест он про сортировку массива объектов, у которых есть строковые свойства. Гуиды там или не гуиды, дело десятое.
Re[20]: Реальная производительность WebAssembly?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.17 07:54
Оценка:
Здравствуйте, alexzzzz, Вы писали:

Лучше взять эти тесты
http://rsdn.org/forum/dotnet/6808392.1
Автор: Serginio1
Дата: 13.06.17

http://rsdn.org/forum/dotnet/6738556.1
Автор: Serginio1
Дата: 28.03.17


Первые практичные, вторые тяжелые для манагед языков.
Заодно посмотреть на разных платформах в том числе и .Net Core 2 и Net Native

Будет всем интересно, осоюенно после выхода .Net Core 2
и солнце б утром не вставало, когда бы не было меня
Re[21]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.09.17 08:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Лучше взять эти тесты


О, круто, вот то что надо! И ты, конечно, портируешь их на JS, дабы мы могли созерцать разницу в перформансе ?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.