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

I>>Будешь смеяться, на на этом фортране до сих пор кучу математики пишут. Думаешь ради чего его оптимизируют ?


A>Я знаю, что на нём пишут. Есть Фортран, у которого «компилер генерит качественный код». Что-то не видно, чтобы народ на нём «смело начинал пилить целую кучу задач».


Знаешь что пишут, но при этом есть сомнения действительно ли пишут ? Область в которой есть Фортран до сих пор никуда не делась. Туда более крутые языки не сильно то и проникают. Особенность отрасли.

I>>Так вроде очевидно что сортировка и эти тесты вобщем сравнивают вещи совершенно разные, но для тебя это почему то вариации на одну и ту же тему


A>Мы говорим каждый о чём-то своём и друг друга не понимаем вообще. Аминь.


Похоже что так, да.
Re[16]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.17 10:40
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, Ikemefula, Вы писали:


I>>Там адъ почище виндовса. В большинстве случаев принято чуть не всю работу делать сторонними либами. Объем кода в депенденсах считается в сотнях мегабайт и больше.


Ops>Так я не хочу побороть этот ад, это вряд ли кому-то по силам, только закешировать его, а то иная утилита только грузится секунду, хотя отрабатывает за десяток миллисекунд.


А кто будет кешировать, товариащи из v8 ? Им это нахрен не нужно, ибо node для них есть помеха для Dart и Go. Товарищи из node ? У них руки коротки.

Возможно, когда webassembly раскочегарится, модули Node можно будет пред-компилировать. Но мне пока это кажется маловероятным сценарием. Во фронтенде такой проблемы нет, только в ноде. Во фронтенде никто не грузит на клиент сотни мегабайт джаваскрипта
Re[20]: Реальная производительность WebAssembly?
От: Ночной Смотрящий Россия  
Дата: 21.09.17 15:43
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>В C# в районе 40% времени приходится на стандартный рандом и 50% на ToString с параметром.


И это после того, как я прямо в этом топике написал, что дотнетный и JS tostring не эквивалентны. Ну чо, меряйте дальше.
Re[21]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.17 16:01
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, alexzzzz, Вы писали:


A>>В C# в районе 40% времени приходится на стандартный рандом и 50% на ToString с параметром.


НС>И это после того, как я прямо в этом топике написал, что дотнетный и JS tostring не эквивалентны. Ну чо, меряйте дальше.


Очень легко добиться эквивалентности. Можно ведь и свою функцию вызвать
Re[22]: Реальная производительность WebAssembly?
От: Ночной Смотрящий Россия  
Дата: 21.09.17 16:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

НС>>И это после того, как я прямо в этом топике написал, что дотнетный и JS tostring не эквивалентны. Ну чо, меряйте дальше.

I>Очень легко добиться эквивалентности.

Ну так добейтесь, а после уже меряйте. А то измеряете погоду в Африке.
Re[23]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 21.09.17 19:14
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>>>И это после того, как я прямо в этом топике написал, что дотнетный и JS tostring не эквивалентны. Ну чо, меряйте дальше.

I>>Очень легко добиться эквивалентности.
НС>Ну так добейтесь, а после уже меряйте. А то измеряете погоду в Африке.

Что за фетиш такой — эта эквивалентность? Надо решать поставленную задачу имеющимися средствами и смотреть на скорость полученного решения. Весь код существует только ради решения задач. Если бы кого парила эквивалентность, существовал бы ровно один язык и один набор библиотек для него.

alex_public предложил задачу (http://rsdn.org/forum/flame.comp/6905867.1
Автор: alex_public
Дата: 16.09.17
) с вариантами решения на C# и JS. Я после нескольких попыток дал решение этой задачи на C#, которое работает быстрее оригинального грубо в 15 раз в однопоточном варианте и в 35 раз в многопоточном. Хотите «эквивалентности», ускорьте JS так же. А то у меня складывается впечатление, что тут JS никто не знает и не умеет.
Re[23]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 21.09.17 20:00
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>>>И это после того, как я прямо в этом топике написал, что дотнетный и JS tostring не эквивалентны. Ну чо, меряйте дальше.

I>>Очень легко добиться эквивалентности.

НС>Ну так добейтесь, а после уже меряйте. А то измеряете погоду в Африке.


У меня всё сильно. Дотнетчиков слишком много, не могут договориться.
Re[24]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 22.09.17 10:22
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Что за фетиш такой — эта эквивалентность? Надо решать поставленную задачу имеющимися средствами и смотреть на скорость полученного решения. Весь код существует только ради решения задач. Если бы кого парила эквивалентность, существовал бы ровно один язык и один набор библиотек для него.


Исследователь дождевого червя однажды сказал так: "Жизнь такая короткая, а червяк такой длинный!"

A>alex_public предложил задачу (http://rsdn.org/forum/flame.comp/6905867.1
Автор: alex_public
Дата: 16.09.17
) с вариантами решения на C# и JS. Я после нескольких попыток дал решение этой задачи на C#, которое работает быстрее оригинального грубо в 15 раз в однопоточном варианте и в 35 раз в многопоточном. Хотите «эквивалентности», ускорьте JS так же. А то у меня складывается впечатление, что тут JS никто не знает и не умеет.


А где код твоего решения ?
Re[25]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 22.09.17 13:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А где код твоего решения ?


http://rsdn.org/forum/flame.comp/6909060.1
Автор: alexzzzz
Дата: 19.09.17
Re[26]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 22.09.17 16:23
Оценка:
Здравствуйте, alexzzzz, Вы писали:

I>>А где код твоего решения ?

A>http://rsdn.org/forum/flame.comp/6909060.1
Автор: alexzzzz
Дата: 19.09.17


Хы, я что-то не смотрел код твоих последних вариантов, а сейчас глянул — смотрю ты там совсем захардкордил всё. ))) Подозреваю что при таком подходе на JS (а уж про C++ с его любовью к таким играм вообще молчу) можно тоже существенно изменить результаты. Но мне уже как-то лень играться в это. )

Кстати, а как и где задавать вот эту строчку:
<gcServer enabled="true"/>

а то у меня твой последний код выдаёт 200 мс, видимо как раз из-за этой опции. Если что, я компилирую .Net из командной строки. )
Re[27]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 22.09.17 17:27
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Хы, я что-то не смотрел код твоих последних вариантов, а сейчас глянул — смотрю ты там совсем захардкордил всё. ))) Подозреваю что при таком подходе на JS (а уж про C++ с его любовью к таким играм вообще молчу) можно тоже существенно изменить результаты. Но мне уже как-то лень играться в это. )


Если бы я знал JS и знал, что это возможно, сам бы сделал из любопытства, но я не знаю ни того, ни другого. Если ты не улучшишь результат, скорее всего, никто не улучшит.

_>Кстати, а как и где задавать вот эту строчку:

_>
_><gcServer enabled="true"/>
_>

_>а то у меня твой последний код выдаёт 200 мс, видимо как раз из-за этой опции. Если что, я компилирую .Net из командной строки. )

Конфиг должен лежать рядом с .exe вот так: https://bitbucket.org/alexzzzz/perftest/src/c7dd6158efe595c251f09ce90ecba68337b0fc79/Random_Optimized3/bin/Release/?at=default
Без конфига у меня тоже 220-230мс
Re[30]: Реальная производительность WebAssembly?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.09.17 18:59
Оценка:
Здравствуйте, alexzzzz, Вы писали:

Можно вместо копирования, делать инициализацию по месту

internal unsafe struct TestStruct
    {
        public string id;
        public string value;
        private static readonly Random random = new Random();

        public void Init()
        {
          
            id = GenerateRandomNumber();
            value = GenerateRandomNumber();

        }

        public override string ToString() => id;

        private static string GenerateRandomNumber()
        {
            var buffer = stackalloc char[11];
            int num = random.Next(100_000_000);
            var p = buffer;
            *p++ = '0';
            *p++ = '0';
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p++ = (char)('0' + num % 10); num /= 10;
            *p = (char)('0' + num % 10);
            return new string(buffer);
        }
    }


ну установка

vals[j].Init();


Ну и еще попробовать Net Native
http://rsdn.org/forum/dotnet/6738556.1
Автор: Serginio1
Дата: 28.03.17

https://social.msdn.microsoft.com/Forums/windowsapps/en-US/ecbeb5d7-858b-4dea-a3de-e35b083f0613/uwpxaml-how-to-generate-app-package-with-unsafe-code?forum=wpdevelop
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.09.2017 20:32 Serginio1 . Предыдущая версия . Еще …
Отредактировано 22.09.2017 19:01 Serginio1 . Предыдущая версия .
Re[28]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 23.09.17 03:58
Оценка:
Здравствуйте, alexzzzz, Вы писали:

_>>Хы, я что-то не смотрел код твоих последних вариантов, а сейчас глянул — смотрю ты там совсем захардкордил всё. ))) Подозреваю что при таком подходе на JS (а уж про C++ с его любовью к таким играм вообще молчу) можно тоже существенно изменить результаты. Но мне уже как-то лень играться в это. )

A>Если бы я знал JS и знал, что это возможно, сам бы сделал из любопытства, но я не знаю ни того, ни другого. Если ты не улучшишь результат, скорее всего, никто не улучшит.

Ну я вообще то тоже не эксперт по JS. ))) Т.е. я его конечно более менее знаю (как и все сейчас наверное), но не настолько, чтобы написать за одну минуту (без копания в документации, что уже лень) самый оптимальный вариант. В отличие от C++ (который как раз входит в число моих инструментов), на котором я реально могу за пару минут накидать нужное.

Вот сейчас перевёл твой хардкорный код в C++ вариант и был несколько шокирован результатом. Т.е. я конечно знаю про силу бесплатных абстракций C++, но такого не ожидал даже я: хардкорный код, заточенный под один конкретный случай, оказался медленнее универсального кода, допускающего произвольное сложное форматирование! Надо будет потом ещё глянуть ради интереса, что там авторы Spirit'а наоптимизировали, что оно так летает. )))

_>>Кстати, а как и где задавать вот эту строчку:

_>>
_>><gcServer enabled="true"/>
_>>

_>>а то у меня твой последний код выдаёт 200 мс, видимо как раз из-за этой опции. Если что, я компилирую .Net из командной строки. )
A>Конфиг должен лежать рядом с .exe вот так: https://bitbucket.org/alexzzzz/perftest/src/c7dd6158efe595c251f09ce90ecba68337b0fc79/Random_Optimized3/bin/Release/?at=default
A>Без конфига у меня тоже 220-230мс

Ага, работает, подтверждаю. ) Кстати, но мне кажется, что всё же не совсем корректно сравнивать такие реализации, потому что в реальной жизни большинство программистов будет всё же использовать готовые функции. Так что я бы представил результаты всех этих наших измерений приблизительно так:
время заполнения массива, с помощью стандартных функций, мс время заполнения массива, с помощью ручного кода, мс
JS node 500 ?
Firefox 200 ?
C# normal 500 200
server 380 100
C++ 14 120 52
17 60 52
Boost 49 52
P.S. разница между C++14 и C++17 в том, что в первом используется функция форматирования, использующая системную локаль (прямо как в C#), а во втором используется только что добавленная в стандарт функция, не использующая локаль (прямо как в JS).

  C++ код, если что, сразу для всех вариантов)
class Test
{
    inline static mt19937 rnd;
    auto create_id()//Boost
    {
        string s(10, '0');
        generate(s.begin()+2, sp::uint_, uniform_int_distribution<>(0, 99'999'999)(rnd));
        return s;
    }
    auto create_id1()//хардкор
    {
        string s(10, '0');
        for(int i=2, n=uniform_int_distribution<>(0, 99'999'999)(rnd); n>0; i++, n/=10) s[i]='0'+n%10;
        return s;
    }
    auto create_id2()//C++17
    {
        string s(10, '0');
        to_chars(&s[0]+2, &s[0]+10, uniform_int_distribution<>(0, 99'999'999)(rnd));
        return s;
    }
public:
    Test(): id(create_id()), value(create_id()) {}
    string id;
    string value;
};

int main()
{
    for(int i=0; i<5; i++){
        auto start=high_resolution_clock::now();
        vector<Test> vals(1000*1000);
        auto end=high_resolution_clock::now();
        cout<<duration_cast<milliseconds>(end-start).count()<<" ms."<<endl;
    }
}
Re[29]: Реальная производительность WebAssembly?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.17 06:44
Оценка:
Здравствуйте, alex_public, Вы писали:
А где .Net Native?
А насчет реальной жизни, если есть возможность подкрутить лимитирующую стадию процесса,
то большинство программистов начинают оптимизировать.И .Net это позволяет.
Пример https://stackoverflow.com/
А там где скорость не важна, то там и 1С прекрасно себя чувствует

Предвосхищая, что используется не только .Net
«Производительность – это фича». Интервью с Марко Чеккони, Stack Overflow

– Ваше решение построено полностью на С#, или есть части на других языках, типа C++, Java, Python или других?

– Я бы сказал, что на 99% у нас С#. У нас, конечно, есть немного на C++ или С, но в строчках кода это совсем мало. Естественно, у нас есть TypeScript и JavaScript. JavaScript у нас на сервере используется для компиляции бандлов и минификации кода. Мы также пользуемся SQL, это другой язык. Вот и все.

и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.09.2017 6:56 Serginio1 . Предыдущая версия . Еще …
Отредактировано 23.09.2017 6:49 Serginio1 . Предыдущая версия .
Re[31]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 23.09.17 11:30
Оценка: 2 (1)
Здравствуйте, Serginio1, Вы писали:

S>Можно вместо копирования, делать инициализацию по месту

S>
S>vals[j].Init();
S>

Быстрее не получилось. Так тоже быстрее не получилось:
TestStruct.Init(ref vals[j]);


S> Ну и еще попробовать Net Native

Попробую, если научусь делать консольные приложения. Никогда не пробовал.
Отредактировано 23.09.2017 11:30 alexzzzz . Предыдущая версия .
Re[29]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 23.09.17 12:01
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Ага, работает, подтверждаю. ) Кстати, но мне кажется, что всё же не совсем корректно сравнивать такие реализации, потому что в реальной жизни большинство программистов будет всё же использовать готовые функции.


Соображения такие:
1. Если участку программы нужна скорость, тут и профайлером смотрят, и бенчмарки гоняют-сравнивают, и используют любые доступные средства — цель оправдывает.
2. Остальной программе (99%) скорость не критична, код пишется как можно проще. Померить скорость, погонять бенчмарки можно, но результаты никому не будут нужны.

Т.е. если и мерить скорость стандартных функций, то только ради первого пункта — чтобы примерно представлять, насколько она быстрая/медленная и насколько её можно будет ускорить, если понадобится.
Re[30]: Реальная производительность WebAssembly?
От: alex_public  
Дата: 23.09.17 13:56
Оценка:
Здравствуйте, alexzzzz, Вы писали:

_>>Ага, работает, подтверждаю. ) Кстати, но мне кажется, что всё же не совсем корректно сравнивать такие реализации, потому что в реальной жизни большинство программистов будет всё же использовать готовые функции.

A>Соображения такие:
A>1. Если участку программы нужна скорость, тут и профайлером смотрят, и бенчмарки гоняют-сравнивают, и используют любые доступные средства — цель оправдывает.
A>2. Остальной программе (99%) скорость не критична, код пишется как можно проще. Померить скорость, погонять бенчмарки можно, но результаты никому не будут нужны.
A>Т.е. если и мерить скорость стандартных функций, то только ради первого пункта — чтобы примерно представлять, насколько она быстрая/медленная и насколько её можно будет ускорить, если понадобится.

Угу, я согласен. Поэтому и говорю, что надо отдельно два столбика рассматривать и оба они несут определённый полезный смысл. ) Вот если кто-то (может Ikemefula?) подкинет недостающее решение для JS — тогда будет всё совсем корректно. )
Re[32]: Реальная производительность WebAssembly?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.17 14:24
Оценка:
Здравствуйте, alexzzzz, Вы писали:



S>> Ну и еще попробовать Net Native

A>Попробую, если научусь делать консольные приложения. Никогда не пробовал.
Насчет консольного не знаю, но аналог WPF или Xamarin легко https://metanit.com/sharp/uwp/
и солнце б утром не вставало, когда бы не было меня
Re[30]: Реальная производительность WebAssembly?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.09.17 17:13
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Соображения такие:

A>1. Если участку программы нужна скорость, тут и профайлером смотрят, и бенчмарки гоняют-сравнивают, и используют любые доступные средства — цель оправдывает.

Код должен быть относительно читабельным после оптимизаций. В противном случае его выбросят после долгого геморроя с майнтенансом.
Скажем, в JS можно много чего придумать, правда такой код никто в своём уме не пишет. Соответственно и сравнивать смысла большого нет.

A>2. Остальной программе (99%) скорость не критична, код пишется как можно проще. Померить скорость, погонять бенчмарки можно, но результаты никому не будут нужны.


Это не совсем так. Скажем, энергосбережение, загрузку процессора никто не отменял.

Здесь интересный момент, связаный с теми тестами про сортировку. Большинство программистов на разных языках одну и ту же задачу решат одним и тем же способом, идентичной структурой и алгоритмами и тд и тд. То есть, выбор решения обычно делается до написания кода и тд. И если в одном из языков производительности хватит, то в другом это может стать узким местом и только тогда появляются оптимизации.
То есть, если обычный код на одном языке устраивает своей производительностью, то с большой вероятностью любой язык, который выдаст аналогичный перформанс, так же сгодится для решения задачи.
Re[31]: Реальная производительность WebAssembly?
От: alexzzzz  
Дата: 25.09.17 12:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

A>>Соображения такие:

A>>1. Если участку программы нужна скорость, тут и профайлером смотрят, и бенчмарки гоняют-сравнивают, и используют любые доступные средства — цель оправдывает.
I>Код должен быть относительно читабельным после оптимизаций. В противном случае его выбросят после долгого геморроя с майнтенансом.

Выбросят, участок программы снова станет в 10 раз медленнее, и кто-то за это получит по шапке. Но если оптимизацию можно выбросить так, что никто не заметит, то тогда она конечно лишняя.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.