C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 09:15
Оценка: -5 :))) :))
Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение.
Читаю подобные темы и неудержимо тянет на гомерический хохот
http://rsdn.ru/forum/dotnet/6006483.flat.1
Автор: Sinix
Дата: 07.04.15

http://rsdn.ru/forum/dotnet/6053731.flat.1
Автор: Sinix
Дата: 20.05.15


"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?
Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).

Пример на С#:

public sealed class World
{
    ...
    private hkpWorld physicsWorld;
    ...
    
    public World()
    {
        //initialize world's physics and geometry with default values
        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
    }

    ...
    public hkpWorld getWorld()
    {
        //Yellow!!!
        //I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
        
        hkpWorldCinfo worldInfo = new...;
        //let's change gravity from 9.8f to 10 because...
        worldInfo.m_gravity = 10;
        physicsWorld = new hkpWorld(worldInfo);
        ...
        //Hello, I'm mapnik and I see this code
        //FUUUUUUCK!!!
        return physicsWorld;
    }
    ...
}


И пример на С++, не допускающий подобного:

class World {
public:
    World(){
        //initialize world's physics and geometry with default values
        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
    }
    ~World();

    //No Radjesh you can't :)))            
    hkpWorld*    getWorld() const { return physicsWorld; };
    ...

private:
    ...
    hkpWorld *        physicsWorld;
    ...
};


Очень правильный механизм "защиты от дурака".

Discuss, господа, discuss
Отредактировано 22.05.2015 9:16 a_g_99 . Предыдущая версия .
Re: C# - from indians by indians
От: GarryIV  
Дата: 22.05.15 09:18
Оценка: -7
Здравствуйте, mapnik, Вы писали:

M>Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).


безотносительно фич шарпа const в С++ есть кривой костыль
WBR, Igor Evgrafov
Re: C# - from indians by indians
От: kvasya  
Дата: 22.05.15 09:20
Оценка:
Здравствуйте, mapnik, Вы писали:

M>Пример на С#:


M>
M>public sealed class World
M>{
M>    ...
M>    private readonly hkpWorld physicsWorld;
M>    ...
    
M>    public World()
M>    {
M>        //initialize world's physics and geometry with default values
M>        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
M>                
M>        hkpWorldCinfo worldInfo = new...;
M>        worldInfo.m_gravity = 9.8;
M>        physicsWorld = new hkpWorld(worldInfo);
M>    }

M>


Но я фанат C++
Отредактировано 22.05.2015 9:21 kvasya . Предыдущая версия .
Re[2]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 09:29
Оценка:
Здравствуйте, kvasya, Вы писали:

M>>Пример на С#:


Нет потому что physicsWorld не инициализируется в конструкторе по определенным причинам.
Re[2]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 09:30
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>безотносительно фич шарпа const в С++ есть кривой костыль


Некоторые проблемы есть, но преимущества перевешивают недостатки при грамотном использовании
Re: C# - from indians by indians
От: hi_octane Беларусь  
Дата: 22.05.15 09:35
Оценка:
Это вы, как говорится, ещё в ракете не смотрели С небольшой помощью рефлексии можно менять readonly, вызывать приватные методы и творить другие чудеса.

В первой версии C# на это не было времени, в следующих в общем тоже, сейчас стандартный подход к этой проблеме — аттрибут [Pure], и последующая проверка контрактами + подсказки решарпера.
Но фичи нехватает, это да. В Nemerle у меня для этого был макрос и подсветка всех изменяемых переменных и полей болдом.

P.S. Вроде как в тайне приближаются immutable типы, но может и не приближаются.
Re: C# - from indians by indians
От: DreamMaker  
Дата: 22.05.15 09:43
Оценка: +4 -5
Здравствуйте, mapnik, Вы писали:

M>Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение.

M>Читаю подобные темы и неудержимо тянет на гомерический хохот

ну, смех без причины...

С++ — один сплошной чудовищный маразм. С# не идеален, идеального в этом мире ничего нет, но НАМНОГО лучше.

и да, у меня ~18 лет на С++ и 4 на шарпе. и таких как я немало. а вот чтобы человек с шарпа перешел на плюсы и радовался — что-то о таком не слышал.
In P=NP we trust.
Re: C# - from indians by indians
От: Sinix  
Дата: 22.05.15 09:48
Оценка: +4 -1
Здравствуйте, mapnik, Вы писали:


M>"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?


Всё расписано до нас
Автор: Sinix
Дата: 21.05.15
:

Если серьзно, то начиная с шестого шарпа очевидно поменялся подход к отбору фич.
Классика "дизайним очередной big thing и вылизываем всё, что с ним связано" никуда не делась.
Но помимо неё в язык по мере возможности добавляется мелочёвка, которая почти не влияет на public API и которая не особенно нужна в энтерпрайзе (серьёзно, если в коде такой баррдак, что даже приватные методы использовать небезопасно, ну сделай ты рефакторинг!).

Зато эта мелочёвка будет полезна для всяких скриптов/однодневных поделок и прочего write-only кода.
Это ни хорошо, ни плохо, просто последствия попытки пролезть в мобильную нищу и в нишу инди-сайтов.


Immutable входит в список big-thing-кандидатов на следующий релиз.

Если хочется аж пипец как — пишем свой [ImmutableAttribute] + проверку в FxCop или реврайтим ч/з постшарп. Дел на два дня вместе с изучением. Я что-то такое писал лет восемь назад, выкинуто за ненадобностью.
Потому что в реальной жизни Раджеш просто выпилит const/извратится с const_cast (или как там его?).

M>Discuss, господа, discuss

А что тут обсуждать?
Во-первых, нефиг дизайнить API так, чтобы естественное с точки зрения новичка использование приводило к ошибкам
Во-вторых, если уж припёрло, покрываешь сеттеры дебаг-ассертами и пусть твой Раджеш хоть через рефлексию ломится.

UPD и да, в любом более-менее пристойном месте попытка закомитить код, который нарушает даже соглашения по именованию, приведёт к выпилу кода, Раджеша и люлям для нанявшего и тимлида. Ибо нефиг.
Отредактировано 22.05.2015 9:56 Sinix . Предыдущая версия .
Re[2]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 10:02
Оценка: -3 :)
Здравствуйте, Sinix, Вы писали:

S>Если хочется аж пипец как — пишем свой [ImmutableAttribute] + проверку в FxCop или реврайтим ч/з постшарп. Дел на два дня вместе с изучением. Я что-то такое писал лет восемь назад, выкинуто за ненадобностью.

Я не хочу бороться со средой, я хочу иметь такой дизайн языка который позволит мне расставлять rules, которые станут опорными точками для Раджешей.

S>Потому что в реальной жизни Раджеш просто выпилит const/извратится с const_cast (или как там его?).

Раджеш не выпилит const (иначе выпилят его) и он не знает про const_cast. Раджеш справедливо боится трогать чужой без детальных инструкций по шагам. Но если что-то не запрещено, то он в принципе волен делать что ему в голову придет — это вполне логично и справедливо. C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.

S>Во-вторых, если уж припёрло, покрываешь сеттеры дебаг-ассертами и пусть твой Раджеш хоть через рефлексию ломится.

Пути есть но они сложные и тупые. Я хочу видеть элегантный дизайн языка из коробки для подобных вещей. C# подход подталкивает к написанию говнокода из коробки.
Re: C# - from indians by indians
От: agat50  
Дата: 22.05.15 10:12
Оценка:
Здравствуйте, mapnik, Вы писали:

Сделай свойство и проверку на null в set, проблем то.
Re: C# - from indians by indians
От: AlexRK  
Дата: 22.05.15 10:21
Оценка: +2 :)
Здравствуйте, mapnik, Вы писали:

M>И пример на С++, не допускающий подобного:


class World {
public:
    World(){
        //initialize world's physics and geometry with default values
        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
    }
    ~World();

    //No Radjesh you can't :)))            
    hkpWorld* getWorld() const
    {
        //Yellow!!!
        //I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
        
        hkpWorldCinfo worldInfo = new...;
        //let's change gravity from 9.8f to 10 because...
        worldInfo.m_gravity = 10;
        auto myRajeshphysicsWorld = new hkpWorld(worldInfo);
        ...
        //Hello, I'm mapnik and I see this code
        //FUUUUUUCK!!!
        return myRajeshphysicsWorld;
    };
    ...

private:
    ...
    hkpWorld *        physicsWorld;
    ...
};


ы?
Re[2]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 10:34
Оценка: -3
Здравствуйте, AlexRK, Вы писали:

ARK>ы?


Ваш пример хороший потому как я старался привести простейший пример для понимания. В реальной жизни Раджеш не сможет создать с нуля physicsWorld, это сложный объект с множеством не очевидных мемберов и методов. Если что-то инициализировать некорректно, все сразу упадет.
Re[3]: C# - from indians by indians
От: AlexRK  
Дата: 22.05.15 10:40
Оценка: +5
Здравствуйте, mapnik, Вы писали:

M>Ваш пример хороший потому как я старался привести простейший пример для понимания. В реальной жизни Раджеш не сможет создать с нуля physicsWorld, это сложный объект с множеством не очевидных мемберов и методов. Если что-то инициализировать некорректно, все сразу упадет.


Ну в вашем C#-примере он ведь смог.
Re[4]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 10:42
Оценка: -2
Здравствуйте, AlexRK, Вы писали:

ARK>Ну в вашем C#-примере он ведь смог.


Но это же упрощение для вас в контексте дискуссии. В реальности он смог только изменить значение гравитации
Re[5]: C# - from indians by indians
От: AlexRK  
Дата: 22.05.15 10:46
Оценка: +4
Здравствуйте, mapnik, Вы писали:

ARK>>Ну в вашем C#-примере он ведь смог.


M>Но это же упрощение для вас в контексте дискуссии. В реальности он смог только изменить значение гравитации


Но, получается, если создать новый мир он не смог, то он смог передать свое неверное значение гравитации в существующий экземпляр мира?
Тогда и в C++ он это сможет.
Re[3]: C# - from indians by indians
От: Sinix  
Дата: 22.05.15 10:51
Оценка: +2
Здравствуйте, mapnik, Вы писали:

M>Я не хочу бороться со средой, я хочу иметь такой дизайн языка который позволит мне расставлять rules, которые станут опорными точками для Раджешей.


Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете. Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.


M>Раджеш не выпилит const (иначе выпилят его) и он не знает про const_cast. Раджеш справедливо боится трогать чужой без детальных инструкций по шагам.

Не надо недооценивать стажёров

M>C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.

Геттер без сеттера + init-метод?


M>Пути есть но они сложные и тупые. Я хочу видеть элегантный дизайн языка из коробки для подобных вещей. C# подход подталкивает к написанию говнокода из коробки.

Не больше и не меньше, чем другие языки. Просто перед тем как писать API, надо изучить готовые рекомендации. Для шарпа design guidelines расписаны великолепно.
Re[4]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 11:50
Оценка: +1 -6 :)))
Здравствуйте, Sinix, Вы писали:

S>Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете.

Мы таким не занимаемся, у нас не luxoft и не infosys. 19 тим-лидов девочек с украины не держим которые умеют красивый текст в c# на клавиатурке набирать. мне важно что человек знает как инженер, а не как кодер.

S>Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.

Я хочу использовать дизайн языка а не ковырять очередное поделие от микрософта. Понимаете вы мне все время говорите — "а вот пара дней помучать задницу, и вы разродитесь решением". Меня такой подход не устраивает потому что для меня ЯП это не вещь в себе а инструмент для решения определенной задачи. И я не собираюсь вникать в эти индусские идеи чтобы исправить индусские баги. Это детский сад. Мне нужен approach на уровне дизайна языка, в C# его нет. Это касается не только конкретно этой фичи но и кучи других вещей. Напр. множественное наследование. В дизайне языка просто отсутствуют rules которые помогли бы формировать корректный код. Вместо это вас отправляют к каким-то паттернам, стайл копам и прочей чуши. Это просто бред

S>Не надо недооценивать стажёров

Вы просто не работали с индусами.

M>>C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.

S>Геттер без сеттера + init-метод?
Это слишком жесткая связка. Я не хочу ограничивать себя readonly методом. Очередная недороботка C# по дизайну. Очень грустно программировать на подобных языках
Re[5]: C# - from indians by indians
От: Sinix  
Дата: 22.05.15 12:05
Оценка: +3
Здравствуйте, mapnik, Вы писали:

S>>Только code review + отсеивание на испытательном сроке. Иначе вы больше потратите, чем выиграете.

M>Мы таким не занимаемся ... мне важно что человек знает как инженер, а не как кодер.
Ну так и пусть инженер занимается своим делом, а разработчик своим. Вы ж стоматолога не за красивые красные глаза выбираете?
Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное.


S>>Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.

M>Я хочу использовать дизайн языка а не ковырять очередное поделие от микрософта. Понимаете вы мне все время говорите — "а вот пара дней помучать задницу, и вы разродитесь решением".
Ваш кэп: вы ставите задачу "сделайте мне c#, который прощает ошибки от не изучавших c#". Спрос на такое маленький, придётся часть делать самостоятельно. Выбирайте любой другой инструмент, меняйте команду, найдите специалиста, который решал подобные проблемы. Форум вам тут как поможет?

Если проблема не настолько критичная, то тогда надеяться на "кто-то за меня поправит" тем более не стоит.


S>>Геттер без сеттера + init-метод?

M>Это слишком жесткая связка. Я не хочу ограничивать себя readonly методом. Очередная недороботка C# по дизайну. Очень грустно программировать на подобных языках
Ну так берите любой другой язык, в чём проблема-то?
Re[6]: C# - from indians by indians
От: mapnik США http://www.hooli.xyz/
Дата: 22.05.15 12:24
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное.

Вы я так полагаю мните себя этаким опытным суперпрофессионалом который не совершает ошибок и может решать выкинуть на улицу или нет "менее опытных" людей?
Я придерживаюсь абсолютно противоположного мнения относительно своего опыта и знаю. Я абсолютно уверен что код который я написал содержит много дерьма. Поэтому не сужу других людей. Но нельзя все время быть в дерьме, нужно совершенствоваться.
Поэтому мы используем статический анализ код и периодические разборы вне зависимости от опыта и должности. Но это еще не все. Сам дизайн языка важен, чтобы "новичок" мог опереться на какие-то rules и не наломать дров. C# не имеет такого выверенного дизайна, нацеленного на повышение качества кода. Это просто набор фич которые позволят вам писать говнокод быстро. И от релиза к релизу в шарпе ничего не меняется — количество удобных фич для разработки говнокода просто растет. Вот что я хочу до вас донести.

S>Ну так берите любой другой язык, в чём проблема-то?

Проблема в том, чтобы найти хоть кого-то знающего с++ или sql почти нереально. А C# выучить может любой индус, который не осилит даже python. Отсюда и ограничения.
Re[7]: C# - from indians by indians
От: Sinix  
Дата: 22.05.15 12:48
Оценка: +7 :)
Здравствуйте, mapnik, Вы писали:

S>>Всё равно проблемы из-за неопытности вылезут, не сейчас, так потом. Дешевле поймать их сразу, чем лечить уже запущенное.

M>Вы я так полагаю мните себя этаким опытным суперпрофессионалом который не совершает ошибок и может решать выкинуть на улицу или нет "менее опытных" людей?

Нет конечно, с чего вы взяли, что людей надо сразу выкидывать на улицу? Если человек допускает ошибки по неопытности, то это лечится обучением и совместным разбором ошибок, а не "уходи, ты плохой" или намёками про Раджеша.


M> Я абсолютно уверен что код который я написал содержит много дерьма. Поэтому не сужу других людей.

Порвало
Вы свой предыдущий пост прочитайте, который про Раджеша, "люксофт с 19 девочками", "поделие от микрософта", "я не собираюсь вникать в эти индусские идеи" и тд. Морализатор блин


M>Поэтому мы используем статический анализ код и периодические разборы вне зависимости от опыта и должности. Но это еще не все. Сам дизайн языка важен, чтобы "новичок" мог опереться на какие-то rules и не наломать дров. C# не имеет такого выверенного дизайна, нацеленного на повышение качества кода.

Вот с этого и надо было начинать. Потому что первый же ответ был про И утром, ото сна восстав, Читай усиленно устав чудо-книгу FDG, в которой основные ошибки и подходы к дизайну API разобраны от и до.

После изучения большинство вопросов будут в духе "и зачем нам эта фигня?", а не "почему шарп позволяет написать фигню?"


M>Это просто набор фич которые позволят вам писать говнокод быстро. И от релиза к релизу в шарпе ничего не меняется — количество удобных фич для разработки говнокода просто растет. Вот что я хочу до вас донести.

Разумеется. Потому что это мейнстрим-язык, причём чисто исторически — заточенный под энтерпрайз разработку. Т.е. некоторый входной барьер предполагается по умолчанию.


M>Проблема в том, чтобы найти хоть кого-то знающего с++ или sql почти нереально. А C# выучить может любой индус, который не осилит даже python. Отсюда и ограничения.

Это распространённое заблуждение. Поздравляю, вы начинаете понимать, что не всё так просто
Re[5]: C# - from indians by indians
От: hi_octane Беларусь  
Дата: 22.05.15 12:50
Оценка: +7 :))) :)
S>>Ну и начиная с рослина всякие проверки типа таких пишутся на раз-два.
M>Я хочу использовать дизайн языка а не ковырять очередное поделие от микрософта. Понимаете вы мне все время говорите — "а вот пара дней помучать задницу, и вы разродитесь решением". Меня такой подход не устраивает потому что для меня ЯП это не вещь в себе а инструмент для решения определенной задачи. И я не собираюсь вникать в эти индусские идеи чтобы исправить индусские баги. Это детский сад. Мне нужен approach на уровне дизайна языка, в C# его нет.
Мы точно ещё в контексте С++? А то я не уверен что язык в котором всё может быть приведено к byte* и заполнено ценнейшими данными, является взрослым решением с тем approach на уровне дизайна языка, который вам нужен.

M>Это касается не только конкретно этой фичи но и кучи других вещей. Напр. множественное наследование. В дизайне языка просто отсутствуют rules которые помогли бы формировать корректный код. Вместо это вас отправляют к каким-то паттернам, стайл копам и прочей чуши. Это просто бред

В C# может и много чего нет, и я сам любитель покритиковать, но в нём дофига всякого и есть. Последний раз когда мне реально понадобилось множественное наследование в C# — выкрутился через генерацию partial классов. Кроме этого есть ещё PostSharp, Nemerle, и другие интересные способы решить проблему множественного наследования.

M>Вы просто не работали с индусами.

M>>>C# поощряет такой подход на уровне дизайна. С++ наоборот может подсказать новичку, что "вот так менять гравитацию" нельзя на уровне синтаксиса.
Ну если в контексте индусов, то честно говоря я не представляю что это за задачи такие в которых const что-то решает по сравнению с проверкой кода через контракты. В C++ нам далеко не индус организовал два delete одному указателю. Плавающий баг тихарился годами и был найден случайно когда код в связи с ростом проекта попал в цикл и memory manager взбрыкнул. А до того были странности выполнения зависящие от звёзд на небе. Как там, approach на уровне дизайна языка, говорите?

S>>Геттер без сеттера + init-метод?

M>Это слишком жесткая связка. Я не хочу ограничивать себя readonly методом. Очередная недороботка C# по дизайну. Очень грустно программировать на подобных языках
Прокачивайте чувство юмора, мне вот весело И снова, вы ещё в ракете не смотрели JavaScript на сервере не писали, там в сумерках вложенных каллбэков настоящая жара начинается
Re[2]: C# - from indians by indians
От: Mazay Россия  
Дата: 24.05.15 06:55
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Потому что в реальной жизни Раджеш просто выпилит const...


И получит кучу ошибок компиляции, поскольку на константном объекте можно звать только константные методы.
Главное гармония ...
Re: C# - from indians by indians
От: 0x7be СССР  
Дата: 24.05.15 07:39
Оценка: +1 :))) :))
Здравствуйте, mapnik, Вы писали:

M>Очень правильный механизм "защиты от дурака".

M>Discuss, господа, discuss
Раз в С++ есты защита от дурака, значит предполагается что на нам будут писать дураки.
Так какой там язык для индусов? :trollface:
Re[2]: C# - from indians by indians
От: greenpci  
Дата: 24.05.15 08:13
Оценка:
Здравствуйте, DreamMaker, Вы писали:

DM>и да, у меня ~18 лет на С++ и 4 на шарпе. и таких как я немало. а вот чтобы человек с шарпа перешел на плюсы и радовался — что-то о таком не слышал.


Будем знакомы. Уже три года как на плюсах после 5ти на шарпе. Причем выбор не случайный, сам к этому шел.
Re[6]: C# - from indians by indians
От: Ops Россия  
Дата: 24.05.15 09:05
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>В C++ нам далеко не индус организовал два delete одному указателю.

А кто вообще организовал delete указателю не в библиотечном коде? Оно такое нафиг не нужно.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: C# - from indians by indians
От: hi_octane Беларусь  
Дата: 24.05.15 09:59
Оценка:
Ops>А кто вообще организовал delete указателю не в библиотечном коде? Оно такое нафиг не нужно.
Свои пулы (memory regions) объектов под задачи. Эволюционировали с простейших кусков памяти привязанных к задаче до поддержки вложенности, сериализации и передачи вместе с задачей на другую ноду кластера. В общем-то предположение правильное — вполне библиотечный код.
Re[3]: C# - from indians by indians
От: SkyDance Земля  
Дата: 24.05.15 10:06
Оценка: +7
M>Раджеш не выпилит const (иначе выпилят его) и он не знает про const_cast. Раджеш справедливо

Ох, ну что за наивность. Первым же делом Раджеш вставит обычный C-style cast, и вся эта красивая константность исчезнет.
Re[8]: C# - from indians by indians
От: Ops Россия  
Дата: 24.05.15 10:29
Оценка: :)
Здравствуйте, hi_octane, Вы писали:

_>Свои пулы (memory regions) объектов под задачи. Эволюционировали с простейших кусков памяти привязанных к задаче до поддержки вложенности, сериализации и передачи вместе с задачей на другую ноду кластера. В общем-то предположение правильное — вполне библиотечный код.


Не, я под "библиотечным" имел в виду RAII примитивы. Использовать delete где-то кроме них сегодня довольно странно. Оно, конечно, можно, для какой-нибудь хардкорной оптимизации, но тогда надо об этом помнить и писать везде аршинными буквами.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: C# - from indians by indians
От: Figaro Россия  
Дата: 25.05.15 02:08
Оценка:
Здравствуйте, DreamMaker...

Просто порог вхождения в шарпей гораздо ниже... Но как только начинаешь интересоваться даже в шарпе тонкостями, большинство сливается...

P.S. Это о знании языков и их возможностях...
avalon/1.0.442
Re[3]: C# - from indians by indians
От: DreamMaker  
Дата: 25.05.15 10:59
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Будем знакомы. Уже три года как на плюсах после 5ти на шарпе. Причем выбор не случайный, сам к этому шел.


a задачи какие? если что-то низкоуровневое, то да, возможно оправданно.
иначе — мазохизм хождения по костылям.
In P=NP we trust.
Re: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 25.05.15 11:58
Оценка: +3
Здравствуйте, mapnik, Вы писали:

M>Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).

class World {
public:
    World(){
        //initialize world's physics and geometry with default values
        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
    }
    ~World();

    hkpWorld*    getWorld() const { 
    //Yellow!!!
        //I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
        
        hkpWorldCinfo worldInfo = new...;
        //let's change gravity from 9.8f to 10 because...
        worldInfo.m_gravity = 10;

        (const_cast<World*>(this))->physicsWorld =  new hkpWorld(worldInfo);
    return new hkpWorld(worldInfo); 
    };
    ...

private:
    ...
    hkpWorld *        physicsWorld;
    ...
};


ААААА, C++ говнище!!! Мало того что const нифига не помог, так еще и утечку памяти создал. Срочно бросайте все этот дерьмовый язык.


А если серьезно, то иди читай букварь прежде чем писать подобные темы.
Re[4]: C# - from indians by indians
От: greenpci  
Дата: 25.05.15 12:06
Оценка: 1 (1)
Здравствуйте, DreamMaker, Вы писали:

DM>a задачи какие? если что-то низкоуровневое, то да, возможно оправданно.

DM>иначе — мазохизм хождения по костылям.

Распределенные вычисления HPC. Использует всю память и считает по несколько дней, поэтому дотнет для задачи не подходит. Хотя все остальные части продукта, как UI, например, реализованы на дотнете.
Re[3]: C# - from indians by indians
От: greenpci  
Дата: 25.05.15 12:14
Оценка: +1 -2 :)
Здравствуйте, Figaro, Вы писали:

F>Просто порог вхождения в шарпей гораздо ниже... Но как только начинаешь интересоваться даже в шарпе тонкостями, большинство сливается...


Шарп неплохой язык, но он наполнен людьми, которые не любят технологии и программирование, а используют его только для заработка. И я их понимаю, ведь платят хорошо и работу найти легче. Один мой коллега дотнетчик с пятилетним стажем, как-то, прервал мои рассуждение о BidEndian и LittleEndian. Как оказалось, он не знал сколько битов в байте и многое другое в этом направлении. Тем не менее, он успешный программист в своей нише и ему хорошо платят.
Re[6]: C# - from indians by indians
От: greenpci  
Дата: 25.05.15 13:05
Оценка: +1
Здравствуйте, hi_octane, Вы писали:

_>В C# может и много чего нет, и я сам любитель покритиковать, но в нём дофига всякого и есть. Последний раз когда мне реально понадобилось множественное наследование в C# — выкрутился через генерацию partial классов. Кроме этого есть ещё PostSharp, Nemerle, и другие интересные способы решить проблему множественного наследования.


Делается с помощью интерфейса и extension methods на этот интерфейс. Потом класс наследует интерфейс и еще один класс и вот тебе множественное наследование в C#.
Re: C# - from indians by indians
От: omgOnoz  
Дата: 25.05.15 21:58
Оценка:
Здравствуйте, mapnik, Вы писали:

  Скрытый текст
M>Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение.
M>Читаю подобные темы и неудержимо тянет на гомерический хохот
M>http://rsdn.ru/forum/dotnet/6006483.flat.1
Автор: Sinix
Дата: 07.04.15

M>http://rsdn.ru/forum/dotnet/6053731.flat.1
Автор: Sinix
Дата: 20.05.15


M>"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?

M>Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).

M>Пример на С#:


M>
M>public sealed class World
M>{
M>    ...
M>    private hkpWorld physicsWorld;
M>    ...
    
M>    public World()
M>    {
M>        //initialize world's physics and geometry with default values
M>        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
M>    }

M>    ...
M>    public hkpWorld getWorld()
M>    {
M>        //Yellow!!!
M>        //I'm Rajesh, I got Phd in India and now I'm going to fix one bug!
        
M>        hkpWorldCinfo worldInfo = new...;
M>        //let's change gravity from 9.8f to 10 because...
M>        worldInfo.m_gravity = 10;
M>        physicsWorld = new hkpWorld(worldInfo);
M>        ...
M>        //Hello, I'm mapnik and I see this code
M>        //FUUUUUUCK!!!
M>        return physicsWorld;
M>    }
M>    ...
M>}
M>


M>И пример на С++, не допускающий подобного:


M>
M>class World {
M>public:
M>    World(){
M>        //initialize world's physics and geometry with default values
M>        setupWorld(defaultGravity, defaultSize, defaultBorderBehaviour);
M>    }
M>    ~World();

M>    //No Radjesh you can't :)))            
M>    hkpWorld*    getWorld() const { return physicsWorld; };
M>    ...

M>private:
M>    ...
M>    hkpWorld *        physicsWorld;
M>    ...
M>};
M>


M>Очень правильный механизм "защиты от дурака".


M>Discuss, господа, discuss


В Java прекрасно живется без всяких const методов. Существование const в С++ ни как не мешает "выстрелить в ногу".
Re[5]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 26.05.15 05:47
Оценка: :)
Здравствуйте, greenpci, Вы писали:

G>Распределенные вычисления HPC. Использует всю память и считает по несколько дней, поэтому дотнет для задачи не подходит.

Чем же не подходит, ну кроме масдайности? Неужели MS-й JIT таки писан Раджешом, и потому сливает сановскому JIT-у по производительности?

G> UI, например, реализованы на дотнете.

А вот за масдайность гуя надо руки отбивать.
Re[6]: C# - from indians by indians
От: greenpci  
Дата: 26.05.15 12:29
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>Чем же не подходит, ну кроме масдайности? Неужели MS-й JIT таки писан Раджешом, и потому сливает сановскому JIT-у по производительности?


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

Джит прекрасно написан, я уверен. Но, до предела оптимизированное сишное приложение, все равно, делает меньше работы. Поэтому работает быстрее и жрет меньше памяти.

G>> UI, например, реализованы на дотнете.

Aё>А вот за масдайность гуя надо руки отбивать.

Зря. Атлассиан пишет SourceTree на WPF и ничего.
Re[7]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 27.05.15 11:37
Оценка: -1
Здравствуйте, greenpci, Вы писали:

G>Джит прекрасно написан, я уверен. Но, до предела оптимизированное сишное приложение, все равно, делает меньше работы. Поэтому работает быстрее и жрет меньше памяти.

Я бы не был уверен насчёт жита дотнета- взять хотя бы его неспособность житить лишь горячие участки. Насчёт до предела оптимизаций- Matematica написана на Java и умеет CUDA, т.е. работает быстрее, а память- не ресурс.
Re[8]: C# - from indians by indians
От: Sinix  
Дата: 27.05.15 12:02
Оценка: 3 (2) +1
Здравствуйте, Aртём, Вы писали:

Aё>Я бы не был уверен насчёт жита дотнета- взять хотя бы его неспособность житить лишь горячие участки. Насчёт до предела оптимизаций- Matematica написана на Java и умеет CUDA, т.е. работает быстрее, а память- не ресурс.


Hotspot jit во многом нужен из-за отсутствия value types в яве. Без них разница с шарпом непринципиальна (что как бы очевидно, в рамках времени, отводимого на jit, ничего сильно пристойного всё равно не сделать). Для частных случаев с .net 4.5 есть profile guided optimisation, для cuda есть AleaGPU, т.е. не в этом счастье.

Тут в другом проблема: старые реализации jit не были заточены под числомолотилки. Плюс, начиная с второго дотнета и вплоть до winphone8/win8 clr не развивался от слова никак.

В свежих релизах с .NetCore и RyuJit положение потихоньку выправляется, особенно с учётом .net native и возможности трансляции в llvm. Но, очевидно, в ближайщую пару релизов ничего сильно не изменится — сначала надо переползти толком на новые платформы, ничего сильно не потеряв. Дальше — будем посмотреть.
Re[8]: C# - from indians by indians
От: greenpci  
Дата: 27.05.15 13:29
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>Я бы не был уверен насчёт жита дотнета- взять хотя бы его неспособность житить лишь горячие участки. Насчёт до предела оптимизаций- Matematica написана на Java и умеет CUDA, т.е. работает быстрее, а память- не ресурс.


КУДА на подойдет, это же GPU, как я понимаю. У этого приложения распределение идет на workers и облако.
Re[9]: C# - from indians by indians
От: Sinix  
Дата: 27.05.15 16:41
Оценка:
Здравствуйте, greenpci, Вы писали:

G>КУДА на подойдет, это же GPU, как я понимаю. У этого приложения распределение идет на workers и облако.


А тогда тем более не подойдёт. Платформа для распределённых вычислений под шарп (orleans) появилась только недавно и на сегодня местами не допилена (например, низзя обновить код без остановки хоста) плюс прибита гвоздями к Azure. Не, если пойти на принцип, то можно конечно, но никаких причин кроме как "поискать приключений" я не вижу
Re[10]: C# - from indians by indians
От: greenpci  
Дата: 28.05.15 10:56
Оценка: 4 (2) +3 :)
Здравствуйте, Sinix, Вы писали:

S>А тогда тем более не подойдёт. Платформа для распределённых вычислений под шарп (orleans) появилась только недавно и на сегодня местами не допилена (например, низзя обновить код без остановки хоста) плюс прибита гвоздями к Azure. Не, если пойти на принцип, то можно конечно, но никаких причин кроме как "поискать приключений" я не вижу


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

Я предполагаю, что можно напрячься и написать супер оптимизированный дотнет код, но для этого надо очень хорошо знать, что дотнет делает "под капотом" и писать так, что бы все это работало так же быстро, как и написанный "напрямую" сишный код. Трудоемкость такой работы не будет меньше, чем писать на сях напрямую, а может быть даже и больше. А работая над нашим продуктом три года, я не встретил сколько нибудь существенных сложностей, только из-за того, что это си плюс плюс, а не дотнет. Ну кроме только того, что в голове у менеджера, были программисты с этикеткой "могу си" и "не могу си" и он не может их всех "бросать" на одну амбразуру, а так хочется крикнуть "Сегодня все на Core. А не получится, ведь вася и петя не могут си". Нынешний менеджмент такого препятсвия очень не любит.

Поэтому, в этой переписке на дотнет, была бы только маркетинговая привлекательнось. Многие удивятся, но зарплата плюсника в Австралии меньше, чем шарпера при прочих равных. Плюсистов на рынке тьма. Честно говоря, я не понимаю, зачем все так хотят переписать все на дотнет и джаву. Я понимаю, что гуй и все где "пямять- не ресурс" писать на дотнете быстрее и дешевле. А там где это ресурс, затраты такие же, как минимум, а то и выше. Есть знакомый джавист, который пишет быстрый коннективити на джаве. Он рассказывал, как они там извращяются, что бы сделать это действительно быстрым. По его рассказам, трудоемкость не меньше, чем писать на плюсах и думают они так же, как плюсисты. Просто делают все через призму джавы, то есть еще один уровень абстракции, с которым нужно иметь дело.
Re[9]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 28.05.15 23:43
Оценка: -3
Здравствуйте, Sinix, Вы писали:

Aё>>Я бы не был уверен насчёт жита дотнета- взять хотя бы его неспособность житить лишь горячие участки. Насчёт до предела оптимизаций- Matematica написана на Java и умеет CUDA, т.е. работает быстрее, а память- не ресурс.


S>Hotspot jit во многом нужен из-за отсутствия value types в яве.

Это открытие тянет на Нобелевскую премию

S> Без них разница с шарпом непринципиальна (что как бы очевидно, в рамках времени, отводимого на jit, ничего сильно пристойного всё равно не сделать).

Просто уточню, что стандартные коллекции Java боксят любой элемент, потому они медленнее, чем в .NET где есть реализация коллекций под встроенные типы. Но для Java есть сторонние коллекции- под встроенные типы. Теперь по JIT-у — .NET-й не может интерпретировать, потому он всё подряд житит. А качественно оптимизировать jit-й код требует ресурсов, значит есть компромиссы. В отличие от Java JIT, где житятся только горячие участки и может неоднократно jit-ть поверх на критических вещах.

S>В свежих релизах с .NetCore и RyuJit положение потихоньку выправляется, особенно с учётом .net native и возможности трансляции в llvm. Но, очевидно, в ближайщую пару релизов ничего сильно не изменится — сначала надо переползти толком на новые платформы, ничего сильно не потеряв. Дальше — будем посмотреть.

В переводе на русский- Майкрософт, как всегда, налажал и не спешит исправляться.
Отредактировано 28.05.2015 23:44 Артём . Предыдущая версия .
Re[11]: C# - from indians by indians
От: mik1  
Дата: 29.05.15 01:38
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Если нашим боссам дать гарантию, что время и пространство (имею ввиду пямять и количество нодов для вычислений) не увеличится, то они с радостью перейдут на дотнет. На наш сишный код была потрачена куча времени для его оптимизации. Программисты профайлили исполнение в ВиТюне и ускоряли тайт люпы, то есть все куски кода, которые выполняются много раз. Так же, делали всякие хитрые вещи для сокращения памяти.


1) И все-все алгоритмы оптимальные использовали?
2) Правда? А что, byte[] и прочие примитивные массивы уже отменили в дотнете / яве ?

G>Я предполагаю, что можно напрячься и написать супер оптимизированный дотнет код, но для этого надо очень хорошо знать, что дотнет делает "под капотом" и писать так, что бы все это работало так же быстро, как и написанный "напрямую" сишный код. Трудоемкость такой работы не будет меньше, чем писать на сях напрямую, а может быть даже и больше. А работая над нашим продуктом три года, я не встретил сколько нибудь существенных сложностей, только из-за того, что это си плюс плюс, а не дотнет. Ну кроме только того, что в голове у менеджера, были программисты с этикеткой "могу си" и "не могу си" и он не может их всех "бросать" на одну амбразуру, а так хочется крикнуть "Сегодня все на Core. А не получится, ведь вася и петя не могут си". Нынешний менеджмент такого препятсвия очень не любит.


Путаешся в показаниях. То у тебя ядро оптимизированное и его нельзя трогать, то все морды на ПХП пишут
В реальности ядра того не сильно много окажется
Хотя прекрасно понимаю, что нахрена что-то менять, если оно работает.

Кстати, судя по распределенности, у вас совсем не реалтайм, а просто молотилка, которой важнее пропускная способность. А вот это уже территория, где выбор плюсов совсем не очевиден.

G>Поэтому, в этой переписке на дотнет, была бы только маркетинговая привлекательнось. Многие удивятся, но зарплата плюсника в Австралии меньше, чем шарпера при прочих равных. Плюсистов на рынке тьма. Честно говоря, я не понимаю, зачем все так хотят переписать все на дотнет и джаву.


Потому шта развивать продукт на управляемых языках оказывается дешевле. Time to market короче.

G>Я понимаю, что гуй и все где "пямять- не ресурс" писать на дотнете быстрее и дешевле. А там где это ресурс, затраты такие же, как минимум, а то и выше. Есть знакомый джавист, который пишет быстрый коннективити на джаве. Он рассказывал, как они там извращяются, что бы сделать это действительно быстрым. По его рассказам, трудоемкость не меньше, чем писать на плюсах и думают они так же, как плюсисты. Просто делают все через призму джавы, то есть еще один уровень абстракции, с которым нужно иметь дело.


Ну давай, расскажи *мне* как коннекторы на Яве писать Я тут connectivity framework-ами развлекаюсь
Коннектор, жрущий больше 50 мег памяти (на Яве) — это уже очень подозрительный коннектор. Даже если *вообще* ничего не оптимизировать, то мусор с 20-40 меговой кучи собирается с практически нулевым stop-the-world (например с G1 сборщиком). Это, повторю, *без оптимизаций*.
Если надо совсем мусора избегать, то под отправляемые / принимаемые блоки выделяешь память в начале дня / добавляешь в течении дня в случае пиков и переиспользуешь эти объекты (вместо new T делаешь T.set(...) ).
Дальше даешь сразу памяти при помощи Xms=Xmx, чтобы при выделении памяти затыков не было посреди дня, и это, в принципе, все.

Где тут твои "призмы" — хз.
Re: C# - from indians by indians
От: tlp  
Дата: 29.05.15 02:26
Оценка:
Здравствуйте, mapnik, Вы писали:

M>"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?

M>Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).

M>Discuss, господа, discuss


Читайте первоисточники.
http://blogs.msdn.com/b/slippman/archive/2004/01/22/61712.aspx
http://blogs.msdn.com/b/ericgu/archive/2004/04/22/118238.aspx
Отредактировано 29.05.2015 2:28 tlp . Предыдущая версия .
Re[12]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 29.05.15 03:07
Оценка:
Здравствуйте, mik1, Вы писали:

M>Если надо совсем мусора избегать, то под отправляемые / принимаемые блоки выделяешь память в начале дня / добавляешь в течении дня в случае пиков и переиспользуешь эти объекты (вместо new T делаешь T.set(...) ).

Мне пока что не удавалось совсем уж избегать создания объектов-обёрток над байтами. Т.е. коллектор таки работает всегда и прибивает коротко живущие обёртки на потоке.

M>Где тут твои "призмы" — хз.

Значит greenpci имел в виду не тебя? А я так вообще программировать не умею.
Re[12]: C# - from indians by indians
От: greenpci  
Дата: 29.05.15 03:40
Оценка:
Здравствуйте, mik1, Вы писали:

G>>Если нашим боссам дать гарантию, что время и пространство (имею ввиду пямять и количество нодов для вычислений) не увеличится, то они с радостью перейдут на дотнет. На наш сишный код была потрачена куча времени для его оптимизации. Программисты профайлили исполнение в ВиТюне и ускоряли тайт люпы, то есть все куски кода, которые выполняются много раз. Так же, делали всякие хитрые вещи для сокращения памяти.


M>1) И все-все алгоритмы оптимальные использовали?


где надо

M>2) Правда? А что, byte[] и прочие примитивные массивы уже отменили в дотнете / яве ?


G>>Я предполагаю, что можно напрячься и написать супер оптимизированный дотнет код, но для этого надо очень хорошо знать, что дотнет делает "под капотом" и писать так, что бы все это работало так же быстро, как и написанный "напрямую" сишный код. Трудоемкость такой работы не будет меньше, чем писать на сях напрямую, а может быть даже и больше. ...


А что объявить byte[] и работать с ним на плюсах труднее?

M>Путаешся в показаниях. То у тебя ядро оптимизированное и его нельзя трогать, то все морды на ПХП пишут


не понял. Да морда на WPF, ядро на сях. В чем противоречие?

M>В реальности ядра того не сильно много окажется


И чем это противоречит тому, что я сказал?

M>Хотя прекрасно понимаю, что нахрена что-то менять, если оно работает.


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

M>Кстати, судя по распределенности, у вас совсем не реалтайм, а просто молотилка, которой важнее пропускная способность. А вот это уже территория, где выбор плюсов совсем не очевиден.


дело не в абстрактной территории, а в нашей специфической задаче. Клиенты не хотят, что бы увеличивалось время и пространство.

M>Потому шта развивать продукт на управляемых языках оказывается дешевле. Time to market короче.


Речь не идет о продукте в целом, а об отдельной его части.

M>Ну давай, расскажи *мне* как коннекторы на Яве писать Я тут connectivity framework-ами развлекаюсь


M>Коннектор, жрущий больше 50 мег памяти (на Яве) — это уже очень подозрительный коннектор. Даже если *вообще* ничего не оптимизировать, то мусор с 20-40 меговой кучи собирается с практически нулевым stop-the-world (например с G1 сборщиком). Это, повторю, *без оптимизаций*.

M>Если надо совсем мусора избегать, то под отправляемые / принимаемые блоки выделяешь память в начале дня / добавляешь в течении дня в случае пиков и переиспользуешь эти объекты (вместо new T делаешь T.set(...) ).
M>Дальше даешь сразу памяти при помощи Xms=Xmx, чтобы при выделении памяти затыков не было посреди дня, и это, в принципе, все.

И что?

M>Где тут твои "призмы" — хз.


ты прямо в машинных кодах лабаешь? Или у тебя другое понимание выражения "уровень абстракции"?
Re[13]: C# - from indians by indians
От: mik1  
Дата: 29.05.15 04:17
Оценка:
Здравствуйте, greenpci, Вы писали:

G>все поскипал


Еще раз повторю.

1) Time to market уменьшается для последующих изменений.
2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах. Соот-но, время и пространство не факт, что ухудшатся.
3) То, что на Яве молотилки / near realtime делать труднее, чем на плюсах — миф.
Re[14]: C# - from indians by indians
От: greenpci  
Дата: 29.05.15 04:27
Оценка: :)
Здравствуйте, mik1, Вы писали:

M>Еще раз повторю.


M>1) Time to market уменьшается для последующих изменений.


не надо повторять.

M>2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах. Соот-но, время и пространство не факт, что ухудшатся.


я и не говорил, что труднее и не говорил, что ухудшатся.

M>3) То, что на Яве молотилки / near realtime делать труднее, чем на плюсах — миф.


я не говорил, что труднее.

Все что я сказал: Трудоемкость такой работы не будет меньше, чем писать на сях напрямую

Я не понимаю с кем ты споришь?

Даже если исходить из того, что

трудоемкость си = трудоемкость дотнет

в нашей задаче

Все равно останется одна проблема, программисты на дотнете стоят дороже программистов на сях в австралии, например.
Re[15]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 29.05.15 04:35
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Все равно останется одна проблема, программисты на дотнете стоят дороже программистов на сях в австралии

Зарплата зависит от предметной области. Таким образом, даже если абстрактный программист на сях с опытом железок или MFC-кала попробует устроиться на проект, где финансы на шарпе- его не возьмут, даже задёшево не возьмут. А с релевантным опытом плюсника оторвут с руками- и ещё вопрос, захочет ли он сам переходить на калософт .net.
Re[15]: C# - from indians by indians
От: mik1  
Дата: 29.05.15 04:36
Оценка:
Здравствуйте, greenpci, Вы писали:

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


M>>Еще раз повторю.

M>>1) Time to market уменьшается для последующих изменений.
G>не надо повторять.

Надо, к сожалению надо. До многих это не доходит годами.

M>>2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах. Соот-но, время и пространство не факт, что ухудшатся.

G>я и не говорил, что труднее и не говорил, что ухудшатся.
M>>3) То, что на Яве молотилки / near realtime делать труднее, чем на плюсах — миф.
G>я не говорил, что труднее.
G>Все что я сказал: [b]Трудоемкость такой работы не будет меньше, чем писать на сях напрямую[/b]

Из выделенного очевидно следует равенство сложностей? Я вот знаком с >1 перебежчиков из C++ HPC, считающих что они не менее качественный код пишут заметно быстрее (по времени написания) на Яве.

G>Даже если исходить из того, что

G>трудоемкость си = трудоемкость дотнет

Не "даже", а именно так исходя из написанного тобой выше.

G>в нашей задаче Все равно останется одна проблема, программисты на дотнете стоят дороже программистов на сях в австралии, например.


Ну это ты нашел чем гордиться, да... А потом создаешь темы о дорогом жилье в Сиднее.
Отредактировано 29.05.2015 4:42 mik1 . Предыдущая версия .
Re[16]: C# - from indians by indians
От: greenpci  
Дата: 29.05.15 05:03
Оценка:
Здравствуйте, mik1, Вы писали:

M>Из выделенного очевидно следует равенство сложностей? Я вот знаком с >1 перебежчиков из C++ HPC, считающих что они не менее качественный код пишут заметно быстрее (по времени написания) на Яве.


Значит, в их проектах не было таких жестких ограничений, как в моем случае. У них был плюсный, оптимизированный продукт, который изначально замерили и после переписки нельзя было ничего добавить, ни памяти ни количество нодов? Скорее всего, окажется, что у них "память- не ресурс". И разговор не о качестве, а об ограничениях.

G>>Даже если исходить из того, что

G>>трудоемкость си = трудоемкость дотнет

M>Не "даже", а именно так исходя из написанного тобой выше.


А ты утверждаешь, что можно написать все тоже самое на дотнете, сохранив все ограничения и после этого будет быстрее и легче, с этим работать, чем на сях. Смелое утверждение. Особенно от человека, который не видел наш продукт и даже не знает, что он делает. То есть, я так понимаю, ты говоришь так: все числодробилки на сях, можно переписать на дотнет, сохранив их показатели и в них будет легче и быстрее делать изменения.

G>>в нашей задаче Все равно останется одна проблема, программисты на дотнете стоят дороже программистов на сях в австралии, например.


M>Ну это ты нашел чем гордиться, да... А потом создаешь темы о дорогом жилье в Сиднее.


Переход на личности, однако. Ну ладно, только причем здесь гордость? Не говоря уже о том, что я в такой же мере дотнет программист, как и плюсист. В данный момент, я могу выбирать с чем мне работать.
Re[16]: C# - from indians by indians
От: greenpci  
Дата: 29.05.15 05:08
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>Зарплата зависит от предметной области. Таким образом, даже если абстрактный программист на сях с опытом железок или MFC-кала попробует устроиться на проект, где финансы на шарпе- его не возьмут, даже задёшево не возьмут. А с релевантным опытом плюсника оторвут с руками- и ещё вопрос, захочет ли он сам переходить на калософт .net.


То есть ты говоришь, что нигде не берут без релевантного опыта. Ну тебя же взяли. Или ты с рождения имел релевантный опыт?
Re[17]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 29.05.15 05:29
Оценка:
Здравствуйте, greenpci, Вы писали:

G>То есть ты говоришь, что нигде не берут без релевантного опыта. Ну тебя же взяли. Или ты с рождения имел релевантный опыт?

У меня релевантный опыт был почти 4 года в финансах на тот момент (из общего овер 9000).
Re[10]: C# - from indians by indians
От: Sinix  
Дата: 29.05.15 06:08
Оценка: +2
Здравствуйте, Aртём, Вы писали:

S>>Hotspot jit во многом нужен из-за отсутствия value types в яве.

Aё>Это открытие тянет на Нобелевскую премию
Если тебе похамить — это к другому плиз. По факту ява (ClientVM) с -Xint и дотнет показывают примерно одинаковые результаты, пока дело не доходит до числомолотилок и структур. Там после некоторых приседаний всё тоже одинаково, но уже на server vm с соответствующими флагами


S>> Без них разница с шарпом непринципиальна (что как бы очевидно, в рамках времени, отводимого на jit, ничего сильно пристойного всё равно не сделать).

Aё>Просто уточню, что стандартные коллекции Java боксят любой элемент, потому они медленнее, чем в .NET где есть реализация коллекций под встроенные типы. Но для Java есть сторонние коллекции- под встроенные типы.
Ну да, во времена первого дотнета так же было. Лет 10 назад.


Aё>Теперь по JIT-у — .NET-й не может интерпретировать, потому он всё подряд житит. А качественно оптимизировать jit-й код требует ресурсов, значит есть компромиссы. В отличие от Java JIT, где житятся только горячие участки и может неоднократно jit-ть поверх на критических вещах.

Спасибо, кэп
Ещё раз — на практике вся эта радость даёт 10-20% разброс, и не обязательно в плюс. Я видел и примеры кода, которые с -xInt выполнялись быстрее, ради справедливости, это было на jre 1.5 что ли.
Ну и с ".NET-й не может интерпретировать" — всё оно умеет, просто не выходило особо из недр MS Research. Разве что в .net micro остался (не помню, уже убрали или нет).


S>>В свежих релизах с .NetCore и RyuJit положение потихоньку выправляется, особенно с учётом .net native и возможности трансляции в llvm. Но, очевидно, в ближайщую пару релизов ничего сильно не изменится — сначала надо переползти толком на новые платформы, ничего сильно не потеряв. Дальше — будем посмотреть.

Aё>В переводе на русский- Майкрософт, как всегда, налажал и не спешит исправляться.

*Заинтересованно* а ты вообще умеешь общаться без передёргиваний? Как в анекдоте блин, "дорогая, ты не права ... ... мама, он меня сукой назвал!!!"
Что-то я не вижу логики в "текущий шарп и ява по производительности в основном одинаковы" => "Майкрософт, как всегда, налажал".
Re[10]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.05.15 06:44
Оценка:
S>> Без них разница с шарпом непринципиальна (что как бы очевидно, в рамках времени, отводимого на jit, ничего сильно пристойного всё равно не сделать).
Aё>Просто уточню, что стандартные коллекции Java боксят любой элемент, потому они медленнее, чем в .NET где есть реализация коллекций под встроенные типы. Но для Java есть сторонние коллекции- под встроенные типы. Теперь по JIT-у — .NET-й не может интерпретировать, потому он всё подряд житит. А качественно оптимизировать jit-й код требует ресурсов, значит есть компромиссы. В отличие от Java JIT, где житятся только горячие участки и может неоднократно jit-ть поверх на критических вещах.

Что за бред? Java, кроме самого первого релиза, всегда джитила всё. Hotspotting — это повторный пере-jit горячих участков. А вы пишете так, как будто java всё интерпретирует, джиття только некоторые фрагменты.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: C# - from indians by indians
От: mik1  
Дата: 29.05.15 06:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Что за бред? Java, кроме самого первого релиза, всегда джитила всё. Hotspotting — это повторный пере-jit горячих участков. А вы пишете так, как будто java всё интерпретирует, джиття только некоторые фрагменты.


Прямо таки все? И прямо таки сразу? Как насчет static конструкторов?
И ключик -XX:+PrintCompilation очевидно совершенно бесполезен?
Re[11]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 29.05.15 07:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Что за бред? Java, кроме самого первого релиза, всегда джитила всё. Hotspotting — это повторный пере-jit горячих участков. А вы пишете так, как будто java всё интерпретирует, джиття только некоторые фрагменты.



Wiki несогласна с специалистом

Adaptive optimization is a technique in computer science that performs dynamic recompilation of portions of a program based on the current execution profile. With a simple implementation, an adaptive optimizer may simply make a trade-off between Just-in-time compilation and interpreting instructions. At another level, adaptive optimization may take advantage of local data conditions to optimize away branches and to use inline expansion.

A Virtual Machine like HotSpot is also able to deoptimize a previously JITed code. This allows it to perform aggressive (and potentially unsafe) optimizations, while still being able to deoptimize the code and fall back on a safe path later on.

Re[12]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.05.15 12:11
Оценка: :)
Здравствуйте, mik1, Вы писали:

M>Прямо таки все? И прямо таки сразу?

Прямо таки да — при первом же обращении (отсюда и термин JIT).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.05.15 12:17
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>Wiki несогласна с специалистом

Aё>

Aё>Adaptive optimization is a technique in computer science that performs dynamic recompilation of portions of a program based on the current execution profile. With a simple implementation, an adaptive optimizer may simply make a trade-off between Just-in-time compilation and interpreting instructions. At another level, adaptive optimization may take advantage of local data conditions to optimize away branches and to use inline expansion.

Aё>A Virtual Machine like HotSpot is also able to deoptimize a previously JITed code. This allows it to perform aggressive (and potentially unsafe) optimizations, while still being able to deoptimize the code and fall back on a safe path later on.

Угу. Вики такая вики.
Давайте посмотрим правде в глаза:

JRockit does not include an interpreter; so the JIT compilation of the byte code into native machine code has to occur before a method executes. The JIT compilation is performed the first time a Java method is called.

Т.е. в приличных JVM интерпретатора вовсе нет. То, что теоретически можно построить simple implementation, это хорошо. Но реальная Java уже лет 20 как устроена at another level, то есть HotSpot применяет оптимизации различной агрессивности в зависимости от наблюдений sampling-а. В частности, ЕМНИП (а я на Jave не писал года, примерно, с 2000го) спекулятивный инлайнинг и переупорядочивание бранчей в if и case стейтментах. Вряд ли за истекшие 15 лет JVM стали сильно тупее.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: C# - from indians by indians
От: AlexGin Беларусь  
Дата: 29.05.15 15:24
Оценка: -1
Здравствуйте, Aртём, Вы писали:

Aё>Здравствуйте, greenpci, Вы писали:


G>> UI, например, реализованы на дотнете.

Aё>А вот за масдайность гуя надо руки отбивать.
Странная ситуация: Microsoft делает гуй студии и офиса безо всякого дотнета — на нативном коде.
Это видно невооруженным глазом — посмотри на "мистическое число" 32 в строке с соответствуюшими процессами (Windows Task Manager).
Re[7]: C# - from indians by indians
От: Sinix  
Дата: 29.05.15 20:01
Оценка:
Здравствуйте, AlexGin, Вы писали:

Aё>>А вот за масдайность гуя надо руки отбивать.

AG>Странная ситуация: Microsoft делает гуй студии и офиса безо всякого дотнета — на нативном коде.
AG>Это видно невооруженным глазом — посмотри на "мистическое число" 32 в строке с соответствуюшими процессами (Windows Task Manager).

Кэп: начиная с 2010й студии почти весь ui — wpf. Свежий офис (который для тач-интерфейса) по слухам местами написан с использованием winrt xaml (вот тут я оччень сомневаюсь, но допустим). Стартовое меню в десятке — xaml. Короче, xaml везде Кроме приложений на html (и их вы тоже чёрта с два отличите от обычных).

Кэп #2: разрядность процесса и используемый фреймворк не связаны от слова никак.

Кэп #3: а .net native это куда — в дотнет или в нативный код?
Re[8]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.15 20:38
Оценка: 1 (1)
Здравствуйте, Sinix, Вы писали:

S>Кэп: начиная с 2010й студии почти весь ui — wpf. Свежий офис (который для тач-интерфейса) по слухам местами написан с использованием winrt xaml (вот тут я оччень сомневаюсь, но допустим). Стартовое меню в десятке — xaml. Короче, xaml везде Кроме приложений на html (и их вы тоже чёрта с два отличите от обычных).


Офис еще с версии 97 весь на custom draw со своим layout движком, так что xaml там или еще что-то влияет только на удобство программистов.
Re[7]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.15 20:39
Оценка: 3 (2)
Здравствуйте, AlexGin, Вы писали:

AG>Странная ситуация: Microsoft делает гуй студии и офиса безо всякого дотнета — на нативном коде.

А еще office team сидит на древней версии Visual Source Safe, даже не TFS. Если они не могут сорсконтрол сменить, то как думаешь когд дойдут руки переписать что-либо на .NET?
Кстати для веб-офиса ситуация обратная. Там все на JS+C#\.NET на сервере.
Тебе ситуация кажется странной, потому что ты не понимаешь экономических мотивов технологических решений.

AG>Это видно невооруженным глазом — посмотри на "мистическое число" 32 в строке с соответствуюшими процессами (Windows Task Manager).

А как связана разрядность процесса и native-managed?
Re[11]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.05.15 21:01
Оценка: 2 (1) +2 -1
Здравствуйте, greenpci, Вы писали:

G>Поэтому, в этой переписке на дотнет, была бы только маркетинговая привлекательнось.

Давайте объективно смотреть на вещи. Любой код на любом языке размером от 1М строк никто никогда переписывать не будет. Это экономически неоправданно. Вон даже МС в SharePoint имеет ядро на C++, в котором баги сидят с 2001 года (15 лет уже) и оно обеспечивает наибольшие тормоза платформы.

G>Многие удивятся, но зарплата плюсника в Австралии меньше, чем шарпера при прочих равных. Плюсистов на рынке тьма.

А чего удивительного? C++ программист в единицу времени создает меньше добавленной стоимости, чем программист на C#\Java. В условиях насыщенности рынка падение ЗП C++ программистов вполне закономерно.

G>Честно говоря, я не понимаю, зачем все так хотят переписать все на дотнет и джаву.

Никто переписать не хочет. См выше. Но начинать новый проект выгоднее на более высокоуроневом языке.

G>Я понимаю, что гуй и все где "пямять- не ресурс" писать на дотнете быстрее и дешевле. А там где это ресурс, затраты такие же, как минимум, а то и выше.

Самое смешное, что "память не ресурс" сейчас только лишь на десктопе. А на сервере это ресурс (хоть и дешевый), а на мобильных устройствах — очень дорогой ресурс. Но именно на мобилках и серверах .NET и Java встречается чаще всего.

G>Есть знакомый джавист, который пишет быстрый коннективити на джаве. Он рассказывал, как они там извращяются, что бы сделать это действительно быстрым. По его рассказам, трудоемкость не меньше, чем писать на плюсах и думают они так же, как плюсисты. Просто делают все через призму джавы, то есть еще один уровень абстракции, с которым нужно иметь дело.

Не знаю как на Java, а на .NET есть прекрасный пример — компилятор C# (Roslyn). Мало того, что он на .NET, так написан еще и в функциональном стиле, он генерирует кучу мелких объектов и создает изрядный gc pressure. Тем не менее работает быстрее старого csc компилятора, написанного на C++. В интернетах можно найти докалды как оптимизировали Roslyn. Там вообще не космос, постигнуть может практически кто угодно. И никакого unamanaged не надо. А с unmanaged можно писать на C# как на С (c соответствующими скоростями). Разве что математика не такая быстрая получается, но это вроде новым джитом исправляется.
Re[13]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 30.05.15 00:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

M>>Прямо таки все? И прямо таки сразу?

S>Прямо таки да — при первом же обращении (отсюда и термин JIT).
Вам стоит завести блог о производительности Java.
Re: C# - from indians by indians
От: white_znake  
Дата: 30.05.15 07:49
Оценка: +1
Здравствуйте, mapnik, Вы писали:

M>Господа, я не уверен было уже или нет. Думаю что да, прошу прощения за возможное повторение.

M>Читаю подобные темы и неудержимо тянет на гомерический хохот
M>http://rsdn.ru/forum/dotnet/6006483.flat.1
Автор: Sinix
Дата: 07.04.15

M>http://rsdn.ru/forum/dotnet/6053731.flat.1
Автор: Sinix
Дата: 20.05.15


M>"С# такая няшечка, в нем столько красивых рюшечек...". Все это в целом мило, но что насчет реально нужных фич, которые имеют действительно сильные проверенные временем ОО-языки?

M>Простейший пример оператор const в С++ в применении к функциям (Constant Member Functions).

public class WorldModel
{
  public double Gravity { get { return _gravity; } }
  private readonly double _gravity;

  public double RadiusKm { get { return _radiusKm; } } 
  private readonly double _radiusKm; 

  public double MassKg { get { return _massKg; } }
  private readonly double _massKg; 
  
  public WorldModel(double gravity, double radiusKm, double massKg)
  {
     _gravity = gravity;
     _radiusKm = radiusKm;
     _massKg = massKg;
  }

  public static readonly WorldModel EarthModel = new WorldModel(9.8, 6371, 5.972E24);
}

class Program
{
  static void Main(string[] args)
  {
    //Ooops compile time error.
    WorldModel.EarthModel.Gravity = 10.0; 
  }
}


Так что можно в C# делать аналог константных объектов, которые можно будет изменить только через рефлексию.
Когда я перешел с C++ на C#, то тоже возмущался что нет константных методов, а потом понял, что есть свои паттерны в C# для реализации неизменяемости объекта.
На много сложнее было привыкнуть к разнице работы шаблонов в C++ и дженериков в C#.

P.S. Слабая попытка набрасывания говна на вентилятор — старайся лучше
Re[8]: C# - from indians by indians
От: KRT Украина  
Дата: 30.05.15 08:58
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>Свежий офис (который для тач-интерфейса) по слухам местами написан с использованием winrt xaml (вот тут я оччень сомневаюсь, но допустим).


XAML Case Study: Putting it All Together, Office and XAML
Re[14]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.05.15 11:19
Оценка: +1 :)
Здравствуйте, mik1, Вы писали:

M>1) Time to market уменьшается для последующих изменений.

M>2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах.
Ну конечно же труднее. Потому, что С предоставляет удобный синтаксис для доступа к данным, лежащим внутри этих byte[]. В реальных задачах почти никогда не нужен byte[], зато нужен complex[] c удобным доступом к complex[i].Re и complex[i].Im. А на java, насколько я в курсе, с этим беда — во-первых, из-за отсутствия пользовательских типов, а во-вторых, из-за запрета реинтерпретации памяти чтобы это починить.
Те из моих знакомых, которые оперировали byte[] на джаве, адски плевались — потому, что для вытаскивания реальных данных из byte[] приходилось применять адские колдунства с вызовами в натив. Это резко понижает производительность труда, т.к. вы выходите за пределы поддержки компилятора.
M>3) То, что на Яве молотилки / near realtime делать труднее, чем на плюсах — миф.
Его легко опровергнуть, приведя код перемножения двух complex-массивов, сравнимый по быстродействию с банальным Complex[] operator *=(Complex[] left, Complex[] right).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.05.15 11:23
Оценка:
Здравствуйте, Aртём, Вы писали:
Aё>Вам стоит завести блог о производительности Java.
Вряд ли. Мой опыт с производительностью на Java получен во времена 1.3. Вряд ли все эти годы sun и oracle сидели на попе ровно и никак не улучшали JVM.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 01.06.15 04:00
Оценка: 1 (1)
Здравствуйте, Sinclair, Вы писали:

S>Вряд ли. Мой опыт с производительностью на Java получен во времена 1.3. Вряд ли все эти годы sun и oracle сидели на попе ровно и никак не улучшали JVM.


Ну у Вас весьма много опыта с производительностью на Java, судя по Вашим комментариям- программисты боевых высоконагруженных коннекторов на Java могли бы узнать много нового
Re[15]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 01.06.15 04:04
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Те из моих знакомых, которые оперировали byte[] на джаве, адски плевались — потому, что для вытаскивания реальных данных из byte[] приходилось применять адские колдунства с вызовами в натив. Это резко понижает производительность труда, т.к. вы выходите за пределы поддержки компилятора.

Скажите, а те из ваших знакомых, которые оперировали byte[] на джаве- у них какая специализация?
Re[16]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.06.15 06:54
Оценка:
Здравствуйте, Aртём, Вы писали:
S>>Те из моих знакомых, которые оперировали byte[] на джаве, адски плевались — потому, что для вытаскивания реальных данных из byte[] приходилось применять адские колдунства с вызовами в натив. Это резко понижает производительность труда, т.к. вы выходите за пределы поддержки компилятора.
Aё>Скажите, а те из ваших знакомых, которые оперировали byte[] на джаве- у них какая специализация?
Разработка высокопроизводительных приложений на Java.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: C# - from indians by indians
От: mik1  
Дата: 01.06.15 07:04
Оценка:
Здравствуйте, Sinclair, Вы писали:

M>>1) Time to market уменьшается для последующих изменений.

M>>2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах.

S>Те из моих знакомых, которые оперировали byte[] на джаве, адски плевались — потому, что для вытаскивания реальных данных из byte[] приходилось применять адские колдунства с вызовами в натив. Это резко понижает производительность труда, т.к. вы выходите за пределы поддержки компилятора.


У людей, которым реально приходилось работать с byte[] в Яве, есть мнение, что использовать JNI для этого не умно, т.к. может быть нужно собирать больше одного бинарника.
А вот sun.misc.Unsafe есть всюду (с разными именами). И работает он без просадки производительности.
Re[16]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.06.15 11:28
Оценка: :)
Здравствуйте, mik1, Вы писали:
M>У людей, которым реально приходилось работать с byte[] в Яве, есть мнение, что использовать JNI для этого не умно, т.к. может быть нужно собирать больше одного бинарника.
M>А вот sun.misc.Unsafe есть всюду (с разными именами). И работает он без просадки производительности.
Я по-прежнему жду убедительного примера про умножение комплексных массивов на Java. Можете продемонстрировать чудеса владения sun.misc.Unsafe, если это поможет.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 00:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я по-прежнему жду убедительного примера про умножение комплексных массивов на Java. Можете продемонстрировать чудеса владения sun.misc.Unsafe, если это поможет.

В чём вообще проблема сделать представление области памяти через direct ByteBuffer? Кстати, это документированный способ использования Unsafe.
PS Погуглил жавские квантовые либы — есть http://www.jquantlib.org/en/latest/. Ну и плюснутые либы из жавы никто не отменял — чтоб не изобретать велосипед жава ради жавы.
Re[18]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.15 05:11
Оценка: +1 :)
Здравствуйте, Aртём, Вы писали:

Aё>В чём вообще проблема сделать представление области памяти через direct ByteBuffer? Кстати, это документированный способ использования Unsafe.

Ну, то есть примера не будет. Это же однострочник — его не должно быть трудно написать, не?
Aё>PS Погуглил жавские квантовые либы — есть http://www.jquantlib.org/en/latest/. Ну и плюснутые либы из жавы никто не отменял — чтоб не изобретать велосипед жава ради жавы.
О, вот мы уже приходим к идее, что правильный язык для быстрой математики на Java — это C++.
Я вообще плюсы не очень люблю (во всяком случае, меньше Java), но вы их очень хорошо рекламируете.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: C# - from indians by indians
От: mik1  
Дата: 02.06.15 05:38
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>Я по-прежнему жду убедительного примера про умножение комплексных массивов на Java. Можете продемонстрировать чудеса владения sun.misc.Unsafe, если это поможет.


Вас не затруднит дать ссылку на аналогичный код на плюсах ? Это чтобы было с чем сравнивать.
Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код
Попутно хотелось бы определить, по каким критериям мы сравниваем.
Отредактировано 02.06.2015 5:48 mik1 . Предыдущая версия . Еще …
Отредактировано 02.06.2015 5:47 mik1 . Предыдущая версия .
Отредактировано 02.06.2015 5:44 mik1 . Предыдущая версия .
Re[19]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 06:43
Оценка: -1 :))) :)
Здравствуйте, Sinclair, Вы писали:

S>О, вот мы уже приходим к идее, что правильный язык для быстрой математики на Java — это C++.


правильный язык для быстрой математики — это Python + NumPy. Работать же с плюсами в качестве клея- значит откатиться в развитии назад на 20 лет.
Re[18]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 06:50
Оценка:
Здравствуйте, mik1, Вы писали:

M>Вас не затруднит дать ссылку на аналогичный код на плюсах ? Это чтобы было с чем сравнивать.


LIVE DEMO on Coliru
  Code
#include <boost/range/algorithm.hpp>
#include <boost/range/numeric.hpp>
#include <boost/timer/timer.hpp>
#include <iterator>
#include <cstdlib>
#include <vector>

using namespace std;

struct Complex
{
    double re = 0., im = 0.;
};

Complex operator+(Complex x, Complex y)
{
    return {x.re + y.re, x.im + y.im};
}

Complex operator*(Complex x, Complex y)
{
    return {x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re};
}

Complex random_complex()
{
    return {rand() / 1000. - 1000., rand() / 1000. - 1000.};
}

int main()
{
    constexpr auto N = 1u << 24;
    vector<Complex> v, u;
    v.reserve(N);
    generate_n(back_inserter(v), N, random_complex);
    u = v;
    boost::random_shuffle(v);
    boost::random_shuffle(u);

    {
        boost::timer::auto_cpu_timer t;
        boost::transform(v, u, v.begin(), [](auto x, auto y) { return x*y; });
    }

    volatile auto anti_opti = boost::accumulate(v, Complex{});
    (void)anti_opti;
}


M>Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код


Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.

M>Попутно хотелось бы определить, по каким критериям мы сравниваем.


Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.

P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.
Отредактировано 02.06.2015 7:04 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 02.06.2015 6:54 Evgeny.Panasyuk . Предыдущая версия .
Re[12]: C# - from indians by indians
От: MT-Wizard Украина  
Дата: 02.06.15 07:07
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>Есть знакомый джавист, который пишет быстрый коннективити на джаве. Он рассказывал, как они там извращяются, что бы сделать это действительно быстрым. По его рассказам, трудоемкость не меньше, чем писать на плюсах и думают они так же, как плюсисты. Просто делают все через призму джавы, то есть еще один уровень абстракции, с которым нужно иметь дело.

G>Не знаю как на Java, а на .NET есть прекрасный пример — компилятор C# (Roslyn). Мало того, что он на .NET, так написан еще и в функциональном стиле, он генерирует кучу мелких объектов и создает изрядный gc pressure. Тем не менее работает быстрее старого csc компилятора, написанного на C++. В интернетах можно найти докалды как оптимизировали Roslyn. Там вообще не космос, постигнуть может практически кто угодно. И никакого unamanaged не надо. А с unmanaged можно писать на C# как на С (c соответствующими скоростями). Разве что математика не такая быстрая получается, но это вроде новым джитом исправляется.

Просто прекрасный пример
Только что полазил по отчётам производительности — лучшее что там есть это на 14% медленнее старого компилера (который и не трогают давно) на одном конкретном тесте. Пустите столько же ресурсов в него — и шарп его не догонит ещё лет 200
А ти, москалику, вже приїхав (с)
Отредактировано 02.06.2015 7:11 MT-Wizard . Предыдущая версия .
Re[13]: C# - from indians by indians
От: Sinix  
Дата: 02.06.15 07:41
Оценка:
Здравствуйте, MT-Wizard, Вы писали:

MW>Просто прекрасный пример

MW>Только что полазил по отчётам производительности — лучшее что там есть это на 14% медленнее старого компилера (который и не трогают давно) на одном конкретном тесте. Пустите столько же ресурсов в него — и шарп его не догонит ещё лет 200

Они закрытые вроде были, тынц. Что-то поменялось?
Re[19]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 08:15
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>
EP>using namespace std;
// Bad practice?

EP>struct Complex
EP>{
EP>    double re = 0., im = 0.;
EP>};

EP>Complex operator+(Complex x, Complex y)
// Copy constructors ( Complex const &x, )
EP>{
EP>    return {x.re + y.re, x.im + y.im};
EP>}

EP>Complex operator*(Complex x, Complex y)
EP>{
EP>    return {x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re};
EP>}

EP>Complex random_complex()
EP>{
// std::rand:   #define RAND_MAX /*implementation defined*/. What's the magic number 1000?
EP>    return {rand() / 1000. - 1000., rand() / 1000. - 1000.};
EP>}

EP>int main()
EP>{
EP>    constexpr auto N = 1u << 24;
// Magic number?
EP>



Как там насчёт stack trace в лог при исключении?

EP>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.


EP>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов)

Нужно сделать то же самое, но с объектами на Java- и сравнить производительность.

EP> — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов,

Для начала находить узкие места профилировщиком.
Re[20]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 08:37
Оценка:
Здравствуйте, Aртём, Вы писали:

Aё>Как там насчёт stack trace в лог


В ISO C++ такого нет, но есть платформенно-зависимые варианты.

Aё>при исключении?


А зачем stack trace при исключении? Я понимаю если там что-то типа assertion failure — то да, stack trace полезен, правда в таких случаях лучше как можно быстрее пристрелить программу/dump'ить core/присоединить отладчик, а не пытаться раскручивать стэк.

Да и при чём тут исключения в этом конкретном примере? Тут они возможны разве что при первоначальной аллокации

EP>>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.

EP>>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов)
Aё>Нужно сделать то же самое, но с объектами на Java- и сравнить производительность.

Сделай С Java'овскими объектами будет медленнее в несколько раз, а то и на порядок.

EP>> — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов,

Aё>Для начала находить узкие места профилировщиком.

А ещё лучше знать как оно работает внутри, представлять где и какие издержки получаются — тогда можно принимать оптимальные решения на более ранних этапах.
Re[20]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 08:54
Оценка: +2 :)
Здравствуйте, Aртём, Вы писали:

Сразу не увидел твои комментарии.

EP>>using namespace std;

Aё>// Bad practice?

Нет, не bad — для небольших примеров самое то

EP>>Complex operator+(Complex x, Complex y)

Aё>// Copy constructors ( Complex const &x, )

Для небольших объектов не проблема (а даже наоборот рекомендация), тем более на x64, тем более при инлайнинге. Можешь сравнить ASM вывод, он скорей всего будет идентичным

EP>>Complex random_complex()

EP>>{
Aё>// std::rand: #define RAND_MAX /*implementation defined*/. What's the magic number 1000?
EP>> return {rand() / 1000. — 1000., rand() / 1000. — 1000.};
EP>>}

Для этого примера совершенно не важно. Ты ещё скажи что srand'а нет, или что надо использовать <random>

EP>> constexpr auto N = 1u << 24;

Aё>// Magic number?

Это Да, N — это magic number
Re[18]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.15 09:42
Оценка:
Здравствуйте, mik1, Вы писали:

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


S>>Я по-прежнему жду убедительного примера про умножение комплексных массивов на Java. Можете продемонстрировать чудеса владения sun.misc.Unsafe, если это поможет.


M>Вас не затруднит дать ссылку на аналогичный код на плюсах ? Это чтобы было с чем сравнивать.

M>Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код
Тупой наивный код:
#include <iostream>
#include <iomanip>
#include <complex>
#include <vector>
#include <numeric>

typedef std::complex<double> complex;
typedef std::vector<complex> chunk;

// вот начинается наша реализация векторной арифметики
chunk& operator*=(chunk& lhs, const chunk& rhs)
{
    for (size_t k = 0; k < lhs.size(); k++)
        lhs[k] *= rhs[k];
    return lhs;
}

chunk operator*(const chunk& lhs, const chunk& rhs)
{
    chunk res(lhs);
    return res *= rhs;
}
// а вот она закончилась.

int main()
{
    std::cout << std::fixed << std::setprecision(1);

    auto i = complex(0., 1.); // определили корень из минус единицы

    auto const s = 40000;
    auto data = std::vector<complex>(s, i); // создали массив размером в s элементов из i

    auto data2 = data * data; // возвели его в квадрат при помощи только что навелосипеженного оператора умножения

    auto sum = std::accumulate(data2.begin(), data2.end(), complex(0.)); // посчитали сумму массива
    std::cout << "sum(data2[]) = " << sum << '\n'; // чтобы проверить, что она равна -s.
    

}

M>Попутно хотелось бы определить, по каким критериям мы сравниваем.
Во-первых — по читаемости кода. Код читается чаще, чем пишется, поэтому арифметике лучше выглядеть как арифметике.
Во-вторых — по производительности. Желательно, чтобы в этом простом тесте джава-код выполнялся хотя бы в пределах 2х от времени, потраченного С++ кодом.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 10:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>typedef std::complex<double> complex;


Я думал изначально речь шла о том чтобы показать как реализуется complex, а не использовать стандартный. А то так можно дойти и до использования библиотек типа Eigen со своим Embeded Domain Specific Language, и оптимизатором выражений в compile-time.

S>Во-первых — по читаемости кода. Код читается чаще, чем пишется, поэтому арифметике лучше выглядеть как арифметике.


Вообще, отсутствие структур в Java сказывается далеко не только на арифметике и подобном — оно сказывается практически на всём. Любой struct-like под-объект это уже penalty.

Кстати, в C# хоть и есть структуры — ими не всегда удобно пользоваться — например когда есть class, хотя в одном из контекстов он мог бы быть и struct. Или даже вот такой пример
Автор: Evgeny.Panasyuk
Дата: 11.10.14
.

S>Во-вторых — по производительности. Желательно, чтобы в этом простом тесте джава-код выполнялся хотя бы в пределах 2х от времени, потраченного С++ кодом.


Для пущего эффекта элементы массива нужно как-нибудь перетасовать.
Re[21]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 10:25
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нет, не bad — для небольших примеров самое то

Небольшой пример простит бэд практис?

EP>>>Complex operator+(Complex x, Complex y)

Aё>>// Copy constructors ( Complex const &x, )

EP>Для небольших объектов не проблема (а даже наоборот рекомендация), тем более на x64, тем более при инлайнинге. Можешь сравнить ASM вывод, он скорей всего будет идентичным

Я уже не знаток плюсов- просто выделил, что сразу бросается в глаза Дальше уже Ваши домыслы "скорей всего" "тем более" и т.п.


EP>Для этого примера совершенно не важно. Ты ещё скажи что srand'а нет, или что надо использовать <random>

Обычно вычисления производят ради какого-то смысла.

EP>>> constexpr auto N = 1u << 24;

Aё>>// Magic number?

EP>Это Да, N — это magic number

2^24 можно было записать числом.

PS Суммируя- векторные инструкции и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули, вразумительный ответ на вопрос про обработчик исключения с стек трейс в лог не привели. Зато голословные утверждения про скорость C++ с ложным примером.
Re[22]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 11:06
Оценка: +2
Здравствуйте, Aртём, Вы писали:

EP>>Нет, не bad — для небольших примеров самое то

Aё>Небольшой пример простит бэд практис?

Нет, ты не понял. Что называется "гуд/бэд практис" зависит от характера задачи.
То что для больших проектов может быть "бэд практис", для небольших примеров может быть вполне нормальным.

EP>>>>Complex operator+(Complex x, Complex y)

Aё>>>// Copy constructors ( Complex const &x, )
EP>>Для небольших объектов не проблема (а даже наоборот рекомендация), тем более на x64, тем более при инлайнинге. Можешь сравнить ASM вывод, он скорей всего будет идентичным
Aё>Я уже не знаток плюсов- просто выделил, что сразу бросается в глаза

О том и речь — ты не знаешь о чём говоришь.

Aё>Дальше уже Ваши домыслы "скорей всего" "тем более" и т.п.


Это не домыслы, а опыт. Если ты в этом сомневаешься — то открой ссылку с Live Demo, добавь ключик -S и сравни ASM для обоих вариантов

EP>>Для этого примера совершенно не важно. Ты ещё скажи что srand'а нет, или что надо использовать <random>

Aё>Обычно вычисления производят ради какого-то смысла.

Опять мимо. Если требуется сравнить скорость двух вариантов hadamard product, то можно обойтись и случайными данными, главное не денормализированными.

EP>>>> constexpr auto N = 1u << 24;

Aё>>>// Magic number?
EP>>Это Да, N — это magic number
Aё>2^24 можно было записать числом.

Зачем?

Aё>PS Суммируя- векторные инструкции


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

Да даже если в Java-версии с Complex объектами будет векторизация, она всё равно будет медленнее C++ версии без векторизации — из-за плохого паттерна доступа к памяти — сути примера это никак не поменяет.

Aё>и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули,


А зачем его упоминать? Думаешь код перемножения массивов не уместится в intruction cache?

Aё>вразумительный ответ на вопрос про обработчик исключения с стек трейс в лог не привели.


Это вообще какой-то левый запрос совершенно не относящийся к теме

Aё>Зато голословные утверждения про скорость C++ с ложным примером.


Твоё мнение обоснованно и очень интересно
Re[23]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 11:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нет, ты не понял. Что называется "гуд/бэд практис" зависит от характера задачи.

EP>То что для больших проектов может быть "бэд практис", для небольших примеров может быть вполне нормальным.
Небольшой пример стерпит, ну я про то и написал.

EP>>>>>Complex operator+(Complex x, Complex y)

Aё>>>>// Copy constructors ( Complex const &x, )
EP>>>Для небольших объектов не проблема (а даже наоборот рекомендация), тем более на x64, тем более при инлайнинге. Можешь сравнить ASM вывод, он скорей всего будет идентичным
Aё>>Я уже не знаток плюсов- просто выделил, что сразу бросается в глаза

EP>О том и речь — ты не знаешь о чём говоришь.

Переход на личности засчитан

Aё>>Дальше уже Ваши домыслы "скорей всего" "тем более" и т.п.


EP>Это не домыслы, а опыт. Если ты в этом сомневаешься — то открой ссылку с Live Demo, добавь ключик -S и сравни ASM для обоих вариантов

Не удивлюсь, что опыта именно в C++ у меня поболее Вашего окажется

EP>Для векторизации есть готовые библиотеки и опции компилятора. В данном конкретном примере в первую очередь нужно распараллеливание, а не векторизация.

Что?!

EP>Да даже если в Java-версии с Complex объектами будет векторизация, она всё равно будет медленнее C++ версии без векторизации — из-за плохого паттерна доступа к памяти — сути примера это никак не поменяет.

Вы так ничего и не поняли. А ведь я указывал парой сообщений выше- что Python с NumPy порвёт ваш плюснутый код, как тузик грелку. Потому что узкие места ускоряются через использование заточенной библиотеки. А вот в качестве "клея" С++ — далеко не лучший вариант, и Вы не хотите этой очевидной вещи замечать.

Aё>>и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули,

EP>А зачем его упоминать? Думаешь код перемножения массивов не уместится в intruction cache?
Думаю, что реальные задачи сложнее Вашего примера, а шаблоны C++ имеют дурную репутацию разбухания кода.

Aё>>вразумительный ответ на вопрос про обработчик исключения с стек трейс в лог не привели.

EP>Это вообще какой-то левый запрос совершенно не относящийся к теме
Если сравнивать абстрактного коня в вакууме- не относящийся. А если критическая отказоустойчивая система 24/7 без потери производительности от фрагментации кучи и при этом быстрая- то Java со специализированными библиотеками оказывается более разумным выбором.
Re[24]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 11:55
Оценка: +1 :)
Здравствуйте, Aртём, Вы писали:

EP>>Нет, ты не понял. Что называется "гуд/бэд практис" зависит от характера задачи.

EP>>То что для больших проектов может быть "бэд практис", для небольших примеров может быть вполне нормальным.
Aё>Небольшой пример стерпит, ну я про то и написал.

Нет, дело не в том что "стерпит".

Ок, другой пример — глобальные объекты для многих проектов это "бэд практис", для некоторых же это вполне стандартное решение — типа микроконтроллеров
Практически у каждой языковой фичи есть вполне хорошие применения, даже несмотря на то что в некоторых контекстах это считается "бэд практис".

EP>>>>>>Complex operator+(Complex x, Complex y)

Aё>>>>>// Copy constructors ( Complex const &x, )
EP>>>>Для небольших объектов не проблема (а даже наоборот рекомендация), тем более на x64, тем более при инлайнинге. Можешь сравнить ASM вывод, он скорей всего будет идентичным
Aё>>>Я уже не знаток плюсов- просто выделил, что сразу бросается в глаза
EP>>О том и речь — ты не знаешь о чём говоришь.
Aё>Переход на личности засчитан

А где переход на личности? Ты ведь действительно не знаешь что там внутри происходит, разве нет? При этом делаешь какие-то нелепые попытки придраться.
ASM уже посмотрел?

Aё>>>Дальше уже Ваши домыслы "скорей всего" "тем более" и т.п.

EP>>Это не домыслы, а опыт. Если ты в этом сомневаешься — то открой ссылку с Live Demo, добавь ключик -S и сравни ASM для обоих вариантов
Aё>Не удивлюсь, что опыта именно в C++ у меня поболее Вашего окажется

Даже если и больше по продолжительности, то по качеству — судя по всему нет

EP>>Для векторизации есть готовые библиотеки и опции компилятора. В данном конкретном примере в первую очередь нужно распараллеливание, а не векторизация.

Aё>Что?!

Что не понятно? Распараллеливание даст больший эффект нежели векторизация.

EP>>Да даже если в Java-версии с Complex объектами будет векторизация, она всё равно будет медленнее C++ версии без векторизации — из-за плохого паттерна доступа к памяти — сути примера это никак не поменяет.

Aё>Вы так ничего и не поняли.

Куда уж там.

Aё>А ведь я указывал парой сообщений выше- что Python с NumPy порвёт ваш плюснутый код, как тузик грелку.


По какому критерию?

Aё>Потому что узкие места ускоряются через использование заточенной библиотеки.


Которая далеко не всегда существует.

Aё>А вот в качестве "клея" С++ — далеко не лучший вариант,


Аргументы?

Aё>и Вы не хотите этой очевидной вещи замечать.


Вещь совершенно не очевидная.

Aё>>>и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули,

EP>>А зачем его упоминать? Думаешь код перемножения массивов не уместится в intruction cache?
Aё>Думаю, что реальные задачи сложнее Вашего примера, а шаблоны C++ имеют дурную репутацию разбухания кода.

В реальных задачах там где нужно используется динамический полиморфизм вместо статического, причём обычно где-то наверху. Это на порядки проще чем "работа вопреки языку" (как в тех случаях когда нужна скорость на Java).

Aё>>>вразумительный ответ на вопрос про обработчик исключения с стек трейс в лог не привели.

EP>>Это вообще какой-то левый запрос совершенно не относящийся к теме
Aё>Если сравнивать абстрактного коня в вакууме- не относящийся. А если критическая отказоустойчивая система 24/7 без потери производительности от фрагментации кучи и при этом быстрая- то Java со специализированными библиотеками оказывается более разумным выбором.

Даже если допустить что это так — того факта что в Java нет структур, и связанными с этим тормозами или танцами с ручной нарезкой массивов байт на структуры, или факта того что в нагруженных приложениях частенько отказываются от GC — это никак не отменяет.
Re[25]: C# - from indians by indians
От: Sinix  
Дата: 02.06.15 12:12
Оценка: 1 (1) +2 :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нет, дело не в том что "стерпит".

Сорри, но вы кормите тролля. Тема конечно интересная, но толку от этого не будет.
Зато наездов, перескоков на исключения и сторонние библиотеки типа Colt/NumPy будет выше крыши.

UPD Надо же, с NumPy угадал
Re[20]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.15 12:12
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Я думал изначально речь шла о том чтобы показать как реализуется complex, а не использовать стандартный. А то так можно дойти и до использования библиотек типа Eigen со своим Embeded Domain Specific Language, и оптимизатором выражений в compile-time.
На мой взгляд речь, в основном, о том, как дописать арифметику последовательностей на основе value-types.
Важно не то, самописаные там комплексы или нет. Важно то, что мы работаем не с byte[], а с complex[], и имеем нулевой penalty по памяти.
А с учётом инлайнинга мы ещё и можем рассчитывать на некоторый бонус в смысле отсутствия penalty на абстрактность операций умножения.
Не глядя в дизассемблер, я предположу, что более-менее любой компилятор с++, выпущенный после 2000 года, не оставит от строчки data3 = data1 * data2 ни одного call. Будет примерно такая же double арифметика, которую бы я выписал руками в виде
data3_as_doubles[2*i] = data1_as_doubles[2*i]*data2_as_doubles[2*i]-data1_as_doubles[2*i+1]*data2_as_doubles[2*i+1];
data3_as_doubles[2*i+1] = data1_as_doubles[2*i]*data2_as_doubles[2*i+1]+data1_as_doubles[2*i+1]*data2_as_doubles[2*i];


EP>Вообще, отсутствие структур в Java сказывается далеко не только на арифметике и подобном — оно сказывается практически на всём. Любой struct-like под-объект это уже penalty.

Просто далеко не везде это так важно.

EP>Кстати, в C# хоть и есть структуры — ими не всегда удобно пользоваться — например когда есть class, хотя в одном из контекстов он мог бы быть и struct.

Для вашей синтетической задачи есть не менее синтетическое решение в видe struct Triangle : IShape. В реальной жизни вы вспотеете искать такие примеры, где нужно наследование реализации для value типов.

EP>Для пущего эффекта элементы массива нужно как-нибудь перетасовать.

Это вовсе необязательно. Давайте сначала посмотрим на код, который нам предложат матёрые спецы по number-crunching в Java.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 12:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

EP>>Я думал изначально речь шла о том чтобы показать как реализуется complex, а не использовать стандартный. А то так можно дойти и до использования библиотек типа Eigen со своим Embeded Domain Specific Language, и оптимизатором выражений в compile-time.

S>На мой взгляд речь, в основном, о том, как дописать арифметику последовательностей на основе value-types.
S>Важно не то, самописаные там комплексы или нет. Важно то, что мы работаем не с byte[], а с complex[], и имеем нулевой penalty по памяти.

Да, согласен. Изначально подумал что с самописным complex будет нагляднее.

S>А с учётом инлайнинга мы ещё и можем рассчитывать на некоторый бонус в смысле отсутствия penalty на абстрактность операций умножения.

S>Не глядя в дизассемблер, я предположу, что более-менее любой компилятор с++, выпущенный после 2000 года, не оставит от строчки data3 = data1 * data2 ни одного call. Будет примерно такая же double арифметика, которую бы я выписал руками в виде
S>
S>data3_as_doubles[2*i] = data1_as_doubles[2*i]*data2_as_doubles[2*i]-data1_as_doubles[2*i+1]*data2_as_doubles[2*i+1];
S>data3_as_doubles[2*i+1] = data1_as_doubles[2*i]*data2_as_doubles[2*i+1]+data1_as_doubles[2*i+1]*data2_as_doubles[2*i];
S>


Да, там конечно же всё хорошо заинлайнится, и не будет уступать "ручной" версии.

Кстати, библиотека типа Eigen реализует дополнительные оптимизации — например конструкция вида
Vector result = v1 * v2 * v3 * v4;
Развернётся в один цикл сразу по всем векторам.

EP>>Вообще, отсутствие структур в Java сказывается далеко не только на арифметике и подобном — оно сказывается практически на всём. Любой struct-like под-объект это уже penalty.

S>Просто далеко не везде это так важно.

Не везде, но всё же бывает важно в том числе и для вещей без всякой арифметики.

EP>>Для пущего эффекта элементы массива нужно как-нибудь перетасовать.

S>Это вовсе необязательно. Давайте сначала посмотрим на код, который нам предложат матёрые спецы по number-crunching в Java.

Это может ухудшить показатели Java кода в разы, так как по умолчанию compacting GC выделяет память последовательно. Перемешав указатели в массиве — уже не получится последовательный обход памяти.
Re[19]: C# - from indians by indians
От: mik1  
Дата: 02.06.15 16:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


M>>Вас не затруднит дать ссылку на аналогичный код на плюсах ? Это чтобы было с чем сравнивать.

M>>Для чистоты экперимента — без нестандартных зависимостей, чтобы мне, не работавшему с плюсами много веков, не так сложно было собирать и запускать этот код

EP>Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.


M>>Попутно хотелось бы определить, по каким критериям мы сравниваем.


EP>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.


EP>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.


Давай пока что так, требует JMH, которому я доверяю тестировать производительность:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;

@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@Fork(1)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
@BenchmarkMode(Mode.AverageTime)
public class ComplexTest2 {

    private static class ComplexFlyweight
    {
        private final double[] ar;

        public ComplexFlyweight(double[] ar) {
            this.ar = ar;
        }

        public double re( int i )
        {
            return ar[ i *2 ];
        }

        public double im( int i )
        {
            return ar[ i * 2 + 1 ];
        }

        public void re( int i, double v )
        {
            ar[i * 2] = v;
        }

        public void im( int i, double v )
        {
            ar[i * 2+1] = v;
        }
    }

    private static final int N = 1 << 24;

    private double[] u_ar = new double[ N * 2 ];
    private double[] v_ar = new double[ N * 2 ];
    private ComplexFlyweight u = new ComplexFlyweight( u_ar );
    private ComplexFlyweight v = new ComplexFlyweight( v_ar );

    @Setup
    public void setup()
    {
        for ( int i = 0; i < v_ar.length; ++i ) {
            u_ar[i] = ThreadLocalRandom.current().nextInt( 32767 ) / 1000. - 1000.;
            v_ar[i] = ThreadLocalRandom.current().nextInt( 32767 ) / 1000. - 1000.;
        }
    }

    @Benchmark
    public double testVectorMult()
    {

        for ( int i = 0; i < u_ar.length / 2; ++i ) {
            v.re(i, u.re(i) * v.re(i) - u.im(i) * v.im(i) );
            v.im(i, u.re(i)*v.im(i) + u.im(i)*v.re(i));
        }
        return u.re( 0 );
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(".*" + ComplexTest2.class.getSimpleName() + ".*")
                .build();

        new Runner(opt).run();
    }
}


rand() пришлось эмулировать (правильно?), для доступа к полям flyweight написал.


Сейчас времени устанавливать плюсовое окружение нет, завтра посмотрю, за сколько твоя версия у меня отрабатывает.
# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: info.javaperformance.gccheck.ComplexTest2.testVectorMult

# Run progress: 0.00% complete, ETA 00:00:20
# Fork: 1 of 1
# Warmup Iteration   1: 60.429 ms/op
# Warmup Iteration   2: 58.038 ms/op
# Warmup Iteration   3: 58.117 ms/op
# Warmup Iteration   4: 57.762 ms/op
# Warmup Iteration   5: 57.733 ms/op
# Warmup Iteration   6: 57.863 ms/op
# Warmup Iteration   7: 57.885 ms/op
# Warmup Iteration   8: 57.698 ms/op
# Warmup Iteration   9: 57.609 ms/op
# Warmup Iteration  10: 57.925 ms/op
Iteration   1: 57.761 ms/op
Iteration   2: 57.685 ms/op
Iteration   3: 57.779 ms/op
Iteration   4: 57.570 ms/op
Iteration   5: 57.640 ms/op
Iteration   6: 57.743 ms/op
Iteration   7: 57.762 ms/op
Iteration   8: 57.696 ms/op
Iteration   9: 57.668 ms/op
Iteration  10: 57.756 ms/op


Result: 57.706 ±(99.9%) 0.101 ms/op [Average]
  Statistics: (min, avg, max) = (57.570, 57.706, 57.779), stdev = 0.067
  Confidence interval (99.9%): [57.605, 57.807]


# Run complete. Total time: 00:00:25

Benchmark                            Mode  Samples   Score  Score error  Units
i.j.g.ComplexTest2.testVectorMult    avgt       10  57.706        0.101  ms/op

Конкретно здесь классов нужно избегать из-за ненужной нагрузки на GC.
Re[20]: C# - from indians by indians
От: mik1  
Дата: 02.06.15 16:26
Оценка:
Здравствуйте, mik1, Вы писали:

M>Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>>Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.


Да, кстати буст хорошо бы убрать из примера (как обещано).

M>>>Попутно хотелось бы определить, по каким критериям мы сравниваем.


EP>>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.


Сложно? Если разные типы намешаны — возьму direct ByteBuffer.

EP>>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.


Надо бы графы пообходить... и посмотреть, как там с управлением памятью
Re[20]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 16:53
Оценка:
Здравствуйте, mik1, Вы писали:

M>Давай пока что так, требует JMH, которому я доверяю тестировать производительность:

M>
M>        public double re( int i )
M>        {
M>            return ar[ i *2 ];
M>        }
M>        public double im( int i )
M>        {
M>            return ar[ i * 2 + 1 ];
M>        }
M>    ...
M>    private static final int N = 1 << 24;

M>    private double[] u_ar = new double[ N * 2 ];
M>    private double[] v_ar = new double[ N * 2 ];
M>    private ComplexFlyweight u = new ComplexFlyweight( u_ar );
M>    private ComplexFlyweight v = new ComplexFlyweight( v_ar );

M>    ...
M>    @Benchmark
M>    public double testVectorMult()
M>    {

M>        for ( int i = 0; i < u_ar.length / 2; ++i ) {
M>            v.re(i, u.re(i) * v.re(i) - u.im(i) * v.im(i) );
M>            v.im(i, u.re(i)*v.im(i) + u.im(i)*v.re(i));
M>        }
M>        return u.re( 0 );
M>    }
M>


Здесь используется не класс типа Complex, а класс типа ComplexArray.
Собственно об этом и была речь — простейшая абстракция Complex не совместима с производительностью. То есть нельзя просто отдельно создать класс Complex и положить его в отдельный стандартный массив, в стандартную deque, в стандартную priority_queue и т.п. — их приходится вручную скрещивать.
Причём если взять структуру чуть-чуть посложнее, типа {double, float, int} — то всё, приплыли капитально.

M>Конкретно здесь классов нужно избегать из-за ненужной нагрузки на GC.


В этом примере (перемножение массивов объектов Complex) — тормоза на Java будут даже без учёта GC.
Отредактировано 02.06.2015 17:09 Evgeny.Panasyuk . Предыдущая версия .
Re[21]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 02.06.15 17:40
Оценка:
Здравствуйте, mik1, Вы писали:

EP>>>Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.

M>Да, кстати буст хорошо бы убрать из примера (как обещано).

LIVE DEMO on Coliru
  Code
#include <algorithm>
#include <iterator>
#include <iostream>
#include <numeric>
#include <cstdlib>
#include <vector>
#include <chrono>
using namespace std;

struct Complex
{
    double re = 0., im = 0.;
};

Complex operator+(Complex x, Complex y)
{
    return {x.re + y.re, x.im + y.im};
}

Complex operator*(Complex x, Complex y)
{
    return {x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re};
}

Complex random_complex()
{
    return {rand() / 1000. - 1000., rand() / 1000. - 1000.};
}

template<typename F>
void benchmark(F f)
{
    using namespace chrono;
    auto start = high_resolution_clock::now();
    f();
    auto end = high_resolution_clock::now();
    auto elapsed = end - start;
    cout << "Elapsed = " << duration_cast<duration<double>>(elapsed).count() << "s" << endl;
}

int main()
{
    constexpr auto N = 1u << 24;
    vector<Complex> v, u;
    v.reserve(N);
    generate_n(back_inserter(v), N, random_complex);
    u = v;
    random_shuffle(begin(v), end(v));
    random_shuffle(begin(u), end(u));

    benchmark([&]
    {
        transform(begin(v), end(v), begin(u), begin(v), [](auto x, auto y) { return x*y; });
    });

    volatile auto anti_opti = accumulate(begin(v), end(v), Complex{});
    (void)anti_opti;
}


M>>>>Попутно хотелось бы определить, по каким критериям мы сравниваем.

EP>>>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.
M>Сложно? Если разные типы намешаны — возьму direct ByteBuffer.

Так о том и речь, приходится отказываться от удобных средств и использовать быстрые-неудобные, в то время как такой дилеммы могло бы и не быть.
Re[25]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 02.06.15 23:01
Оценка: -1 :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Ок, другой пример — глобальные объекты для многих проектов это "бэд практис", для некоторых же это вполне стандартное решение — типа микроконтроллеров

Вы в курсе, что под микроконтроллеры нету C++?

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

Я уже Вам 3 раза повторил, что удобный доступ к памяти из C++ — для вычислений не значит ничего, ибо Ваш код C++ тормозной по сравнению с специализированными библиотеками. При этом Ваш код неустойчив, а на вопрос "как записать ошибку и тректрейс в лог", Вы предлагаете убивать программу. Т.е. это уже довольно много говорит о том, что 24/7 код Вы не задумывались, как писать.

EP>Даже если и больше по продолжительности, то по качеству — судя по всему нет

99/100 в IKM в 2011г- но без фич C++'11. Мог и подзабыть уже что-то, ибо с 2011г на плюсах не делал проекты.

EP>Что не понятно? Распараллеливание даст больший эффект нежели векторизация.

Почитайте про цену синхронизации. Узнайте много нового .

EP>>>Да даже если в Java-версии с Complex объектами будет векторизация, она всё равно будет медленнее C++ версии без векторизации — из-за плохого паттерна доступа к памяти — сути примера это никак не поменяет.

Aё>>Вы так ничего и не поняли.

EP>Куда уж там.

Попробую объяснить — сделайте N-мерный массив, сделайте обёртку с доступом по смешению через direct ByteBuffer- и будет счастье.

Aё>>А ведь я указывал парой сообщений выше- что Python с NumPy порвёт ваш плюснутый код, как тузик грелку.

EP>По какому критерию?
По скорости и выразительности.

Aё>>Потому что узкие места ускоряются через использование заточенной библиотеки.


EP>Которая далеко не всегда существует.

Не тешьте себя иллюзиями- всё украли до нас, причём ещё во времена Фортрана.

Aё>>А вот в качестве "клея" С++ — далеко не лучший вариант,


EP>Аргументы?

Я привёл Вам аргумент- неустойчивый код, отсутствие логирования стек трейсов, фрагментация кучи. Вам мало? Ну добавить ещё киллер-фичу перегрузка оператора aka выстрелить себе в ногу. В код выглядит выразительным и коротким, но программист на самом деле не знает, как оно под капотом работает. И не понимает, что не знает.

Aё>>>>и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули,

EP>>>А зачем его упоминать? Думаешь код перемножения массивов не уместится в intruction cache?
Aё>>Думаю, что реальные задачи сложнее Вашего примера, а шаблоны C++ имеют дурную репутацию разбухания кода.

EP>В реальных задачах там где нужно используется динамический полиморфизм вместо статического, причём обычно где-то наверху. Это на порядки проще чем "работа вопреки языку" (как в тех случаях когда нужна скорость на Java).

Кажется, кто-то ставил Java в вину отсутствие статического полиморфизма- и тут же готов в реальных задачах от него отказаться. Вот и C++ "где-то наверху" не нужен. А "где-то внизу" он тоже не нужен, ибо есть библиотеки на C, где авторы в курсе про векторные расширения, кэш процессора, и т.д..

EP>Даже если допустить что это так — того факта что в Java нет структур, и связанными с этим тормозами или танцами с ручной нарезкой массивов байт на структуры, или факта того что в нагруженных приложениях частенько отказываются от GC — это никак не отменяет.

Не отказываются от GC- а минимизируют освобождение памяти. Обратите внимание, это и программ на C++ касается (фрагментация кучи).
Re[21]: C# - from indians by indians
От: mik1  
Дата: 02.06.15 23:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здесь используется не класс типа Complex, а класс типа ComplexArray.

EP>Собственно об этом и была речь — простейшая абстракция Complex не совместима с производительностью. То есть нельзя просто отдельно создать класс Complex и положить его в отдельный стандартный массив, в стандартную deque, в стандартную priority_queue и т.п. — их приходится вручную скрещивать.

А вот тут ты немного обманываешься — ни в деке, ни в очереди ты уже безразрывный блок памяти не получишь, и весь твой выигрыш рискует превратиться в тыкву

EP>Причём если взять структуру чуть-чуть посложнее, типа {double, float, int} — то всё, приплыли капитально.


Давай по честному — мой код по длине не сильно больше твоего. По производительности подозреваю что тоже похож. По сложности — тоже самое.
Синклер тут где-то заявлял, что такое в принципе невозможно.
Просто поверь, что более сложную логику я точно также напишу (но за деньги ).
Да, и мне казалось в числодробилках обычно довольно однородные типы данных обрабатываются.

EP>В этом примере (перемножение массивов объектов Complex) — тормоза на Java будут даже без учёта GC.


"Тормоза" тут будут только от 12-16 байтов заголовка объекта в Яве, которые будут "разрывать" последовательность даблов.
Как только ты уйдешь от массивов в плюсах, все станет на свои места. Кроме того, как я уже намекнул, твой пример скромно обходит любые выделения памяти
Отредактировано 03.06.2015 3:14 mik1 . Предыдущая версия .
Re[22]: C# - from indians by indians
От: mik1  
Дата: 03.06.15 03:33
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

M>>Да, кстати буст хорошо бы убрать из примера (как обещано).


g++ 4.9.2 под cygwin не хочет компилить с командной строкой с Coliru. std=c++14 распознает.
Все 3 ошибки идентичные — на создание объектов:
main.cpp: In function 'Complex operator+(Complex, Complex)':
main.cpp:17:37: error: could not convert '{(x.Complex::re + y.Complex::re), (x.Complex::im + y.Complex::im)}' from '<brace-enclosed initializer list>' to 'Complex'
     return {x.re + y.re, x.im + y.im};
Re[14]: C# - from indians by indians
От: MT-Wizard Украина  
Дата: 03.06.15 04:40
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, MT-Wizard, Вы писали:


MW>>Просто прекрасный пример

MW>>Только что полазил по отчётам производительности — лучшее что там есть это на 14% медленнее старого компилера (который и не трогают давно) на одном конкретном тесте. Пустите столько же ресурсов в него — и шарп его не догонит ещё лет 200

S>Они закрытые вроде были, тынц. Что-то поменялось?


Ну я по внутриМСным полазил.
А ти, москалику, вже приїхав (с)
Re[22]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.15 05:58
Оценка: 2 (1) +2
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Да, там конечно же всё хорошо заинлайнится, и не будет уступать "ручной" версии.


EP>Кстати, библиотека типа Eigen реализует дополнительные оптимизации — например конструкция вида

EP>
EP>Vector result = v1 * v2 * v3 * v4;
EP>
Развернётся в один цикл сразу по всем векторам.

Ну вот фишка-то как раз в том, что в С++ у меня развязаны руки.
Я могу натравить профайлер на моё приложение, посмотреть, где теряется время, и переделать оператор умножения векторов так, чтобы он возвращал deferredMultiplication<T>, а реальные умножения/сложения выполнял при конверсии в Vector. Потом повторно натравить профайлер и посмотреть, не испортило ли это локальность кэшей — и так по кругу, пока не получу нужную производительность.
При этом в самом коде вычисления result = v1 * v2 * v3 * v4 у меня не будет ни следа этих оптимизаций; т.е. я не ломаю корректную программу, и она остаётся читаемой даже после пяти циклов оптимизации.

EP>Это может ухудшить показатели Java кода в разы, так как по умолчанию compacting GC выделяет память последовательно. Перемешав указатели в массиве — уже не получится последовательный обход памяти.

Нам обещали работу с byte[] через misc.Unsafe, чтобы избежать boxing penalty. Я уже запасся попкорном и орешками, т.к. раньше такого не видел.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[22]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 03.06.15 06:02
Оценка:
Здравствуйте, mik1, Вы писали:

EP>>Здесь используется не класс типа Complex, а класс типа ComplexArray.

EP>>Собственно об этом и была речь — простейшая абстракция Complex не совместима с производительностью. То есть нельзя просто отдельно создать класс Complex и положить его в отдельный стандартный массив, в стандартную deque, в стандартную priority_queue и т.п. — их приходится вручную скрещивать.
M>А вот тут ты немного обманываешься — ни в деке, ни в очереди ты уже безразрывный блок памяти не получишь, и весь твой выигрыш рискует превратиться в тыкву

Реализации std::deque внутри используют непрерывные chunk'и. std::priority_queue по-умолчанию хранит все элементы в одном vector.
Да даже если взять node-based структуру данных — в Java в каждом узле будет хранится не элемент, а указатель, а это лишняя индерекция, что бьёт по производительности — в общем случае вместо одного cache miss'а будет два.

EP>>Причём если взять структуру чуть-чуть посложнее, типа {double, float, int} — то всё, приплыли капитально.

M>Давай по честному — мой код по длине не сильно больше твоего.

Вот только делает он не то что было запрошено — ComplexArray вместо Complex, со всеми вытекающими отсюда следствиями: в другую структуру данных комплексное число не положить, передать в функцию/использовать внутри несколько отдельных Complex чисел не получится, со сторонними алгоритмами типа std::inner_product — это не работает.

M>По производительности подозреваю что тоже похож.


Так я сразу сказал:

EP>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.

По факту так и получилось — ниже чем в C, так как даже там можно сделать массив complex без ручной нарезки.

M>По сложности — тоже самое.


Нет. Вот это:
M>            return ar[ i * 2 + 1 ];
M> ...
M>            ar[i * 2+1] = v;
M> ...
M>       private double[] u_ar = new double[ N * 2 ];
M> ...
M>        for ( int i = 0; i < u_ar.length / 2; ++i ) {
M>            v.re(i, u.re(i) * v.re(i) - u.im(i) * v.im(i) );
M>            v.im(i, u.re(i)*v.im(i) + u.im(i)*v.re(i));
M>        }
Сложнее чем описание того как работает одно комплексное число.

M>Синклер тут где-то заявлял, что такое в принципе невозможно.


ЕМНИП он другое заявлял. Тем не менее, у тебя не реализовано даже что-то отдалённо напоминающее отдельное комплексное число.

M>Просто поверь, что более сложную логику я точно также напишу (но за деньги ).


Верю. Повторюсь — на Java можно писать быстрый код. Но этот код будет на порядке сложнее чем например на C++, а иногда даже чем C.

M>Да, и мне казалось в числодробилках обычно довольно однородные типы данных обрабатываются.


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

EP>>В этом примере (перемножение массивов объектов Complex) — тормоза на Java будут даже без учёта GC.

M>"Тормоза" тут будут только от 12-16 байтов заголовка объекта в Яве,

Нет, тормоза будут далеко не только от этого.

M>которые будут "разрывать" последовательность даблов.


А она разорвётся от первого перетасовывания/сортировки, причём конкретно — я же там random_shuffle поставил.

M>Как только ты уйдешь от массивов в плюсах, все станет на свои места.


Если писать на C++ в Java-style, хранить элементы всех массивов по указателям, добавлять каждый под-объект в класс по указателю — то да, тормоз будет конкретный.

M>Кроме того, как я уже намекнул, твой пример скромно обходит любые выделения памяти


А vector откуда по-твоему память берёт?
Re[23]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 03.06.15 06:09
Оценка:
Здравствуйте, mik1, Вы писали:

M>>>Да, кстати буст хорошо бы убрать из примера (как обещано).

M>g++ 4.9.2 под cygwin не хочет компилить с командной строкой с Coliru. std=c++14 распознает.
M>Все 3 ошибки идентичные — на создание объектов:

На Coliru версия новее. Нужно добавить ручной конструктор в Complex:
Complex(double re = 0., double im = 0.) : re(re), im(im) {}
Re[20]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.15 06:11
Оценка: 3 (1) +1
Здравствуйте, mik1, Вы писали:

M>Давай пока что так, требует JMH, которому я доверяю тестировать производительность:


Ну, во-первых, у вас в коде ошибка. Умножение реализовано неправильно.
Попробуйте скормить туда два массива по одному элементу, проинициализированному в i ( {0, 1}).
Это как раз иллюстрирует сложность явы для вычислительных задач — вы не можете написать оператор умножения векторов, построенный на умножении скаляров.
Вам придётся руками выписывать все операции типа вектор*вектор, вектор*скаляр; скаляр*скаляр — с утроенным риском напороть в одной из реализаций.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: C# - from indians by indians
От: vdimas Россия  
Дата: 03.06.15 06:55
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Мало того что const нифига не помог


const_cast<> как раз можно отследить глобальным поиском, так же как reinterpret_cast<>...
гораздо печальнее, что оставили приведение типов в синтаксисе Си, что позволит перехитрить такие проверки исходников.


G>так еще и утечку памяти создал.


Ну это как раз нормально. Утечку можно и в C# создать. Утечка — это всегда признак непродуманности способа владения.
Re[26]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 03.06.15 08:36
Оценка: :)
Здравствуйте, Aртём, Вы писали:

EP>>Ок, другой пример — глобальные объекты для многих проектов это "бэд практис", для некоторых же это вполне стандартное решение — типа микроконтроллеров

Aё>Вы в курсе, что под микроконтроллеры нету C++?

Я в курсе что есть.

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

Aё>Я уже Вам 3 раза повторил, что удобный доступ к памяти из C++ — для вычислений не значит ничего, ибо Ваш код C++ тормозной по сравнению с специализированными библиотеками.

Для полного фарша тебе осталось только сказать коронное "всё в базу упирается"

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


Я предлагаю убивать программу в случае если порушены инварианты или пред/пост-условия — так как она находится в неизвестном состоянии, и неизвестно как туда попала.

EP>>Даже если и больше по продолжительности, то по качеству — судя по всему нет

Aё>99/100 в IKM в 2011г- но без фич C++'11.

Тест — да, это сильное подтверждение качества опыта.

EP>>Что не понятно? Распараллеливание даст больший эффект нежели векторизация.

Aё>Почитайте про цену синхронизации. Узнайте много нового .

Не путай concurrent и parallel programming — в последнем синхронизации на порядки меньше.
Конкретно между потоками parallel_transform (который применим в данном случае) вообще никакой синхронизации нет, разве что false-sharing на границах — вся синхронизация это отправка задачи в pool, и ожидание результата — всё

EP>>>>Да даже если в Java-версии с Complex объектами будет векторизация, она всё равно будет медленнее C++ версии без векторизации — из-за плохого паттерна доступа к памяти — сути примера это никак не поменяет.

Aё>>>Вы так ничего и не поняли.
EP>>Куда уж там.
Aё>Попробую объяснить — сделайте N-мерный массив, сделайте обёртку с доступом по смешению через direct ByteBuffer- и будет счастье.

Код в студию.

Aё>>>А ведь я указывал парой сообщений выше- что Python с NumPy порвёт ваш плюснутый код, как тузик грелку.

EP>>По какому критерию?
Aё>По скорости

Аргументы?

Aё>и выразительности.


Конкретнее.

Aё>>>Потому что узкие места ускоряются через использование заточенной библиотеки.

EP>>Которая далеко не всегда существует.
Aё>Не тешьте себя иллюзиями- всё украли до нас, причём ещё во времена Фортрана.

Это невозможно в принципе.

Aё>>>А вот в качестве "клея" С++ — далеко не лучший вариант,

EP>>Аргументы?
Aё>Я привёл Вам аргумент- неустойчивый код, отсутствие логирования стек трейсов,

Я же сказал что stacktrace есть, просто не стандартный

Aё>фрагментация кучи.


1. У GC обычно есть специальная куча для больших объектов, которая не сжимается, потому что дорого — в итоге получается та же самая фрагментация. То есть у любого GC здесь tradeoff — либо перемещать огромные объекты, либо получать ту же фрагментацию.
2. Если эффекты фрагментации важны — на C++ без всяких проблем используются специальные аллокаторы/pool'ы.

Aё>Вам мало? Ну добавить ещё киллер-фичу перегрузка оператора aka выстрелить себе в ногу. В код выглядит выразительным и коротким, но программист на самом деле не знает, как оно под капотом работает. И не понимает, что не знает.


И какая тут разница с явным методом, в этом аспекте?

Aё>>>>>и размер кода для попадания в кэш CPU почему-то знатоки C++ не упомянули,

EP>>>>А зачем его упоминать? Думаешь код перемножения массивов не уместится в intruction cache?
Aё>>>Думаю, что реальные задачи сложнее Вашего примера, а шаблоны C++ имеют дурную репутацию разбухания кода.
EP>>В реальных задачах там где нужно используется динамический полиморфизм вместо статического, причём обычно где-то наверху. Это на порядки проще чем "работа вопреки языку" (как в тех случаях когда нужна скорость на Java).
Aё>Кажется, кто-то ставил Java в вину отсутствие статического полиморфизма- и тут же готов в реальных задачах от него отказаться.

Это демагогия. Внизу остаётся тот же статический полиморфизм.

Aё>Вот и C++ "где-то наверху" не нужен. А "где-то внизу" он тоже не нужен, ибо есть библиотеки на C, где авторы в курсе про векторные расширения, кэш процессора, и т.д..


На C быстрый код писать намного труднее чем на C++ — как раз из-за отсутствия нормального статического полиморфизма. Посмотри хотя бы на GLib — там сплошное type-erasure.

EP>>Даже если допустить что это так — того факта что в Java нет структур, и связанными с этим тормозами или танцами с ручной нарезкой массивов байт на структуры, или факта того что в нагруженных приложениях частенько отказываются от GC — это никак не отменяет.

Aё>Не отказываются от GC- а минимизируют освобождение памяти.

Именно что отказываются, гугли "java off heap".

Aё>Обратите внимание, это и программ на C++ касается (фрагментация кучи).


Правильная работа с памятью важна для скорости, и в C++ для этого есть естественные встроенные средства. В Java же приходится опускаться на уровень даже ниже чем C, нарезая вручную структуры, что кстати даже было продемонстрировано выше по топику.
Re[24]: C# - from indians by indians
От: mik1  
Дата: 03.06.15 11:45
Оценка: 2 (1)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>На Coliru версия новее. Нужно добавить ручной конструктор в Complex:

EP>
EP>Complex(double re = 0., double im = 0.) : re(re), im(im) {}
EP>


Спасибо.
Сишный пример у меня выдает 46-62 мс, т.е. слегка быстрее Явовского.
Re[25]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 03.06.15 11:55
Оценка: :)
Здравствуйте, mik1, Вы писали:

M>Сишный пример у меня выдает 46-62 мс, т.е. слегка быстрее Явовского.


57 average на Java- ну т.е. код на C++ (не C с векторными расширениями)- тормоз. Почему-то меня это не удивляет (вспоминаю KDE, который на C++ писан).
Re[23]: C# - from indians by indians
От: mik1  
Дата: 03.06.15 12:02
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

M>>А вот тут ты немного обманываешься — ни в деке, ни в очереди ты уже безразрывный блок памяти не получишь, и весь твой выигрыш рискует превратиться в тыкву


EP>Реализации std::deque внутри используют непрерывные chunk'и. std::priority_queue по-умолчанию хранит все элементы в одном vector.


То есть у дека вставка в середину будет иметь сложность с такой заметной константой??? (больше одного элемента двигать???)
Priority heap для value types будет иметь смысл только до определнных длин структур. После какого-то лимита копирование станет слишком дорогим.

EP>Да даже если взять node-based структуру данных — в Java в каждом узле будет хранится не элемент, а указатель, а это лишняя индерекция, что бьёт по производительности — в общем случае вместо одного cache miss'а будет два.


Причем тут Ява??? Пользуешься указателями в любом языке — будут указатели. Нет — не будут. Все это можно обойти при некоторм опыте в Яве.

EP>>>Причём если взять структуру чуть-чуть посложнее, типа {double, float, int} — то всё, приплыли капитально.

M>>Давай по честному — мой код по длине не сильно больше твоего.

EP>Вот только делает он не то что было запрошено — ComplexArray вместо Complex, со всеми вытекающими отсюда следствиями: в другую структуру данных комплексное число не положить, передать в функцию/использовать внутри несколько отдельных Complex чисел не получится, со сторонними алгоритмами типа std::inner_product — это не работает.


Твой код перемножает вектора и мой код перемножает вектора. Размер и производительность похожи. Точка.

EP>Верю. Повторюсь — на Java можно писать быстрый код. Но этот код будет на порядке сложнее чем например на C++, а иногда даже чем C.


Ты мне так и не рассказал про кастомные аллокаторы, которыми славятся плюсы Меня в той же самой ситуации может и стандартный устроить (TLAB-ы в Яве весьма хорошо написаны).
А value types — да, на плюсах удобнее. На Яве — не велика проблема.

M>>Да, и мне казалось в числодробилках обычно довольно однородные типы данных обрабатываются.


EP>Я уже выше по теме говорил что проблема с отсутствием struct бьёт далеко не только по число-дробилкам. Например банальная сортировка небольших структур также будет тормозить, не говоря уже о том что результат не будет последовательным по памяти.


Ключевое слово — небольших. И второе ключевое слово, которое ты скромно упустил — фиксированной длины.

EP>Правильный доступ к памяти, мало число индерекций — это ключ к быстрому коду (конечно после алгоритмических оптимизаций).


Да кто бы спорил!

EP>>>В этом примере (перемножение массивов объектов Complex) — тормоза на Java будут даже без учёта GC.

M>>"Тормоза" тут будут только от 12-16 байтов заголовка объекта в Яве,

EP>Нет, тормоза будут далеко не только от этого.


50 против 57 мс (твой и мой примеры)? Именно из-за этого (если GC за скобки вынести). С заголовками у меня 180-190 мс было

M>>которые будут "разрывать" последовательность даблов.

EP>А она разорвётся от первого перетасовывания/сортировки, причём конкретно — я же там random_shuffle поставил.

Если сортировать объекты — само собой. Но ты ж не объекты сортировал? Таки зачем меня пытаешься убедить это делать?

M>>Как только ты уйдешь от массивов в плюсах, все станет на свои места.


EP>Если писать на C++ в Java-style, хранить элементы всех массивов по указателям, добавлять каждый под-объект в класс по указателю — то да, тормоз будет конкретный.


Ну давай, расскажи, как ты например со стрoками переменной длины будешь работать в виде value types?

Я думаю, мы друг друга поняли
Re[24]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 03.06.15 13:02
Оценка:
Здравствуйте, mik1, Вы писали:

M>>>А вот тут ты немного обманываешься — ни в деке, ни в очереди ты уже безразрывный блок памяти не получишь, и весь твой выигрыш рискует превратиться в тыкву

EP>>Реализации std::deque внутри используют непрерывные chunk'и. std::priority_queue по-умолчанию хранит все элементы в одном vector.
M>То есть у дека вставка в середину будет иметь сложность с такой заметной константой??? (больше одного элемента двигать???)

Сложность вставки в середину std::deque — линейная.

M>Priority heap для value types будет иметь смысл только до определнных длин структур. После какого-то лимита копирование станет слишком дорогим.


1. Это никак не отменяет того факта что на Java придётся реализовывать для каждого типа такую структуру.
2. Value types они разные бывают, например может быть вот такой:
struct Foo
{
    int priority;
    vector<Bar> data;
};

sizeof такой структуры небольшой, при использовании priority_queue<Foo> — приоритеты будут хранится "in-place", в аналоге же на Java появится лишняя индерекция.

EP>>Да даже если взять node-based структуру данных — в Java в каждом узле будет хранится не элемент, а указатель, а это лишняя индерекция, что бьёт по производительности — в общем случае вместо одного cache miss'а будет два.

M>Причем тут Ява??? Пользуешься указателями в любом языке — будут указатели. Нет — не будут.

При том что она их навязывает там где их могло и не быть.

M>Все это можно обойти при некоторм опыте в Яве.


Конечно можно обойти, вручную нарезая структуры — я об этом сразу и сказал

EP>>>>Причём если взять структуру чуть-чуть посложнее, типа {double, float, int} — то всё, приплыли капитально.

M>>>Давай по честному — мой код по длине не сильно больше твоего.
EP>>Вот только делает он не то что было запрошено — ComplexArray вместо Complex, со всеми вытекающими отсюда следствиями: в другую структуру данных комплексное число не положить, передать в функцию/использовать внутри несколько отдельных Complex чисел не получится, со сторонними алгоритмами типа std::inner_product — это не работает.
M>Твой код перемножает вектора и мой код перемножает вектора.

Напоминаю:

M>>Попутно хотелось бы определить, по каким критериям мы сравниваем.
EP>Простоту работы со struct-like вещами, а конкретнее — скорость выполнения и удобство кода.

Вместо работы со struct-like — ты показал неудобное error-prone ручное раскидывание полей на элементы массива.

M>Размер и производительность похожи. Точка.


Опять таки, то что на Java можно написать быстрый код дорогой ценной — я сказал в том же сообщении.

EP>P.S. На Java можно писать быстрый код, но если выходить за рамки каких-то примитивнейших случаев (типа сортировки массива int'ов) — то приходится работать против языка, а не вместе с ним — нужно отказываться от GC и даже классов, и нарезать структуры вручную по массивам байт — по сути это уровень даже ниже чем в языке C.

Ты продемонстрировал ровно то что я и сказал — нарезал массив на "виртуальные" структуры.

Про размер кода вообще смешно — с твоим подходом тебе придётся заново реализовывать каждую структуру данных, вместо пере-использования имеющихся. Да даже не то что структуру данных, а стоит мне добавить несколько вызовов методов vector'а — тебе придётся писать новые wrapper'ы.

Да даже в таком виде у тебя кода намного больше. Если же вычесть лишнее типа import'ов/include'ов и то что ты не реализовал (типа random_shuffle/accumulate/operator+) — то разница получится в разы

EP>>Верю. Повторюсь — на Java можно писать быстрый код. Но этот код будет на порядке сложнее чем например на C++, а иногда даже чем C.

M>Ты мне так и не рассказал про кастомные аллокаторы, которыми славятся плюсы

Что конкретно тебя интересует?
И почему ты считаешь что это вообще относится к теме? Структуры есть даже в C#

M>>>Да, и мне казалось в числодробилках обычно довольно однородные типы данных обрабатываются.

EP>>Я уже выше по теме говорил что проблема с отсутствием struct бьёт далеко не только по число-дробилкам. Например банальная сортировка небольших структур также будет тормозить, не говоря уже о том что результат не будет последовательным по памяти.
M>Ключевое слово — небольших.

1. Поля используемые для сортировки могут быть в структуре, а payload — оставаться неподвижным в куче.
2. Бывает целесообразно сортировать даже большие структуры "inplace" — например если часто делается линейный обход.

M>И второе ключевое слово, которое ты скромно упустил — фиксированной длины.


Что конкретно имеешь в виду?

EP>>>>В этом примере (перемножение массивов объектов Complex) — тормоза на Java будут даже без учёта GC.

M>>>"Тормоза" тут будут только от 12-16 байтов заголовка объекта в Яве,
EP>>Нет, тормоза будут далеко не только от этого.
M>50 против 57 мс (твой и мой примеры)? Именно из-за этого (если GC за скобки вынести). С заголовками у меня 180-190 мс было

Так ты же не показал массив структур complex ни в каком виде. Ты показал ComplexArray, то есть ту самую ручную нарезку — которая необходима для быстрого Java кода.

M>>>которые будут "разрывать" последовательность даблов.

EP>>А она разорвётся от первого перетасовывания/сортировки, причём конкретно — я же там random_shuffle поставил.
M>Если сортировать объекты — само собой. Но ты ж не объекты сортировал? Таки зачем меня пытаешься убедить это делать?

Я же говорю — у меня там random_shuffle который тасует элементы массива

M>>>Как только ты уйдешь от массивов в плюсах, все станет на свои места.

EP>>Если писать на C++ в Java-style, хранить элементы всех массивов по указателям, добавлять каждый под-объект в класс по указателю — то да, тормоз будет конкретный.
M>Ну давай, расскажи, как ты например со стрoками переменной длины будешь работать в виде value types?

Даже с обычными строками/контейнерами переменной длины получается вот какая штука: если в класс Foo добавить под-объект строку, то в случае Java в самом объекте будет хранится указатель на объект в котором хранится указатель на буфер. В C++ же будет указатель на буфер попадёт в сам объект класса Foo — уже на одну индерекцию меньше (не говоря уже об оптимизациях коротких строк в случае которых сам буфер будет внутри объекта класса Foo).
И вот эти лишние индерекции они повсюду, и выкорчевыватся они только трудоёмкими низкоуровневыми приёмами.
Re[24]: C# - from indians by indians
От: greenpci  
Дата: 03.06.15 14:26
Оценка:
Здравствуйте, mik1, Вы писали:

M>50 против 57 мс (твой и мой примеры)? Именно из-за этого (если GC за скобки вынести). С заголовками у меня 180-190 мс было


Представь, что эта калькуляция повторяется 100500 тысяч раз. Для нашего продукта 14% это критично. Последнее ускорение, которое я делал, было на 5% и потратил на это 4 недели работы, как и было запланировано.

Получается, в этой конкретной задаче, Джава годится для новых числодробилок, где нельзя сравнить, или для терпеливых клиентов. По поводу бизнеса и денег, соглашусь, это вполне в духе современности, с удешевлением и снижением качества.
Re[25]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 03.06.15 14:42
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Представь, что эта калькуляция повторяется 100500 тысяч раз. Для нашего продукта 14% это критично.


Если писать код подобным образом на Java то и будет получаться скорость очень близкая к native'у.
Справедливости ради, разница в десятки процентов далеко не везде существенна, но тут дело в другом — во-первых код в таком стиле трудно писать (особенно когда нужны структуры вида {double, float, int}), во-вторых его нужно писать очень много, так как элементарная композиция не работает (нельзя взять отдельный массив и положить туда отдельный complex, и вызывать для него отдельный transfrom — всё это нужно сплавлять вместе вручную, и так каждую комбинацию).
А вот если писать в Java-стиле — то по всему коду появляются лишние уровни индеркции, лишние аллокации и т.п. — и вот тут отличие может быть не на десятки процентов, а в разы, на порядок, а в особо запущенных случаях на порядки.
Re[25]: C# - from indians by indians
От: mik1  
Дата: 03.06.15 23:24
Оценка:
Здравствуйте, greenpci, Вы писали:

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


M>>50 против 57 мс (твой и мой примеры)? Именно из-за этого (если GC за скобки вынести). С заголовками у меня 180-190 мс было


G>Представь, что эта калькуляция повторяется 100500 тысяч раз. Для нашего продукта 14% это критично. Последнее ускорение, которое я делал, было на 5% и потратил на это 4 недели работы, как и было запланировано.


Меня больше пугают 30% вариативности результатов сишного примера. В Яве там практически нулевое стандартное отклонение.
Откуда оно берется в си — хз.
Re[23]: C# - from indians by indians
От: fddima  
Дата: 04.06.15 01:44
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

EP>>Это может ухудшить показатели Java кода в разы, так как по умолчанию compacting GC выделяет память последовательно. Перемешав указатели в массиве — уже не получится последовательный обход памяти.

S>Нам обещали работу с byte[] через misc.Unsafe, чтобы избежать boxing penalty. Я уже запасся попкорном и орешками, т.к. раньше такого не видел.
Не флейма ради, а дополнения для. В C# всё таки у нас есть средства для типизированного доступа к памяти (blittable структуры + указатели). А на фоне align/pack и x86/x64 работать руками с byte* грустно.
Re[25]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 04.06.15 02:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Сложность вставки в середину std::deque — линейная.

Это типа ключ к производительности?

EP>2. Value types они разные бывают, например может быть вот такой:

EP>
EP>struct Foo
EP>{
EP>    int priority;
EP>    vector<Bar> data;
EP>};
EP>

Поля объекта вектор для Вас это value type?


EP>Опять таки, то что на Java можно написать быстрый код дорогой ценной — я сказал в том же сообщении.

У вас обоих код тормозной и написан за минуту. С тем отличием, у mik1 код без запашка.

EP>Даже с обычными строками/контейнерами переменной длины получается вот какая штука: если в класс Foo добавить под-объект строку, то в случае Java в самом объекте будет хранится указатель на объект в котором хранится указатель на буфер. В C++ же будет указатель на буфер попадёт в сам объект класса Foo — уже на одну индерекцию меньше (не говоря уже об оптимизациях коротких строк в случае которых сам буфер будет внутри объекта класса Foo).

Про строки вообще не по адресу: строки в Java неизменяемые, в отличие от C++, где приходится копировать содержимое, чтобы не иметь race conditions и/или тормозов на синхронизации.
Re[26]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 04.06.15 07:03
Оценка:
Здравствуйте, Aртём, Вы писали:

EP>>Сложность вставки в середину std::deque — линейная.

Aё>Это типа ключ к производительности?

Это такая структура данных. Структуры данных бывают разные, и каждая полезна при каких-то определённых условиях

EP>>2. Value types они разные бывают, например может быть вот такой:

EP>>
EP>>struct Foo
EP>>{
EP>>    int priority;
EP>>    vector<Bar> data;
EP>>};
EP>>

Aё>Поля объекта вектор для Вас это value type?

Изучай

EP>>Опять таки, то что на Java можно написать быстрый код дорогой ценной — я сказал в том же сообщении.

Aё>У вас обоих код тормозной и написан за минуту. С тем отличием, у mik1 код без запашка.

Как минимум с тем отличием что у mik1 логическая ошибка, как раз в самом характерном месте. Писал бы он медленный Java-style с объектами Complex — такой ошибки бы не было.
Уже третьи сутки пошли, а корректного кода на Java так и нет.

EP>>Даже с обычными строками/контейнерами переменной длины получается вот какая штука: если в класс Foo добавить под-объект строку, то в случае Java в самом объекте будет хранится указатель на объект в котором хранится указатель на буфер. В C++ же будет указатель на буфер попадёт в сам объект класса Foo — уже на одну индерекцию меньше (не говоря уже об оптимизациях коротких строк в случае которых сам буфер будет внутри объекта класса Foo).

Aё>Про строки вообще не по адресу: строки в Java неизменяемые, в отличие от C++, где приходится копировать содержимое, чтобы не иметь race conditions и/или тормозов на синхронизации.

Это вообще ортогонально — в Java можно создать mutable строку, в C++ — immutable
Re[27]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 04.06.15 09:35
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>Сложность вставки в середину std::deque — линейная.

Aё>>Это типа ключ к производительности?
EP>Это такая структура данных. Структуры данных бывают разные, и каждая полезна при каких-то определённых условиях
Вы сначала привели std::deque как пример производительности, потом в кусты. Нехорошо.

EP>>>2. Value types они разные бывают, например может быть вот такой:

EP>>>
EP>>>struct Foo
EP>>>{
EP>>>    int priority;
EP>>>    vector<Bar> data;
EP>>>};
EP>>>

Aё>>Поля объекта вектор для Вас это value type?

EP>Изучай

Гуглить я умею. Вы не ответили на мой вопрос- Вы действительно считаете, что поля объекта data типа vector являются типами по значению для типа Foo? Или таки при копировании Foo для data будет вызван копирующий конструктор?

EP>>>Опять таки, то что на Java можно написать быстрый код дорогой ценной — я сказал в том же сообщении.

Aё>>У вас обоих код тормозной и написан за минуту. С тем отличием, у mik1 код без запашка.

EP>Как минимум с тем отличием что у mik1 логическая ошибка, как раз в самом характерном месте.

Не вдавался в подробности, что там нарушил mik1 при перемножении- но сомневаюсь, что дело в адресной арифметике. Вообще как-то удивляет, что вроде бы более низкоуровневый программист на C++ боится адресной арифметики в Java и вообще не ожидает такого от Java-иста. К слову, я видел достаточно много тормозного кода на C++, и часто по той же причине что и тормозной Java код- человек не понимает, что он пишет, не понимает сложность алгоритмов, цену синхронизации и т.д.

EP>Уже третьи сутки пошли, а корректного кода на Java так и нет.

Дам Вам вопрос на засыпку- напишете без сторонних библиотек элегантный и быстрый код для reverse matrix со стороной N?

EP>Это вообще ортогонально — в Java можно создать mutable строку, в C++ — immutable

Просто для информации- в Java String immutable из коробки, в C++ std::string mutable из коробки.
Re[24]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.06.15 09:39
Оценка:
Здравствуйте, fddima, Вы писали:
F> Не флейма ради, а дополнения для. В C# всё таки у нас есть средства для типизированного доступа к памяти (blittable структуры + указатели). А на фоне align/pack и x86/x64 работать руками с byte* грустно.
Про C#/CLR вопросов нет — там сразу отдавали себе отчёт в том, что сохранить девственность обойтись без структур не выйдет.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[8]: C# - from indians by indians
От: petr_t  
Дата: 04.06.15 09:42
Оценка: :))
Здравствуйте, gandjustas, Вы писали:

G>Тебе ситуация кажется странной, потому что ты не понимаешь экономических мотивов технологических решений.


Да ладно, какие там экономические мотивы. Переехать с VSS на что-то более приличное — достаточно пары дней максимум.
Это просто множество говнокодеров и говноменеджеров, которые будут сопротивляться любым изменениям.
Re[26]: C# - from indians by indians
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.06.15 09:43
Оценка: +1
Здравствуйте, mik1, Вы писали:

M>Меня больше пугают 30% вариативности результатов сишного примера. В Яве там практически нулевое стандартное отклонение.

Я правильно понимаю, что то, что вы написали некорректный код, вас не пугает совсем?
Может вы перемерите производительность корректного кода?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[28]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 04.06.15 09:59
Оценка:
Здравствуйте, Aртём, Вы писали:

EP>>>>Сложность вставки в середину std::deque — линейная.

Aё>>>Это типа ключ к производительности?
EP>>Это такая структура данных. Структуры данных бывают разные, и каждая полезна при каких-то определённых условиях
Aё>Вы сначала привели std::deque как пример производительности, потом в кусты. Нехорошо.

Это передёргивание чистой воды Я не говорил что вставка в середину deque — быстрая.

Aё>>>Поля объекта вектор для Вас это value type?

EP>>Изучай
Aё>Гуглить я умею. Вы не ответили на мой вопрос- Вы действительно считаете, что поля объекта data типа vector являются типами по значению для типа Foo? Или таки при копировании Foo для data будет вызван копирующий конструктор?

Открой ссылку и прочитай что такое value type.

EP>>>>Опять таки, то что на Java можно написать быстрый код дорогой ценной — я сказал в том же сообщении.

Aё>>>У вас обоих код тормозной и написан за минуту. С тем отличием, у mik1 код без запашка.
EP>>Как минимум с тем отличием что у mik1 логическая ошибка, как раз в самом характерном месте.
Aё>Не вдавался в подробности, что там нарушил mik1 при перемножении- но сомневаюсь, что дело в адресной арифметике.

Причём тут адресная арифметика? Сам придумал, сам сомневается

Aё>Вообще как-то удивляет, что вроде бы более низкоуровневый программист на C++ боится адресной арифметики в Java и вообще не ожидает такого от Java-иста.


Мой тезис в том что быстрый код на C++ более высокоуровневый чем быстрый код на Java.

EP>>Уже третьи сутки пошли, а корректного кода на Java так и нет.

Aё>Дам Вам вопрос на засыпку- напишете без сторонних библиотек элегантный и быстрый код для reverse matrix со стороной N?

Что такое "reverse" matrix? Как это вообще относится к теме?
Ты даже не в состоянии найти баг в реализации mik1, да и вообще твоей версии кода здесь не было — при этом зачем-то просишь написать код для какого-то стороннего примера

EP>>Это вообще ортогонально — в Java можно создать mutable строку, в C++ — immutable

Aё>Просто для информации- в Java String immutable из коробки, в C++ std::string mutable из коробки.

Ещё раз — это ортогонально к обсуждаемому вопросу. Лишняя индерекция никуда не делась
Re[27]: C# - from indians by indians
От: mik1  
Дата: 04.06.15 11:26
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Как минимум с тем отличием что у mik1 логическая ошибка, как раз в самом характерном месте. Писал бы он медленный Java-style с объектами Complex — такой ошибки бы не было.

EP>Уже третьи сутки пошли, а корректного кода на Java так и нет.

Тебя мучает, что я одно присваивание неправильно написал? Первым же юнит тестом его бы накрыло. Писал я его в 2 часа ночи по местному времени.
В отличии от тебя я сюда заглядываю, а не сижу тут.
Re[27]: C# - from indians by indians
От: mik1  
Дата: 04.06.15 11:33
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


M>>Меня больше пугают 30% вариативности результатов сишного примера. В Яве там практически нулевое стандартное отклонение.

S>Я правильно понимаю, что то, что вы написали некорректный код, вас не пугает совсем?
S>Может вы перемерите производительность корректного кода?

Сразу после того, как вы в Яве статический конструктор скомпилируете.
    public double testVectorMult()
    {
        double t;
        for ( int i = 0; i < u_ar.length / 2; ++i ) {
            t = u.re(i) * v.re(i) - u.im(i) * v.im(i);
            v.im(i, u.re(i)*v.im(i) + u.im(i)*v.re(i));
            v.re(i, t);
        }
        return u.re( 0 );
    }

# Warmup: 10 iterations, 1 s each
# Measurement: 10 iterations, 1 s each
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: info.javaperformance.gccheck.ComplexTest2.testVectorMult

# Run progress: 0.00% complete, ETA 00:00:20
# Fork: 1 of 1
# Warmup Iteration   1: 61.510 ms/op
# Warmup Iteration   2: 58.380 ms/op
# Warmup Iteration   3: 58.579 ms/op
# Warmup Iteration   4: 58.505 ms/op
# Warmup Iteration   5: 58.697 ms/op
# Warmup Iteration   6: 58.694 ms/op
# Warmup Iteration   7: 58.468 ms/op
# Warmup Iteration   8: 58.574 ms/op
# Warmup Iteration   9: 58.720 ms/op
# Warmup Iteration  10: 58.659 ms/op
Iteration   1: 58.489 ms/op
Iteration   2: 58.605 ms/op
Iteration   3: 58.536 ms/op
Iteration   4: 58.544 ms/op
Iteration   5: 58.226 ms/op
Iteration   6: 58.249 ms/op
Iteration   7: 57.912 ms/op
Iteration   8: 58.510 ms/op
Iteration   9: 58.434 ms/op
Iteration  10: 58.742 ms/op


Result: 58.425 ±(99.9%) 0.358 ms/op [Average]
  Statistics: (min, avg, max) = (57.912, 58.425, 58.742), stdev = 0.237
  Confidence interval (99.9%): [58.067, 58.783]
Re[27]: C# - from indians by indians
От: mik1  
Дата: 04.06.15 11:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

M>>Меня больше пугают 30% вариативности результатов сишного примера. В Яве там практически нулевое стандартное отклонение.

S>Я правильно понимаю, что то, что вы написали некорректный код, вас не пугает совсем?
S>Может вы перемерите производительность корректного кода?

Да, так что насчет такого разброса результатов в си? Как-то меня он очень смущает...
Re[28]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 04.06.15 14:11
Оценка:
Здравствуйте, mik1, Вы писали:

Aё>>>У вас обоих код тормозной и написан за минуту. С тем отличием, у mik1 код без запашка.

EP>>Как минимум с тем отличием что у mik1 логическая ошибка, как раз в самом характерном месте. Писал бы он медленный Java-style с объектами Complex — такой ошибки бы не было.
EP>>Уже третьи сутки пошли, а корректного кода на Java так и нет.
M>Тебя мучает, что я одно присваивание неправильно написал? Первым же юнит тестом его бы накрыло. Писал я его в 2 часа ночи по местному времени.

У тебя баг именно в том месте, которого могло бы и не быть при наличии структур в языке, "кодом без запашка" это точно не является (на что я и отвечал). Писал бы ты в Java-style с полноценным объектом Complex — то этой ошибки бы не было.
Если бы ошибся например с замером времени, или например нарандомил денормализированных чисел — то и вопросов никаких не было бы, так как это к теме совершенно не относится, все ошибаются.

M>В отличии от тебя я сюда заглядываю, а не сижу тут.


А мне нравится обмениваться опытом, не всегда конечно здесь это результативно, но тем не менее попадаются очень интересные дискуссии.
А на что я трачу своё личное время из своего свободного графика — это к теме совершенно не относится. В любом случае код я показал сразу же.
Отредактировано 04.06.2015 14:14 Evgeny.Panasyuk . Предыдущая версия .
Re[22]: C# - from indians by indians
От: greenpci  
Дата: 05.06.15 08:13
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>>>>Пока ты редактировал сообщение, я уже сделал в таком виде Убрать зависимость boost конечно не сложно, но давай уже сделаем это после того как увидим Java версию.


Теперь разберем дотнет

Я поменял плюсный код, так как у меня пока нет С++14 компилятора на машине. Еще добавил чтение из файла, чтобы сверить результаты, и они сходятся.

  C++
#include <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <numeric>
#include <cstdlib>
#include <vector>
#include <chrono>
#include <iomanip>
#include "assert.h"

using namespace std;

struct Complex
{
    double re;
    double im;
};

Complex operator+(Complex x, Complex y)
{
    Complex ret_val = { x.re + y.re, x.im + y.im };
    return ret_val;
}

Complex operator*(Complex x, Complex y)
{
    Complex ret_val = { x.re*y.re - x.im*y.im, x.re*y.im + x.im*y.re };
    return ret_val;
}

Complex random_complex()
{
    Complex ret_val = { rand() / 1000. - 1000., rand() / 1000. - 1000. };
    return ret_val;
}

template<typename F>
void benchmark(F f)
{
    using namespace chrono;
    auto start = high_resolution_clock::now();
    f();
    auto end = high_resolution_clock::now();
    auto elapsed = end - start;
    cout << "Elapsed = " << duration_cast<duration<double>>(elapsed).count() * 1000 << " ms" << endl;
}

basic_ostream<char> & operator<<(basic_ostream<char> &stm, Complex c)
{
    stm << c.re << " " << c.im << std::endl;
    return stm;
}

basic_istream<char> & operator>>(basic_istream<char> &stm, Complex &c)
{
    stm >> c.re;
    stm >> c.im;
    return stm;
}

void generate_complex_sequence(vector<Complex> &v, vector<Complex> &u)
{
    constexpr auto N = 1u << 24;
    v.reserve(N);
    generate_n(back_inserter(v), N, random_complex);
    u = v;
    random_shuffle(begin(v), end(v));
    random_shuffle(begin(u), end(u));
}

void save_complex_sequence(vector<Complex> &v, vector<Complex> &u)
{
    ofstream stm("complex.dat", ios_base::out);
    assert(stm);
    stm << std::setprecision(14);
    ostream_iterator<Complex> it(stm);
    std::copy(v.begin(), v.end(), it);
    std::copy(u.begin(), u.end(), it);
}

void load_complex_sequence(vector<Complex> &v, vector<Complex> &u)
{
    constexpr auto N = 1u << 24;
    constexpr auto buf_len = 5u << 20;
    char *buffer = new char[buf_len];
    v.reserve(N);
    u.reserve(N);
    ifstream stm;
    stm.rdbuf()->pubsetbuf(buffer, buf_len);
    stm.open("complex.dat", ios_base::in);
    assert(stm);
    stm.precision(16);
    std::string str;
    unsigned i = 0;
    vector<Complex> *cur = &v;
    while(std::getline(stm, str))
    {
        char *ptr = nullptr;
        double re = ::strtod(str.data(), &ptr);
        double im = ::strtod(ptr, &ptr);
        Complex c = {re, im};
        cur->push_back(c);
        i++;
        if(i == N)
            cur = &u;
    }
    // istream_iterator<Complex> it(stm);
    // std::copy_n(it, N, back_inserter(v)); 
    // std::copy_n(it, N, back_inserter(u)); 
    std::cout << "v.size() = " << v.size() << std::endl;
    std::cout << "u.size() = " << u.size() << std::endl;
}

int main()
{
    vector<Complex> v, u;
    std::cout << "Benchmark loading:" << std::endl;
    // load_complex_sequence(v, u);
    generate_complex_sequence(v, u);

    benchmark([&]
    {
        transform(begin(v), end(v), begin(u), begin(v), [](Complex x, Complex y) { return x*y; });
    });

    auto result = accumulate(begin(v), end(v), Complex{});
    std::cout << std::setprecision(16) << " Re: " << result.re << " Im: " << result.im << std::endl;
    return 0;
}


  C#
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace ConsoleApplication1
{
    struct Complex
    {
        public Complex(double re, double im)
        {
            Re = re;
            Im = im;
        }

        public double Re;
        public double Im;

        public static Complex operator +(Complex x, Complex y)
        {
            return new Complex(x.Re + y.Re, x.Im + y.Im);
        }

        public unsafe static Complex operator *(Complex x, Complex y)
        {
            return new Complex(x.Re * y.Re - x.Im * y.Im, x.Re * y.Im + x.Im * y.Re);
        }

        private const int RandMax = 32767;
        private static Random random = new Random();

        public static Complex RandomComplex()
        {
            return new Complex(random.Next(RandMax) / 1000D, random.Next(RandMax) / 1000D);
        }
    }

    static class Funcs
    {
        public static void Shuffle<T>(IList<T> list)
        {
            Random rng = new Random();
            int n = list.Count;
            while (n > 1)
            {
                n--;
                int k = rng.Next(n + 1);
                T value = list[k];
                list[k] = list[n];
                list[n] = value;
            }
        }

        public static void PopulateWithRandom(Complex[] v, Complex[] u)
        {
            const int n = 1 << 24;
            for (int i = 0; i < n; i++ )
            {
                Complex random = Complex.RandomComplex();
                v[i] = random;
                u[i] = random;
            }

            Funcs.Shuffle(u);
            Funcs.Shuffle(v);
        }

        public static void LoadComplexSequence(Complex[] v, Complex[] u)
        {
            const int n = 1 << 24;

            using (var stm = File.OpenRead(@".\NativeBenchmark\complex.dat"))
            {
                using (var tr = new StreamReader(stm))
                {
                    foreach(var list in new Complex[][]{v, u})
                    {
                        int i = 0;
                        string line;
                        while (i < n && (line = tr.ReadLine()) != null)
                        {
                            var components = line.Split(' ');

                            if (components.Length != 2)
                                throw new ApplicationException("There should be two components");

                            list[i] = new Complex(Convert.ToDouble(components[0]), Convert.ToDouble(components[1]));
                            i++;
                        }

                        Console.WriteLine("Added {0} elements", i);
                    }
                }
            }
        }
    }

    class Program
    {
        [DllImport("winmm.dll")]
        internal static extern uint timeBeginPeriod(uint period);
        [DllImport("winmm.dll")]
        internal static extern uint timeEndPeriod(uint period);

        static void Main(string[] args)
        {

            const int n = 1 << 24;
            Console.WriteLine("n={0}", n);
            var v = new Complex[n];
            var u = new Complex[n];

            var watch = Stopwatch.StartNew();
            Funcs.PopulateWithRandom(v, u);
            //Funcs.LoadComplexSequence(v, u);
            watch.Stop();

            Console.WriteLine("Loading time: {0:F4}", watch.ElapsedMilliseconds);

            timeBeginPeriod(5);
            unsafe
            {
                watch = Stopwatch.StartNew();
                for (int i = 0; i < n; i++)
                {
                    v[i] = v[i] * u[i];
                }
            }
            watch.Stop();
            timeEndPeriod(5);

            var result = new Complex(0D, 0D);
            v.ToList().ForEach(c=>{result = result + c;});
            Console.WriteLine(".NET Elapsed: {0:F4} ms", watch.ElapsedMilliseconds);
            Console.WriteLine("Result: {0}, {1}", result.Re, result.Im);

        }
    }
}


Замеры:

Просто Elapsed это плюсы.

.NET Elapsed: 179.0000 ms
Elapsed = 94.006 ms
.NET Elapsed: 195.0000 ms
Elapsed = 85.005 ms
.NET Elapsed: 182.0000 ms
Elapsed = 87.005 ms
.NET Elapsed: 215.0000 ms
Elapsed = 95.005 ms
.NET Elapsed: 187.0000 ms
Elapsed = 87.005 ms
.NET Elapsed: 190.0000 ms
Elapsed = 91.006 ms
.NET Elapsed: 191.0000 ms
Elapsed = 95.006 ms
.NET Elapsed: 186.0000 ms
Elapsed = 99.006 ms
.NET Elapsed: 181.0000 ms
Elapsed = 95.006 ms
.NET Elapsed: 192.0000 ms
Elapsed = 97.006 ms


Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.
Re[23]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 05.06.15 08:36
Оценка: :)))
Здравствуйте, greenpci, Вы писали:

G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.


Подключи blas/lapack и замерь: управляемый код, который крутит матрицы в специализированной библиотеке (под Java точно есть обёртки), и C++- самописная реализация. До того, размахивать флагом что C++ тормозит чуть быстрей, чем _подставить по вкусу_, бессмысленно. Я уже упоминал программу Mathematica, стандарт де-факто в узких кругах- кросс-платформа на Java, крутит вычисления в специализированных библиотеках, в том числе может задействовать CUDA.
Re[23]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 08:54
Оценка:
Здравствуйте, greenpci, Вы писали:

G>Замеры:

G>Просто Elapsed это плюсы.
G>

G>.NET Elapsed: 179.0000 ms
G>Elapsed = 94.006 ms

G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.

У меня разница в десятки процентов. Возможно у тебя что-то не так с окружением.
Ты C# версию как запускаешь? Случайно не по "F5"?
Re[24]: C# - from indians by indians
От: greenpci  
Дата: 05.06.15 09:08
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>У меня разница в десятки процентов. Возможно у тебя что-то не так с окружением.

EP>Ты C# версию как запускаешь? Случайно не по "F5"?

Из командной строки, правда из под mingw. Запустил из вижуал студии команд лайн, те же цифры. Си плюс плюс компилировал mingw gcc.
Re[23]: C# - from indians by indians
От: Sinix  
Дата: 05.06.15 11:42
Оценка: 4 (2)
Здравствуйте, greenpci, Вы писали:

G>Теперь разберем дотнет

G>Народ, дайте знать, если можно оптимизировать дотнетный код еще. Я поправлю и замерю.

Если говорить про этот цикл:
            unsafe
            {
                watch = Stopwatch.StartNew();
                for (int i = 0; i < n; i++)
                {
                    v[i] = v[i] * u[i];
                }
            }
            watch.Stop();

то всё ок там, нечего оптимизировать
Не, можно заиспользовать RyuJIT+SIMD или распараллелить *(конкретно тут не поможет, время слишком мелкое), но это читерство и несерьёзно.

UPD. Ещё, обычно рандом инициализируют константой,
            Random rng = new Random(0);
, чтобы повторяемые результаты были. Опять-таки это скорее вопрос для собеседования, чем смертельно важный факт


Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.

Да, можно вытащить в отдельный метод
        unsafe private static void Run(int n, Complex[] v, Complex[] u)
        {
            for (int i = 0; i < n; i++)
            {
                v[i] = v[i] * u[i];
            }
        }

— это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.

UPD2. Тот же код с классами вместо структур:
.NET Elapsed: 4723,0000 ms

Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"

UPD3.
На той же машине плюсовый код от ув. greenpci (vs2013, релиз, win32, без отладчика) на настройках проекта по умолчанию выдаёт
Elapsed = 189.011 ms

Что-то я делаю не так
Отредактировано 05.06.2015 12:24 Sinix . Предыдущая версия . Еще …
Отредактировано 05.06.2015 11:53 Sinix . Предыдущая версия .
Re[24]: C# - from indians by indians
От: greenpci  
Дата: 05.06.15 12:29
Оценка: 2 (1) +2 :)
Здравствуйте, Sinix, Вы писали:

S>Такая просьба: запусти дотнетный код с Target platform = x86. Текущий JIT под x64 любит на ровном месте кривой код генерить. У меня соотношение 58ms/116ms в пользу x86.


да, отличный совет! Вот он секрет низких процентов у Евгения.

.NET Elapsed: 107.0000 ms
Elapsed = 98.005 ms
.NET Elapsed: 115.0000 ms
Elapsed = 96.006 ms
.NET Elapsed: 112.0000 ms
Elapsed = 89.005 ms
.NET Elapsed: 111.0000 ms
Elapsed = 96.005 ms
.NET Elapsed: 114.0000 ms
Elapsed = 96.005 ms
.NET Elapsed: 108.0000 ms
Elapsed = 94.005 ms
.NET Elapsed: 106.0000 ms
Elapsed = 90.005 ms
.NET Elapsed: 113.0000 ms
Elapsed = 94.006 ms
.NET Elapsed: 117.0000 ms
Elapsed = 99.005 ms
.NET Elapsed: 111.0000 ms
Elapsed = 89.005 ms


S>Да, можно вытащить в отдельный метод

S>
S>        unsafe private static void Run(int n, Complex[] v, Complex[] u)
S>        {
S>            for (int i = 0; i < n; i++)
S>            {
S>                v[i] = v[i] * u[i];
S>            }
S>        }
S>

S>- это уменьшит ограничение времени на JIT и даст возможность сгенерить чуть-чуть лучший код, но это копейки: 60 vs 58 ms.

это практически ничего не изменило:

.NET Elapsed: 114.0000 ms
Elapsed = 92.005 ms
.NET Elapsed: 118.0000 ms
Elapsed = 94.005 ms
.NET Elapsed: 114.0000 ms
Elapsed = 95.005 ms
.NET Elapsed: 118.0000 ms
Elapsed = 102.006 ms
.NET Elapsed: 117.0000 ms
Elapsed = 95.005 ms
.NET Elapsed: 117.0000 ms
Elapsed = 93.006 ms
.NET Elapsed: 114.0000 ms
Elapsed = 95.005 ms
.NET Elapsed: 118.0000 ms
Elapsed = 98.006 ms
.NET Elapsed: 116.0000 ms
Elapsed = 93.005 ms
.NET Elapsed: 113.0000 ms
Elapsed = 93.005 ms


S>UPD2. Тот же код с классами вместо структур:

S>
S>.NET Elapsed: 4723,0000 ms
S>


А вот List вместо массивов, ради интереса.

.NET Elapsed: 470.0000 ms
Elapsed = 93.0053 ms
.NET Elapsed: 475.0000 ms
Elapsed = 94.0053 ms
.NET Elapsed: 474.0000 ms
Elapsed = 98.0057 ms
.NET Elapsed: 490.0000 ms
Elapsed = 98.0056 ms
.NET Elapsed: 453.0000 ms
Elapsed = 100.006 ms
.NET Elapsed: 472.0000 ms
Elapsed = 93.0053 ms
.NET Elapsed: 471.0000 ms
Elapsed = 89.0051 ms
.NET Elapsed: 468.0000 ms
Elapsed = 94.0054 ms
.NET Elapsed: 456.0000 ms
Elapsed = 91.0052 ms
.NET Elapsed: 483.0000 ms
Elapsed = 95.0054 ms


S>Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"


У меня был обратный опыт. Один деятель на работе решил, что если методов нет, то надо поменять class на struct. Он попросил меня помочь разобраться, почему у него чертовщина с разными значениями полей в разных местах начала твориться. Типа, вот смотри я поменял значение в методе, а в вызывающем методе они опять старые.
Re[24]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 12:40
Оценка: 2 (1) +1
Здравствуйте, Sinix, Вы писали:

S>Не, можно заиспользовать RyuJIT+SIMD


От SIMD тут будет не так много эффекта, так как значительную часть времени здесь занимает перекачка данных из памяти. Точнее он будет, но не кратен увеличению max flop/s.
GCC кстати делает векторизацию C++ кода выше автоматом (опции компиляции):
  ASM
.L94:
    vmovupd    (%rcx), %xmm3
    addq    $1, %r10
    addq    $64, %rcx
    addq    $64, %rdi
    vinsertf128    $0x1, -48(%rcx), %ymm3, %ymm1
    vmovupd    -32(%rcx), %xmm3
    vinsertf128    $0x1, -16(%rcx), %ymm3, %ymm3
    vmovupd    -64(%rdi), %xmm4
    vinsertf128    $1, %xmm3, %ymm1, %ymm0
    vperm2f128    $49, %ymm3, %ymm1, %ymm3
    vunpcklpd    %ymm3, %ymm0, %ymm2
    vunpckhpd    %ymm3, %ymm0, %ymm3
    vinsertf128    $0x1, -48(%rdi), %ymm4, %ymm0
    vmovupd    -32(%rdi), %xmm4
    vinsertf128    $0x1, -16(%rdi), %ymm4, %ymm4
    vinsertf128    $1, %xmm4, %ymm0, %ymm5
    vperm2f128    $49, %ymm4, %ymm0, %ymm4
    vunpcklpd    %ymm4, %ymm5, %ymm1
    vunpckhpd    %ymm4, %ymm5, %ymm4
    vmulpd    %ymm1, %ymm2, %ymm0
    vmulpd    %ymm4, %ymm3, %ymm5
    vmulpd    %ymm4, %ymm2, %ymm2
    vmulpd    %ymm1, %ymm3, %ymm1
    vsubpd    %ymm5, %ymm0, %ymm0
    vaddpd    %ymm1, %ymm2, %ymm1
    vinsertf128    $1, %xmm0, %ymm0, %ymm2
    vperm2f128    $49, %ymm0, %ymm0, %ymm0
    vinsertf128    $1, %xmm1, %ymm1, %ymm3
    vperm2f128    $49, %ymm1, %ymm1, %ymm1
    vshufpd    $12, %ymm3, %ymm2, %ymm2
    vshufpd    $12, %ymm1, %ymm0, %ymm0
    vmovups    %xmm2, -64(%rcx)
    vextractf128    $0x1, %ymm2, -48(%rcx)
    vmovups    %xmm0, -32(%rcx)
    vextractf128    $0x1, %ymm0, -16(%rcx)
    cmpq    %rsi, %r10
    jb    .L94


S>или распараллелить *(конкретно тут не поможет, время слишком мелкое)


Распараллеливание существенно помогает даже на Coliru.
Причём распараллеливается двумя строчками — добавлением #include <parallel/algorithm> и заменой std::transform на __gnu_parallel::transform (у него такая же сигнатура)

S>но это читерство и несерьёзно.


Пример же совершенно не про SIMD и Parallel. Как я уже говорил выше — отсутствие структур и лишние индерекци бьют далеко не только по интенсивным вычислениям, а практически по всему коду.

S>UPD2. Тот же код с классами вместо структур:

S>
S>.NET Elapsed: 4723,0000 ms
S>


Я об этом и говорил выше — разница может быть на порядки.

S>Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"


А дело тут не в GC, а в постоянных cache miss'ах. Если на C++ сделать такой же memory layout — то точно также получим тормоза (подобный пример
Автор: Evgeny.Panasyuk
Дата: 18.10.14
).
Отредактировано 05.06.2015 12:45 Evgeny.Panasyuk . Предыдущая версия .
Re[25]: C# - from indians by indians
От: Sinix  
Дата: 05.06.15 12:45
Оценка: +1
Здравствуйте, greenpci, Вы писали:

G>Вот он секрет низких процентов у Евгения.

Ну вот, ложечки нашлись. Вообще, безобразие с двумя версиями JIT всех, кто работает с числомолотилками порядком достало, особенно после таких вот багов
Автор: Sinix
Дата: 25.06.14
.
Ждём следующего релиза (который не 2015, а после него), наконец обещают общий код для всех целевых платформ. Хоть баги будут одинаковые, и то хлеб.



S>>Наглядная иллюстрация gc pressure и золотого правила "ежели один человек построил, другой завсегда разобрать может"


G>У меня был обратный опыт. Один деятель на работе решил, что если методов нет, то надо поменять class на struct. Он попросил меня помочь разобраться, почему у него чертовщина с разными значениями полей в разных местах начала твориться. Типа, вот смотри я поменял значение в методе, а в вызывающем методе они опять старые.

Re[25]: C# - from indians by indians
От: greenpci  
Дата: 05.06.15 13:00
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А дело тут не в GC, а в постоянных cache miss'ах. Если на C++ сделать такой же memory layout — то точно также получим тормоза (подобный пример
Автор: Evgeny.Panasyuk
Дата: 18.10.14
).


А вот List, похоже, тормозит из-за проверки индекса, которую нельзя убрать, с помощью unsafe

        public T this[int index] {
#if !FEATURE_CORECLR
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
#endif
            get {
                // Following trick can reduce the range check by one
                if ((uint) index >= (uint)_size) {
                    ThrowHelper.ThrowArgumentOutOfRangeException();
                }
                Contract.EndContractBlock();
                return _items[index]; 
            }


Кстати, ты плюсный код 13й студией компилировал? У меня нету на машине, не могу проверить если есть разница.
Re[26]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 13:45
Оценка: +1
Здравствуйте, greenpci, Вы писали:

EP>>А дело тут не в GC, а в постоянных cache miss'ах. Если на C++ сделать такой же memory layout — то точно также получим тормоза (подобный пример
Автор: Evgeny.Panasyuk
Дата: 18.10.14
).

G>А вот List, похоже, тормозит из-за проверки индекса, которую нельзя убрать, с помощью unsafe

Не думаю что из-за проверки индекса будет такая разница — branch predictor должен с ней неплохо справится. Желательно посмотреть какой там ASM получается.
На MSVC++ если использовать std::vector::at, внутри которого такая же проверка, то там разница на десятки процентов а не в разы.

G>Кстати, ты плюсный код 13й студией компилировал? У меня нету на машине, не могу проверить если есть разница.


Под рукой 2012.
Re[27]: C# - from indians by indians
От: Sinix  
Дата: 05.06.15 14:17
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Не думаю что из-за проверки индекса будет такая разница — branch predictor должен с ней неплохо справится. Желательно посмотреть какой там ASM получается.

+1. У меня разница между массивом и списком 60ms/88ms.

EP>На MSVC++ если использовать std::vector::at, внутри которого такая же проверка, то там разница на десятки процентов а не в разы.


Кстати, а есть возможность проверить плюсовый код отсюда
Автор: greenpci
Дата: 05.06.15
с дефолтными настройками проекта (console application)?

У меня какая-то ересь получается.
VS2013, релиз, win32, без отладчика на настройках проекта по умолчанию выдаёт
Elapsed = 189.011 ms


Чтоб собралось без особых вмешательств — убрал constexpr, отключил precompiled headers в настройках и убрал load_complex_sequence() (всё равно не используется).
Re[28]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 15:15
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

EP>>Не думаю что из-за проверки индекса будет такая разница — branch predictor должен с ней неплохо справится. Желательно посмотреть какой там ASM получается.

S>+1. У меня разница между массивом и списком 60ms/88ms.

Это хорошо.

EP>>На MSVC++ если использовать std::vector::at, внутри которого такая же проверка, то там разница на десятки процентов а не в разы.

S>Кстати, а есть возможность проверить плюсовый код отсюда
Автор: greenpci
Дата: 05.06.15
с дефолтными настройками проекта (console application)?

S>У меня какая-то ересь получается.
S>VS2013, релиз, win32, без отладчика на настройках проекта по умолчанию выдаёт
S>
S>Elapsed = 189.011 ms
S>

S>Чтоб собралось без особых вмешательств — убрал constexpr, отключил precompiled headers в настройках и убрал load_complex_sequence() (всё равно не используется).

Я сделал тоже самое MSVS2012 — у меня на Sandy Bridge C++ 60ms (C# 69ms), на Nehalem C++ 84ms (C# 88ms)
Re[29]: C# - from indians by indians
От: Sinix  
Дата: 05.06.15 18:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Я сделал тоже самое MSVS2012 — у меня на Sandy Bridge C++ 60ms (C# 69ms), на Nehalem C++ 84ms (C# 88ms)

Sandy bridge тоже. Значит, проблема или в vs2013, или в /dev/hands. Второе вероятнее
Re[28]: C# - from indians by indians
От: PM  
Дата: 05.06.15 19:38
Оценка: 2 (1)
Здравствуйте, Sinix, Вы писали:

S>У меня какая-то ересь получается.

S>VS2013, релиз, win32, без отладчика на настройках проекта по умолчанию выдаёт
S>
S>Elapsed = 189.011 ms
S>


В Visual C++ 2013 std::chrono::high_resolution_clock сломан https://connect.microsoft.com/VisualStudio/feedback/details/719443/c-chrono-headers-high-resolution-clock-does-not-have-high-resolution
Re[29]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 19:44
Оценка: +1
Здравствуйте, PM, Вы писали:

S>>У меня какая-то ересь получается.

S>>VS2013, релиз, win32, без отладчика на настройках проекта по умолчанию выдаёт
S>>
S>>Elapsed = 189.011 ms
S>>

PM>В Visual C++ 2013 std::chrono::high_resolution_clock сломан https://connect.microsoft.com/VisualStudio/feedback/details/719443/c-chrono-headers-high-resolution-clock-does-not-have-high-resolution

Там говорится что точность недостаточна, но ведь не на столько же — тут же речь идёт о лишней сотне миллисекунд.
Re[30]: C# - from indians by indians
От: PM  
Дата: 05.06.15 21:25
Оценка: 3 (2)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Там говорится что точность недостаточна, но ведь не на столько же — тут же речь идёт о лишней сотне миллисекунд.


Верно, дело не в точности, N достаточно велико. Это чудит микрософтовский компилятор — сопоставимого времени (50 ms) с C# вариантом (65 ms) удалось добиться только для x64, сделав передачу аргументов по ссылке

Complex operator*(Complex const& x, Complex const& y);

transform(begin(v), end(v), begin(u), begin(v), [](Complex const& x, Complex const& y)
{
    return x*y;
});
Re[31]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 21:47
Оценка:
Здравствуйте, PM, Вы писали:

PM>Верно, дело не в точности, N достаточно велико. Это чудит микрософтовский компилятор — сопоставимого времени (50 ms) с C# вариантом (65 ms) удалось добиться только для x64,


У меня по-умолчанию было x32, для x64 результат примерно такой же — разницы на 100ms нет.

PM>сделав передачу аргументов по ссылке


У GCC ASM идентичный в обоих случаях. Если у MSVC из-за этого такая разница — то нужно отправлять report, так как случай тривиальный.
Re[32]: C# - from indians by indians
От: PM  
Дата: 05.06.15 23:37
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

PM>>Верно, дело не в точности, N достаточно велико. Это чудит микрософтовский компилятор — сопоставимого времени (50 ms) с C# вариантом (65 ms) удалось добиться только для x64,


EP>У меня по-умолчанию было x32, для x64 результат примерно такой же — разницы на 100ms нет.


PM>>сделав передачу аргументов по ссылке


EP>У GCC ASM идентичный в обоих случаях. Если у MSVC из-за этого такая разница — то нужно отправлять report, так как случай тривиальный.


Попробовал на Visual C++2015 RC, передача аргументов по ссылке: ~50 мс, по значению: ~60 мс. Сгенерированный код смотреть даже и не хочется, скорее всего VC2013 не осилил заинлайнить benchmark и std::transform

Думаю, репорт уже не поможет — МС не любит чинить баги в предыдущих версиях Visual C++. Где-то я читал, что обновлений для Visual C++2013 больше не будет. Видимо все силы брошены на выпуск новой версии.
Re[27]: C# - from indians by indians
От: greenpci  
Дата: 06.06.15 00:20
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

G>>А вот List, похоже, тормозит из-за проверки индекса, которую нельзя убрать, с помощью unsafe


Кстати, я забыл поставить unchecked вчера и никто не заметил.

unchecked
{
  for (int i = 0; i < n; i++)
  {
    v[i] = v[i] * u[i];
  }
}


.NET Elapsed: 102.0000 ms
Elapsed = 93.6 ms        
.NET Elapsed: 102.0000 ms
Elapsed = 93.601 ms      
.NET Elapsed: 104.0000 ms
Elapsed = 78.001 ms      
.NET Elapsed: 105.0000 ms
Elapsed = 78 ms          
.NET Elapsed: 101.0000 ms
Elapsed = 78 ms          
.NET Elapsed: 105.0000 ms
Elapsed = 78 ms          
.NET Elapsed: 109.0000 ms
Elapsed = 93.6 ms        
.NET Elapsed: 107.0000 ms
Elapsed = 78.001 ms      
.NET Elapsed: 106.0000 ms
Elapsed = 78 ms          
.NET Elapsed: 107.0000 ms
Elapsed = 78 ms


EP>Не думаю что из-за проверки индекса будет такая разница — branch predictor должен с ней неплохо справится. Желательно посмотреть какой там ASM получается.


Смотри цифры наверху. Но это от unchecked и массива. То есть, немного другой случай.

EP>На MSVC++ если использовать std::vector::at, внутри которого такая же проверка, то там разница на десятки процентов а не в разы.


Согласен. Я это и имел ввиду. На десятки процентов, а то и меньше.

UPD:

не, не обращайте внимание. Сравнил IL, он такой же. Просто моя машина сегодня немножко быстрее работает Тем более, что калькуляция вообще не там происходит.
Отредактировано 06.06.2015 4:22 greenpci . Предыдущая версия . Еще …
Отредактировано 06.06.2015 3:56 greenpci . Предыдущая версия .
Re: C# - from indians by indians
От: -n1l-  
Дата: 06.06.15 00:30
Оценка:
В щарпе геттер делается не методами а свойствами, поля не нужны(практически никогда), но да что бы прям как конст такого нет.
В другом случае если ваш коллега пхд из индии может залезть в исходники он может ваш конст убрать.
Re[33]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 07:51
Оценка:
Здравствуйте, PM, Вы писали:

PM>Попробовал на Visual C++2015 RC, передача аргументов по ссылке: ~50 мс, по значению: ~60 мс. Сгенерированный код смотреть даже и не хочется, скорее всего VC2013 не осилил заинлайнить benchmark и std::transform


На VS2012 ситуация следующая:
* во всех четырёх вариантах сам transform не инлайнится (для этого теста особо без разницы)
* все внутренности transform заинлайнены (лямбда, оператор)
* на x32 отличие в ASM минимальное, отличие в скорости незаметно
* на x64 в версии по значению появляется код с лишними обращениями к стэку, отличие по скорости по этому таймеру около 10ms.

PM>Думаю, репорт уже не поможет — МС не любит чинить баги в предыдущих версиях Visual C++. Где-то я читал, что обновлений для Visual C++2013 больше не будет. Видимо все силы брошены на выпуск новой версии.


Тут две проблемы:
* одна про то что на VS2013 (на ней же тормоза были?) в трёх версиях появляется разница в 100ms — её видимо в 2015 уже пофиксили
* сильное отличие кода между вариантами на x64, которого нет на x32 — она по всей видимости осталась. Подобного кода много даже в самом стандарте — функциональные объекты в алгоритмах, std::next/prev и т.д.
Re[28]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 08:27
Оценка:
Здравствуйте, greenpci, Вы писали:

G>>>А вот List, похоже, тормозит из-за проверки индекса, которую нельзя убрать, с помощью unsafe

G>Кстати, я забыл поставить unchecked вчера и никто не заметил.

Забыл/не забыл зависит от того что именно ты хотел протестировать. А так, если интересно, то можешь ещё и на указателях попробовать через fixed.
Re[28]: C# - from indians by indians
От: mik1  
Дата: 06.06.15 11:41
Оценка: 1 (1) +1
Здравствуйте, greenpci, Вы писали:

G>Кстати, я забыл поставить unchecked вчера и никто не заметил.


G>
G>unchecked
G>{
G>  for (int i = 0; i < n; i++)
G>  {
G>    v[i] = v[i] * u[i];
G>  }
G>}
G>


Ты уверен, что в шарпе ты с бубном танцевал меньше, чем я в Яве?
Кстати, в Яве объекты дают только 3.5х просадку (~185мс против 58 мс) в отличии от полного ужоса шарпа (~4700 мс против 110 мс).

С опциями JVM, кстати, я не игрался в этом тесте. В отличии от...
Re[29]: C# - from indians by indians
От: greenpci  
Дата: 06.06.15 11:51
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Забыл/не забыл зависит от того что именно ты хотел протестировать. А так, если интересно, то можешь ещё и на указателях попробовать через fixed.


Филосовский вопрос в следующем. Можно ли будет этот код на указателях и fixed назвать шарпом, или это будет Си плюс плюсная вставка в шарп?! Наподобие asm в си и паскале.

Я хотел понять для себя, можно ли написать управляемых код, который будет таким же быстрым, как Си плюс плюс, в рамках этой задачи. На данный момент, делаю вывод, что нельзя. Будет разница в пользу плюсов. То есть плюсы бытсрее.

И больше склоняюсь к выводу, что эти утверждения внизу ложны:

mik1 писал:

2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах. Соот-но, время и пространство не факт, что ухудшатся.



UPD: хотя вот в этом утверждении ниже unmanaged, и уже встает вопрос, зачем тогда вообще писать на шарпе.

gandjustas писал:

А с unmanaged можно писать на C# как на С (c соответствующими скоростями)

Отредактировано 06.06.2015 12:16 greenpci . Предыдущая версия .
Re[29]: C# - from indians by indians
От: greenpci  
Дата: 06.06.15 11:57
Оценка:
Здравствуйте, mik1, Вы писали:

M>Ты уверен, что в шарпе ты с бубном танцевал меньше, чем я в Яве?


нет, я ставлю вопрос managed vs C++, а не C# vs Java. Я слишком плохо знаю джаву для второго. На текущий момент, плюсы рулят и по скорости и по приятности кода.

M>Кстати, в Яве объекты дают только 3.5х просадку (~185мс против 58 мс) в отличии от полного ужоса шарпа (~4700 мс против 110 мс).


Не утешает. Обе просадки для моей задачи не допустимы.

M>С опциями JVM, кстати, я не игрался в этом тесте. В отличии от...


С плюсами тоже можно еще поиграться. Взять компилятор от интел, например.
Re[29]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 12:32
Оценка:
Здравствуйте, mik1, Вы писали:

M>Кстати, в Яве объекты дают только 3.5х просадку (~185мс против 58 мс) в отличии от полного ужоса шарпа (~4700 мс против 110 мс).


У тебя наверное без перемешивания — а на C# насколько я помню был shuffle

UPD: Ну да, вот
Автор: greenpci
Дата: 05.06.15
же он:
G>
G>        public static void Shuffle<T>(IList<T> list)
G>        {
G>            Random rng = new Random();
G>            int n = list.Count;
G>            while (n > 1)
G>            {
G>                n--;
G>                int k = rng.Next(n + 1);
G>                T value = list[k];
G>                list[k] = list[n];
G>                list[n] = value;
G>            }
G>        }

G>        public static void PopulateWithRandom(Complex[] v, Complex[] u)
G>        {
G>            const int n = 1 << 24;
G>            for (int i = 0; i < n; i++ )
G>            {
G>                Complex random = Complex.RandomComplex();
G>                v[i] = random;
G>                u[i] = random;
G>            }

G>            Funcs.Shuffle(u);
G>            Funcs.Shuffle(v);
G>        }
Отредактировано 06.06.2015 12:45 Evgeny.Panasyuk . Предыдущая версия .
Re[30]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 13:07
Оценка: 1 (1) +1
Здравствуйте, greenpci, Вы писали:

EP>>Забыл/не забыл зависит от того что именно ты хотел протестировать. А так, если интересно, то можешь ещё и на указателях попробовать через fixed.

G>Филосовский вопрос в следующем. Можно ли будет этот код на указателях и fixed назвать шарпом, или это будет Си плюс плюсная вставка в шарп?! Наподобие asm в си и паскале.

Это всё же будет C#, но такой код будет называться C-style. В Java даже этого нельзя — там будет C-minus-structs-style.
Точно также как на C++ можно писать в Java-style с кучей лишних индерекций, аллокаций, избыточным динамическим полиморфизмом и раздутыми иерархиями, и за это справедливо получать тормоза.

G>Я хотел понять для себя, можно ли написать управляемых код, который будет таким же быстрым, как Си плюс плюс, в рамках этой задачи. На данный момент, делаю вывод, что нельзя. Будет разница в пользу плюсов. То есть плюсы бытсрее.


Справедливости ради, эти десятки процентов не такая уж и значительная разница. Могу ещё раз повторится — и на Java и на C# можно писать быстрый код, но на C++ быстрый код получить на порядки проще. Даже есть вот такая цитата:

"The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier [to write in C++ than in other languages]." – Herb Sutter at //build/, quoting Andrei Alexandrescu

Отредактировано 06.06.2015 13:09 Evgeny.Panasyuk . Предыдущая версия .
Re[31]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.06.15 14:21
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Справедливости ради, эти десятки процентов не такая уж и значительная разница. Могу ещё раз повторится — и на Java и на C# можно писать быстрый код, но на C++ быстрый код получить на порядки проще. Даже есть вот такая цитата:

EP>

EP>"The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier [to write in C++ than in other languages]." – Herb Sutter at //build/, quoting Andrei Alexandrescu


Не стоит верить на слово в такие цитаты.
Во-первых fb переписал добрую половину STL, что уже недоступно в любом среднем проекте и большинстве крупных.
Во-вторых проценты прироста быстродействия в масштабах ФБ это десятки и сотни серверов, и это действительно стоит затраченных сотен тысяч и миллионов долларов на ЗП программистов.

Для большинства проектов проценты прироста быстродействия останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов. В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.

ЗЫ. При этом никто не сомневается что предел оптимизации программы на C++ выше, чем для C# или Java. Но достижение этого предела превышает в большинстве случаев выльется в слишком большие затраты.
Re[32]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 14:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Не стоит верить на слово в такие цитаты.


Не верить в то что такая цитата была? Можем проверить.
Или в то что так на самом деле? Весь топик выше как раз это и демонстрирует

G>Во-первых fb переписал добрую половину STL, что уже недоступно в любом среднем проекте и большинстве крупных.


1. И какой ты делаешь из этого вывод?
2. У них есть оптимизации некоторых контейнеров под их нужды — это далеко не половина STL. Причём в "среднем проекте" в котором я работаю есть подобные оптимизированные контейнеры, а один из них вообще точь в точь такой же (когда делал они ещё не выложили свой на github).

G>Во-вторых проценты прироста быстродействия в масштабах ФБ это десятки и сотни серверов, и это действительно стоит затраченных сотен тысяч и миллионов долларов на ЗП программистов.


Тезис в цитате (с которым я полностью согласен) довольно прост — на C++ проще создать быстрый код. Ты же пытаешься передёрнуть в какую-то совершенно другую плоскость

G>Для большинства проектов проценты прироста быстродействия


Причём тут "проценты"?
Выше как раз показано что при использовании Java-style это не проценты, а разы, и даже порядки.

G>останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов.


Ты почему-то говоришь в контексте каких-то отдельных областей типа web'а — причём так, что как-будто ничего другого нет. Уж поверь "быстрый код на C++" нужен не только гигантам.
Тебе попадаются задачи где не нужен? Поздравляю, вот только не надо необоснованно экстраполировать свой опыт на всю индустрию.

G>В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.


Нет, не сравнимы. В C++ я могу сделать много уровней абстракций, которые будут либо бесплатными, либо крайне дешёвыми. В C#, а тем более Java, так не получится. И вот за счёт этого получается проще.

G>ЗЫ. При этом никто не сомневается что предел оптимизации программы на C++ выше, чем для C# или Java. Но достижение этого предела превышает в большинстве случаев выльется в слишком большие затраты.


Мой поинт наоборот противоположный, и я уже устал его повторять:
Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
Re[33]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.06.15 16:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Тезис в цитате (с которым я полностью согласен) довольно прост — на C++ проще создать быстрый код. Ты же пытаешься передёрнуть в какую-то совершенно другую плоскость

Плоскость та же самая. Просто ответь на вопрос насколько проще и насколько нужна скорость с учетом всех факторов, потому что для сравнительных факторов нужна база для сравнения, иначе рассуждения ни о чем.

G>>Для большинства проектов проценты прироста быстродействия


EP>Причём тут "проценты"?

EP>Выше как раз показано что при использовании Java-style это не проценты, а разы, и даже порядки.
А при использовании C# не разы. Кроме того операции с complex не такой уж частый случай. Я вот сомневаюсь что в том же ФБ много кода, работающего с вещественными числами.


G>>останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов.


EP>Ты почему-то говоришь в контексте каких-то отдельных областей типа web'а — причём так, что как-будто ничего другого нет. Уж поверь "быстрый код на C++" нужен не только гигантам.

Не видел ни одного случая, чтобы без C++ нельзя было добиться достаточного быстродействия. Но это вовсе не отменяет факта, что в том же ФБ переписывание на С++ и оптимизация очень даже оправданы.


EP>Тебе попадаются задачи где не нужен? Поздравляю, вот только не надо необоснованно экстраполировать свой опыт на всю индустрию.

Как раз ты пытаешься опыт ФБ экстраполировать на всю индустрию. Увы никто, из тех кто будет читать этот форум, даже близко не подойдет к таким масштабам.

G>>В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.

EP>Нет, не сравнимы. В C++ я могу сделать много уровней абстракций, которые будут либо бесплатными, либо крайне дешёвыми. В C#, а тем более Java, так не получится. И вот за счёт этого получается проще.
А не делать уровни абстракции не? Или ты считаешь, что это на порядок сложнее?

EP>Мой поинт наоборот противоположный, и я уже устал его повторять:

EP>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
На практике ровно наоборот. В C++ можно вовсе не выделять память под объекты, а в C#\Java без этого никак. В некоторых случаях только один этот факт позволяет из кода на C++ выжать в разы больше быстродействия. Правда затраты на такую оптимизацию очень быстро превышают разумные пределы. Но для ФБ такие оптимизации оправданы, а для других — вовсе нет.
Re[34]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 16:54
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Тезис в цитате (с которым я полностью согласен) довольно прост — на C++ проще создать быстрый код. Ты же пытаешься передёрнуть в какую-то совершенно другую плоскость

G>Плоскость та же самая. Просто ответь на вопрос насколько проще

Намного проще.

G>и насколько нужна скорость с учетом всех факторов,


Где-то нужна, а где-то нет

G>>>Для большинства проектов проценты прироста быстродействия

EP>>Причём тут "проценты"?
EP>>Выше как раз показано что при использовании Java-style это не проценты, а разы, и даже порядки.
G>А при использовании C# не разы.

В разы, бывает и на порядки

G>Кроме того операции с complex не такой уж частый случай. Я вот сомневаюсь что в том же ФБ много кода, работающего с вещественными числами.


Повторюсь в N-ый раз Это бьёт далеко не только по арифметике и подобным вычислениям.

G>>>останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов.

EP>>Ты почему-то говоришь в контексте каких-то отдельных областей типа web'а — причём так, что как-будто ничего другого нет. Уж поверь "быстрый код на C++" нужен не только гигантам.
G>Не видел ни одного случая, чтобы без C++ нельзя было добиться достаточного быстродействия.

Опять 25. Без C++, на Java и C# можно добиться быстродействия, что не ясно-то? Ты с чем споришь?

EP>>Тебе попадаются задачи где не нужен? Поздравляю, вот только не надо необоснованно экстраполировать свой опыт на всю индустрию.

G>Как раз ты пытаешься опыт ФБ экстраполировать на всю индустрию.

Где я это пытаюсь делать?

G>Увы никто, из тех кто будет читать этот форум, даже близко не подойдет к таким масштабам.


Да причём тут вообще масштабы? Есть много программ которые работают на устройствах конечных пользователей и где нужна скорость.
Ты же пытаешься всё свести к каким-то случаям типа веб-масштабирования. Не хватает только коронного "всё в базу упирается".

G>>>В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.

EP>>Нет, не сравнимы. В C++ я могу сделать много уровней абстракций, которые будут либо бесплатными, либо крайне дешёвыми. В C#, а тем более Java, так не получится. И вот за счёт этого получается проще.
G>А не делать уровни абстракции не? Или ты считаешь, что это на порядок сложнее?

Да, это на порядок сложнее. Например примеры из этого топика:
Вместо того чтобы просто объявить класс Complex — будешь вручную нарезать массив double.
Вместо того чтобы взять готовую ФВП transform, и передать в неё лямбду — будешь выписывать ручной for-цикл.
И чем больше уровней, тем больше ad-hoc boilerplate, причём комбинаторно.

EP>>Мой поинт наоборот противоположный, и я уже устал его повторять:

EP>>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
G>На практике ровно наоборот.

Почему это? Вот в этом топике и Java и C# показали скорость близкую к C++.

G>В C++ можно вовсе не выделять память под объекты, а в C#\Java без этого никак. В некоторых случаях только один этот факт позволяет из кода на C++ выжать в разы больше быстродействия. Правда затраты на такую оптимизацию очень быстро превышают разумные пределы.


Ты как раз подтверждаешь мои слова выше. Ты читал на что отвечаешь?

EP>>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
G>На практике ровно наоборот.

Re[24]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 18:21
Оценка: 2 (2)
Здравствуйте, Sinix, Вы писали:

S>У меня соотношение 58ms/116ms в пользу x86.


S>UPD2. Тот же код с классами вместо структур:

S>
S>.NET Elapsed: 4723,0000 ms
S>


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

M>Ты уверен, что в шарпе ты с бубном танцевал меньше, чем я в Яве?

M>Кстати, в Яве объекты дают только 3.5х просадку (~185мс против 58 мс) в отличии от полного ужоса шарпа (~4700 мс против 110 мс).


C++ версия
Автор: Evgeny.Panasyuk
Дата: 02.06.15
скомпилированная в JavaScript и запущенная в Firefox:

Elapsed = 0.0960432s


UPD: Иногда бывает даже вот так:

Elapsed = 0.0744424s

Отредактировано 06.06.2015 18:37 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 06.06.2015 18:22 Evgeny.Panasyuk . Предыдущая версия .
Re[25]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 06.06.15 20:08
Оценка:
EP>C++ версия
Автор: Evgeny.Panasyuk
Дата: 02.06.15
скомпилированная в JavaScript и запущенная в Firefox:

EP>

EP>Elapsed = 0.0960432s

EP>
EP>UPD: Иногда бывает даже вот так:
EP>

EP>Elapsed = 0.0744424s


Исходный main:
int main()
{
    constexpr auto N = 1u << 24;
    vector<Complex> v, u;
    v.reserve(N);
    generate_n(back_inserter(v), N, random_complex);
    u = v;
    random_shuffle(begin(v), end(v));
    random_shuffle(begin(u), end(u));

    benchmark([&]
    {
        transform(begin(v), end(v), begin(u), begin(v), [](auto x, auto y) { return x*y; });
    });

    volatile auto anti_opti = accumulate(begin(v), end(v), Complex{});
    (void)anti_opti;
}

А вот main из .js отформатированный сторонней утилитой. Имена идентификаторов это то что я разревёрсил, до этого были одно-двух буквенные:
  JS
function main() {
    var a = 0,
        b = 0,
        c = 0,
        d = 0,
        e = 0,
        f = 0,
        g = 0,
        h = 0,
        i = 0,
        j = 0,
        l = 0,
        m = 0,
        n = 0,
        o = 0,
        q = 0,
        s = 0,
        t = 0.0,
        u = 0.0,
        v = 0.0,
        w = 0.0;
    s = r;
    r = r + 80 | 0;
    j = s + 16 | 0;
    i = s;
    l = s + 8 | 0;
    o = s + 48 | 0;
    m = s + 60 | 0;
    c = s + 36 | 0;
    d = s + 40 | 0;
    f = s + 44 | 0;
    g = s + 32 | 0;
    mem_as_Int32[o >> 2] = 0;
    q = o + 4 | 0;
    mem_as_Int32[q >> 2] = 0;
    h = o + 8 | 0;
    mem_as_Int32[h >> 2] = 0;
    mem_as_Int32[m >> 2] = 0;
    n = m + 4 | 0;
    mem_as_Int32[n >> 2] = 0;
    mem_as_Int32[m + 8 >> 2] = 0;
    e = Pn(268435456) | 0;
    mem_as_Int32[o >> 2] = e;
    mem_as_Int32[q >> 2] = e;
    mem_as_Int32[h >> 2] = e + 268435456;
    e = j + 8 | 0;
    b = 16777216;
    do {
        t = +(rand() | 0) / 1.0e3 + -1.0e3;
        mem_as_Float64[j >> 3] = t;
        t = +(rand() | 0) / 1.0e3 + -1.0e3;
        mem_as_Float64[e >> 3] = t;
        a = mem_as_Int32[q >> 2] | 0;
        if (a >>> 0 < (mem_as_Int32[h >> 2] | 0) >>> 0) {
            if (!a) a = 0;
            else {
                mem_as_Int32[a + 0 >> 2] = mem_as_Int32[j + 0 >> 2];
                mem_as_Int32[a + 4 >> 2] = mem_as_Int32[j + 4 >> 2];
                mem_as_Int32[a + 8 >> 2] = mem_as_Int32[j + 8 >> 2];
                mem_as_Int32[a + 12 >> 2] = mem_as_Int32[j + 12 >> 2]
            }
            mem_as_Int32[q >> 2] = a + 16
        } else Dc(o, j);
        b = b + -1 | 0
    } while ((b | 0) != 0);
    Cc(m, mem_as_Int32[o >> 2] | 0, mem_as_Int32[q >> 2] | 0);
    mem_as_Int32[c >> 2] = mem_as_Int32[o >> 2];
    mem_as_Int32[d >> 2] = mem_as_Int32[q >> 2];
    mem_as_Int32[i + 0 >> 2] = mem_as_Int32[c + 0 >> 2];
    mem_as_Int32[j + 0 >> 2] = mem_as_Int32[d + 0 >> 2];
    random_shuffle(i, j);
    mem_as_Int32[f >> 2] = mem_as_Int32[m >> 2];
    mem_as_Int32[g >> 2] = mem_as_Int32[n >> 2];
    mem_as_Int32[i + 0 >> 2] = mem_as_Int32[f + 0 >> 2];
    mem_as_Int32[j + 0 >> 2] = mem_as_Int32[g + 0 >> 2];
    random_shuffle(i, j);
    high_resolution_clock::now(i);
    a = mem_as_Int32[o >> 2] | 0;
    c = mem_as_Int32[q >> 2] | 0;
    if ((a | 0) != (c | 0)) {
        b = mem_as_Int32[m >> 2] | 0;
        while (1) {
            u = +mem_as_Float64[a >> 3];
            g = a + 8 | 0;
            w = +mem_as_Float64[g >> 3];
            v = +mem_as_Float64[b >> 3];
            t = +mem_as_Float64[b + 8 >> 3];
            mem_as_Float64[a >> 3] = u * v - w * t;
            mem_as_Float64[g >> 3] = w * v + u * t;
            a = a + 16 | 0;
            if ((a | 0) == (c | 0)) break;
            else b = b + 16 | 0
        }
    }
    high_resolution_clock::now(l);
    e = l;
    f = mem_as_Int32[e >> 2] | 0;
    e = mem_as_Int32[e + 4 >> 2] | 0;
    a = i;
    g = mem_as_Int32[a >> 2] | 0;
    a = mem_as_Int32[a + 4 >> 2] | 0;
    l = zc(2664, 8, 10) | 0;
    a = xp(f | 0, e | 0, g | 0, a | 0) | 0;
    a = zc(Le(l, (+(a >>> 0) + 4294967296.0 * +(P | 0)) / 1.0e9) | 0, 24, 1) | 0;
    Ld(j, a + (mem_as_Int32[(mem_as_Int32[a >> 2] | 0) + -12 >> 2] | 0) | 0);
    l = kj(j, 7520) | 0;
    l = mc[mem_as_Int32[(mem_as_Int32[l >> 2] | 0) + 28 >> 2] & 15](l, 10) | 0;
    ij(j);
    Me(a, l) | 0;
    we(a) | 0;
    a = mem_as_Int32[m >> 2] | 0;
    if (!a) a = mem_as_Int32[o >> 2] | 0;
    else {
        b = mem_as_Int32[n >> 2] | 0;
        if ((b | 0) != (a | 0)) mem_as_Int32[n >> 2] = b + (~((b + -16 - a | 0) >>> 4) << 4);
        Qn(a);
        a = mem_as_Int32[o >> 2] | 0
    }
    if (!a) {
        r = s;
        return 0
    }
    b = mem_as_Int32[q >> 2] | 0;
    if ((b | 0) != (a | 0)) mem_as_Int32[q >> 2] = b + (~((b + -16 - a | 0) >>> 4) << 4);
    Qn(a);
    r = s;
    return 0
}
mem_as_Int32 и mem_as_Float64 это views одного и того же буфера (есть views и других типов). Heap и stack находятся в этом буфере.

Первый цикл это generate_n:
e = j + 8 | 0;
b = 16777216;
do {
    t = +(rand() | 0) / 1.0e3 + -1.0e3;
    mem_as_Float64[j >> 3] = t;
    t = +(rand() | 0) / 1.0e3 + -1.0e3;
    mem_as_Float64[e >> 3] = t;
    a = mem_as_Int32[q >> 2] | 0;
    if (a >>> 0 < (mem_as_Int32[h >> 2] | 0) >>> 0) {
        if (!a) a = 0;
        else {
            mem_as_Int32[a + 0 >> 2] = mem_as_Int32[j + 0 >> 2];
            mem_as_Int32[a + 4 >> 2] = mem_as_Int32[j + 4 >> 2];
            mem_as_Int32[a + 8 >> 2] = mem_as_Int32[j + 8 >> 2];
            mem_as_Int32[a + 12 >> 2] = mem_as_Int32[j + 12 >> 2]
        }
        mem_as_Int32[q >> 2] = a + 16
    } else Dc(o, j);
    b = b + -1 | 0
} while ((b | 0) != 0);


Следующий цикл это transform с легко узнаваемой формулой умножения комплексных чисел:
high_resolution_clock::now(i);
a = mem_as_Int32[o >> 2] | 0;
c = mem_as_Int32[q >> 2] | 0;
if ((a | 0) != (c | 0)) {
    b = mem_as_Int32[m >> 2] | 0;
    while (1) {
        u = +mem_as_Float64[a >> 3];
        g = a + 8 | 0;
        w = +mem_as_Float64[g >> 3];
        v = +mem_as_Float64[b >> 3];
        t = +mem_as_Float64[b + 8 >> 3];
        mem_as_Float64[a >> 3] = u * v - w * t;
        mem_as_Float64[g >> 3] = w * v + u * t;
        a = a + 16 | 0;
        if ((a | 0) == (c | 0)) break;
        else b = b + 16 | 0
    }
}
high_resolution_clock::now(l);
То есть это результат компиляции:
transform(begin(v), end(v), begin(u), begin(v), [](auto x, auto y) { return x*y; });

Несмотря на volatile, компилятор выкинул accumulate. Его можно принудительно добавить (через вывод в результата в cout), но на замер времени это не повлияло.

P.S. Думаю на базе Emscripten можно сделать компилятор из C++ в Java — тогда там наконец "появятся" автоматические структуры

UPD: у компилятора есть опция выводить не "сжатый" код:
  main js
function _main() {
 var $$01$i = 0, $$byval_copy2 = 0, $$byval_copy3 = 0, $0 = 0, $1 = 0, $10 = 0, $14 = 0.0, $18 = 0.0, $19 = 0, $2 = 0, $24 = 0, $3 = 0, $34 = 0.0, $35 = 0, $36 = 0.0, $37 = 0.0, $39 = 0.0, $4 = 0, $49 = 0, $5 = 0, $51 = 0, $54 = 0, $55 = 0, $57 = 0, $6 = 0, $60 = 0, $61 = 0, $62 = 0, $67 = 0, $72 = 0, $76 = 0, $78 = 0, $8 = 0, $80 = 0, $86 = 0, $88 = 0, $__first1$01015$i$i$i = 0, $__first2$01114$i$i$i = 0, $end$i = 0, $f$idx$val$idx$val$i = 0, $f$idx$val$idx2$val$i = 0, $u = 0, $v = 0, sp = 0;
 sp = STACKTOP;
 STACKTOP = STACKTOP + 80 | 0;
 $$byval_copy3 = sp + 16 | 0;
 $$byval_copy2 = sp;
 $end$i = sp + 8 | 0;
 $v = sp + 48 | 0;
 $u = sp + 60 | 0;
 $0 = sp + 36 | 0;
 $1 = sp + 40 | 0;
 $2 = sp + 44 | 0;
 $3 = sp + 32 | 0;
 HEAP32[$v >> 2] = 0;
 $4 = $v + 4 | 0;
 HEAP32[$4 >> 2] = 0;
 $5 = $v + 8 | 0;
 HEAP32[$5 >> 2] = 0;
 HEAP32[$u >> 2] = 0;
 $6 = $u + 4 | 0;
 HEAP32[$6 >> 2] = 0;
 HEAP32[$u + 8 >> 2] = 0;
 $8 = __Znwj(268435456) | 0;
 HEAP32[$v >> 2] = $8;
 HEAP32[$4 >> 2] = $8;
 HEAP32[$5 >> 2] = $8 + 268435456;
 $10 = $$byval_copy3 + 8 | 0;
 $$01$i = 16777216;
 do {
  $14 = +(_rand() | 0) / 1.0e3 + -1.0e3;
  HEAPF64[$$byval_copy3 >> 3] = $14;
  $18 = +(_rand() | 0) / 1.0e3 + -1.0e3;
  HEAPF64[$10 >> 3] = $18;
  $19 = HEAP32[$4 >> 2] | 0;
  if ($19 >>> 0 < (HEAP32[$5 >> 2] | 0) >>> 0) {
   if (!$19) $24 = 0; else {
    HEAP32[$19 + 0 >> 2] = HEAP32[$$byval_copy3 + 0 >> 2];
    HEAP32[$19 + 4 >> 2] = HEAP32[$$byval_copy3 + 4 >> 2];
    HEAP32[$19 + 8 >> 2] = HEAP32[$$byval_copy3 + 8 >> 2];
    HEAP32[$19 + 12 >> 2] = HEAP32[$$byval_copy3 + 12 >> 2];
    $24 = $19;
   }
   HEAP32[$4 >> 2] = $24 + 16;
  } else __ZNSt3__16vectorI7ComplexNS_9allocatorIS1_EEE21__push_back_slow_pathIS1_EEvOT_($v, $$byval_copy3);
  $$01$i = $$01$i + -1 | 0;
 } while (($$01$i | 0) != 0);
 __ZNSt3__16vectorI7ComplexNS_9allocatorIS1_EEE6assignIPS1_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS1_NS_15iterator_traitsIS8_E9referenceEEE5valueEvE4typeES8_S8_($u, HEAP32[$v >> 2] | 0, HEAP32[$4 >> 2] | 0);
 HEAP32[$0 >> 2] = HEAP32[$v >> 2];
 HEAP32[$1 >> 2] = HEAP32[$4 >> 2];
 HEAP32[$$byval_copy2 + 0 >> 2] = HEAP32[$0 + 0 >> 2];
 HEAP32[$$byval_copy3 + 0 >> 2] = HEAP32[$1 + 0 >> 2];
 __ZNSt3__114random_shuffleINS_11__wrap_iterIP7ComplexEEEEvT_S5_($$byval_copy2, $$byval_copy3);
 HEAP32[$2 >> 2] = HEAP32[$u >> 2];
 HEAP32[$3 >> 2] = HEAP32[$6 >> 2];
 HEAP32[$$byval_copy2 + 0 >> 2] = HEAP32[$2 + 0 >> 2];
 HEAP32[$$byval_copy3 + 0 >> 2] = HEAP32[$3 + 0 >> 2];
 __ZNSt3__114random_shuffleINS_11__wrap_iterIP7ComplexEEEEvT_S5_($$byval_copy2, $$byval_copy3);
 __ZNSt3__16chrono12steady_clock3nowEv($$byval_copy2);
 $f$idx$val$idx$val$i = HEAP32[$v >> 2] | 0;
 $f$idx$val$idx2$val$i = HEAP32[$4 >> 2] | 0;
 if (($f$idx$val$idx$val$i | 0) != ($f$idx$val$idx2$val$i | 0)) {
  $__first1$01015$i$i$i = $f$idx$val$idx$val$i;
  $__first2$01114$i$i$i = HEAP32[$u >> 2] | 0;
  while (1) {
   $34 = +HEAPF64[$__first1$01015$i$i$i >> 3];
   $35 = $__first1$01015$i$i$i + 8 | 0;
   $36 = +HEAPF64[$35 >> 3];
   $37 = +HEAPF64[$__first2$01114$i$i$i >> 3];
   $39 = +HEAPF64[$__first2$01114$i$i$i + 8 >> 3];
   HEAPF64[$__first1$01015$i$i$i >> 3] = $34 * $37 - $36 * $39;
   HEAPF64[$35 >> 3] = $36 * $37 + $34 * $39;
   $__first1$01015$i$i$i = $__first1$01015$i$i$i + 16 | 0;
   if (($__first1$01015$i$i$i | 0) == ($f$idx$val$idx2$val$i | 0)) break; else $__first2$01114$i$i$i = $__first2$01114$i$i$i + 16 | 0;
  }
 }
 __ZNSt3__16chrono12steady_clock3nowEv($end$i);
 $49 = $end$i;
 $51 = HEAP32[$49 >> 2] | 0;
 $54 = HEAP32[$49 + 4 >> 2] | 0;
 $55 = $$byval_copy2;
 $57 = HEAP32[$55 >> 2] | 0;
 $60 = HEAP32[$55 + 4 >> 2] | 0;
 $61 = __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j(2664, 8, 10) | 0;
 $62 = _i64Subtract($51 | 0, $54 | 0, $57 | 0, $60 | 0) | 0;
 $67 = __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_j(__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd($61, (+($62 >>> 0) + 4294967296.0 * +(tempRet0 | 0)) / 1.0e9) | 0, 24, 1) | 0;
 __ZNKSt3__18ios_base6getlocEv($$byval_copy3, $67 + (HEAP32[(HEAP32[$67 >> 2] | 0) + -12 >> 2] | 0) | 0);
 $72 = __ZNKSt3__16locale9use_facetERNS0_2idE($$byval_copy3, 7520) | 0;
 $76 = FUNCTION_TABLE_iii[HEAP32[(HEAP32[$72 >> 2] | 0) + 28 >> 2] & 15]($72, 10) | 0;
 __ZNSt3__16localeD2Ev($$byval_copy3);
 __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc($67, $76) | 0;
 __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv($67) | 0;
 $78 = HEAP32[$u >> 2] | 0;
 if (!$78) $86 = HEAP32[$v >> 2] | 0; else {
  $80 = HEAP32[$6 >> 2] | 0;
  if (($80 | 0) != ($78 | 0)) HEAP32[$6 >> 2] = $80 + (~(($80 + -16 - $78 | 0) >>> 4) << 4);
  __ZdlPv($78);
  $86 = HEAP32[$v >> 2] | 0;
 }
 if (!$86) {
  STACKTOP = sp;
  return 0;
 }
 $88 = HEAP32[$4 >> 2] | 0;
 if (($88 | 0) != ($86 | 0)) HEAP32[$4 >> 2] = $88 + (~(($88 + -16 - $86 | 0) >>> 4) << 4);
 __ZdlPv($86);
 STACKTOP = sp;
 return 0;
}
Отредактировано 07.06.2015 9:30 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 06.06.2015 21:53 Evgeny.Panasyuk . Предыдущая версия .
Re: C# - from indians by indians
От: denisko http://sdeniskos.blogspot.com/
Дата: 06.06.15 21:11
Оценка: 1 (1)
Здравствуйте, mapnik, Вы писали:

Смотрю я простой русский кодер, как ты не знаешь оба языка и думаю "кто же из вас раджешь".
<Подпись удалена модератором>
Re[30]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 07.06.15 01:42
Оценка: -1 :))) :)
Здравствуйте, greenpci, Вы писали:

G>Я хотел понять для себя, можно ли написать управляемых код, который будет таким же быстрым, как Си плюс плюс, в рамках этой задачи. На данный момент, делаю вывод, что нельзя. Будет разница в пользу плюсов. То есть плюсы бытсрее.


G>UPD: хотя вот в этом утверждении ниже unmanaged, и уже встает вопрос, зачем тогда вообще писать на шарпе.

На шарпе писать не надо по одной простой причине- это Майкрософт. Слишком много ограничений для продакшена это накладывает.
Re[32]: C# - from indians by indians
От: greenpci  
Дата: 07.06.15 10:57
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>Во-вторых проценты прироста быстродействия в масштабах ФБ это десятки и сотни серверов, и это действительно стоит затраченных сотен тысяч и миллионов долларов на ЗП программистов.

G>Для большинства проектов проценты прироста быстродействия останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не
G>ЗЫ. При этом никто не сомневается что предел оптимизации программы на C++ выше, чем для C# или Java. Но достижение этого предела превышает в большинстве случаев выльется в слишком большие затраты.

...затраты,
...деньги,
...дешевле,
...дешевле

В реальных корпоративных условиях эта иллюзия экономии может стоить компаниям очень дорого. Во первых, в дотнете есть технические и не технические специалисты. Дотнет фильтрует людей гораздо хуже, чем плюсы. Там легче имитировать опыт и показаться работодателю программистом, на самом деле таковым не являясь. Вероятность, что ты наймешь действительно технического профессионала, который любит свою работу, будет выше на плюсах. А когда что-то любишь делать, работа кипит и заказчик доволен. Другими словами, си плюс плюс программист, который любит свою работу, напишет код быстрее и лучше, за счет энтузиазма, чем дотнетчик, который ее не любит.

Далее, развивая идею, дотнетчик-гуманитарий-экономист, станет начальником, от него побегут технические дотнетчики и он будет принимать не технические, а политические решения. Наймет множество ненужных заместителей, убедит начальство увеличить бюджет. И вот, он уже увеличил затраты, по сравнению с прекрасным, честным, бородатым технарем из си плюс плюс.

Ты спросишь, а при чем здесь это?! Я отвечу, а при чем здесь экономия?! Если мы говорим о реальной жизни, тогда нужно рассмотреть все ее аспекты. В том числе и этот.

G>имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов. В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.


Разработка на плюсах имеет некоторую сложность, но эта сложность преувеличена. Программист, работающий на плюсах много лет, будет достаточно эффективен и не будет дороже стоить.
Re[33]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 11:41
Оценка: 2 (2)
Здравствуйте, greenpci, Вы писали:

G>Разработка на плюсах имеет некоторую сложность, но эта сложность преувеличена.


1. Да, в некоторых местах сложнее, но тут действительно много преувеличений и бородатых мифов.
2. Не нужно забывать что C++ это не только преимущества в скорости, но ещё и в гибкости. Обобщённый код (это даже не метапрограммирование) на C++ получается короче и проще. На C# — шаг влево, шаг вправо и упираешься в забор
Автор: Evgeny.Panasyuk
Дата: 03.11.13
, в результате код получается более многословный.
Вот например, на Python можно сделать так (будет работать для любых типов имеющих соответствующие операторы):
def add(x, y):
    return x + y

def sub(x, y):
    return x - y

def apply(f, *args):
    return f(*args)

print(apply(apply, apply, apply, add, 1, 2))
print(apply(apply, apply, sub, 11, 2))
Аналог на C++:
auto add = [](auto x, auto y)
{
    return x + y;
};
auto sub = [](auto x, auto y)
{
    return x - y;
};
auto apply = [](auto f, auto... args)
{
    return f(args...);
};

print(apply(apply, apply, apply, add, 1, 2));
print(apply(apply, apply, sub, 11, 2));
На C# будет облом.
Re[33]: C# - from indians by indians
От: Klikujiskaaan КНДР  
Дата: 07.06.15 12:06
Оценка:
Здравствуйте, greenpci, Вы писали:
G>В реальных корпоративных условиях эта иллюзия экономии может стоить компаниям очень дорого. Во первых, в дотнете есть технические и не технические специалисты. Дотнет фильтрует людей гораздо хуже, чем плюсы. Там легче имитировать опыт и показаться работодателю программистом, на самом деле таковым не являясь. Вероятность, что ты наймешь действительно технического профессионала, который любит свою работу, будет выше на плюсах. А когда что-то любишь делать, работа кипит и заказчик доволен. Другими словами, си плюс плюс программист, который любит свою работу, напишет код быстрее и лучше, за счет энтузиазма, чем дотнетчик, который ее не любит.

В реальных корпоративных условиях эта иллюзия экономии может стоить компаниям очень дорого. Во первых, в С++ есть технические и не технические специалисты. С++ фильтрует людей гораздо хуже, чем дотнет. Там легче имитировать опыт и показаться работодателю программистом, на самом деле таковым не являясь. Вероятность, что ты наймешь действительно технического профессионала, который любит свою работу, будет выше на дотнете. А когда что-то любишь делать, работа кипит и заказчик доволен. Другими словами, дотнет программист, который любит свою работу, напишет код быстрее и лучше, за счет энтузиазма, чем плюсист, который ее не любит.
Отредактировано 07.06.2015 12:07 НепредставимыйПхы . Предыдущая версия .
Re[26]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 18:53
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Если писать код подобным образом на Java то и будет получаться скорость очень близкая к native'у.


А вот далеко не факт. )

Хотя я конечно не эксперт по оптимизациям в Java — сейчас узнаем у специалистов... )
Re[14]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 19:05
Оценка: 1 (1)
Здравствуйте, mik1, Вы писали:

M>Еще раз повторю.


M>1) Time to market уменьшается для последующих изменений.

M>2) Я не думаю, что с byte[] в Яве управляться труднее, чем в плюсах. Соот-но, время и пространство не факт, что ухудшатся.
M>3) То, что на Яве молотилки / near realtime делать труднее, чем на плюсах — миф.

Дааа? ))) В таком случае специалисты по быстрому коду на Java легко подскажут мне как оптимизировать до уровня нативного например такой простейший Java код:
    static long Test()
    {
        long timer=System.currentTimeMillis();
        final int width=image.length/height;//width=1920; height=1080
        int[] buf=(int[])image.clone();
        for(int n=0; n<count; n++){//count=500
            for(int y=1; y<height-1; y++){
                final int p=width*y;
                for(int x=1; x<width-1; x++) if(image[p+x]!=0xffffff)
                    buf[p+x]=(image[p-width+x]+image[p+x-1]+image[p-width+x-1]+image[p-width+x+1]+image[p+width+x-1]+image[p+width+x]+image[p+x+1]+image[p+width+x+1])>>3;
            }
            for(int y=1; y<height-1; y++){
                final int p=width*y;
                for(int x=1; x<width-1; x++) if(buf[p+x]!=0xffffff)
                    image[p+x]=(buf[p-width+x]+buf[p+x-1]+buf[p-width+x-1]+buf[p-width+x+1]+buf[p+width+x-1]+buf[p+width+x]+buf[p+x+1]+buf[p+width+x+1])>>3;
            }
        }
        return System.currentTimeMillis()-timer;
    }


А то он что-то работает в 5 (!) раз медленнее C++ аналога.

P.S. C# версия (без фокусов с fixed, которые превращают C# в кривой аналог C) работает в 7 раз медленнее C++ кода.
Re[31]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 19:14
Оценка: +2
Здравствуйте, Aртём, Вы писали:


Этот феерический бред сгененировал кажется тот же самый персонаж, что заявлял, что на микроконтроллерах нет C++? И который предлагал оценивать быстродействие Питона по numpy и быстройдействие Java по blas/lapack? Может стоит просто забанить его на форуме? Понятно же ведь, что это или сверхжирный тролль или школьник.
Re[27]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 19:30
Оценка: 1 (1)
Здравствуйте, alex_public, Вы писали:

EP>>Если писать код подобным образом на Java то и будет получаться скорость очень близкая к native'у.

_>А вот далеко не факт. )
_>Хотя я конечно не эксперт по оптимизациям в Java — сейчас узнаем у специалистов... )

Вот тут
Автор: Evgeny.Panasyuk
Дата: 06.06.15
C++ код скомпированный в JavaScript и запущенный в Firefox показывает скорость близкую к native'у — 75ms, на native C++ было 60ms, на C# — 69ms.
Если на C# использовать не низкоуровневый цикл, а transform и лямбду (как было на C++) — то получается 141ms.

В общем поинт в следующем — если в языке есть эффективная возможность работать с типизированными массивами, да ещё и чем-то типа кастов/view — то есть возможность сделать быстрый код. А чтобы такого кода много не писать (нарезать руками массивы на структуры, руками выписывать каждый цикл вместо ФВП и лямбд, и т.п.) — то в него можно скомпилировать C++, а низкоуровневой работой
Автор: mik1
Дата: 04.06.15
:

M>

M>        double t;
M>        for ( int i = 0; i < u_ar.length / 2; ++i ) {
M>            t = u.re(i) * v.re(i) - u.im(i) * v.im(i);
M>            v.im(i, u.re(i)*v.im(i) + u.im(i)*v.re(i));
M>            v.re(i, t);
M>        }
M>

пусть занимается компилятор
Автор: Evgeny.Panasyuk
Дата: 06.06.15
:
    b = mem_as_Int32[m >> 2] | 0;
    while (1) {
        u = +mem_as_Float64[a >> 3];
        g = a + 8 | 0;
        w = +mem_as_Float64[g >> 3];
        v = +mem_as_Float64[b >> 3];
        t = +mem_as_Float64[b + 8 >> 3];
        mem_as_Float64[a >> 3] = u * v - w * t;
        mem_as_Float64[g >> 3] = w * v + u * t;
        a = a + 16 | 0;
        if ((a | 0) == (c | 0)) break;
        else b = b + 16 | 0
    }
Re[15]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 19:35
Оценка:
Здравствуйте, alex_public, Вы писали:

_>А то он что-то работает в 5 (!) раз медленнее C++ аналога.

_>P.S. C# версия (без фокусов с fixed, которые превращают C# в кривой аналог C) работает в 7 раз медленнее C++ кода.

А ты сравнивал генерируемый ASM? Как сильно отличается? Точнее в чём там главный тормоз?
Отредактировано 07.06.2015 19:36 Evgeny.Panasyuk . Предыдущая версия .
Re[28]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 20:05
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вот тут
Автор: Evgeny.Panasyuk
Дата: 06.06.15
C++ код скомпированный в JavaScript и запущенный в Firefox показывает скорость близкую к native'у — 75ms, на native C++ было 60ms, на C# — 69ms.

EP>Если на C# использовать не низкоуровневый цикл, а transform и лямбду (как было на C++) — то получается 141ms.

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

Но техника конечно интересная. Хотя всё же C++ с его мощью и доступом ко всем мелочам выглядит очень странно в роли языка для генерации другого программного кода. )))

EP>В общем поинт в следующем — если в языке есть эффективная возможность работать с типизированными массивами, да ещё и чем-то типа кастов/view — то есть возможность сделать быстрый код. А чтобы такого кода много не писать (нарезать руками массивы на структуры, руками выписывать каждый цикл вместо ФВП и лямбд, и т.п.) — то в него можно скомпилировать C++, а низкоуровневой работой
Автор: mik1
Дата: 04.06.15
пусть занимается компилятор
Автор: Evgeny.Panasyuk
Дата: 06.06.15
:


Как минимум требуется ещё вменяемый интерпретатор (к примеру если тут взять Python вместо JS, то сомневаюсь, что получится похожий результат). Это в общем случае. А в отдельных задачах (типа моего примера выше) будут всплывать ещё различные специфические нюансы, не позволяющие приблизиться к нормальному нативному коду.
Re[16]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 20:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А ты сравнивал генерируемый ASM? Как сильно отличается? Точнее в чём там главный тормоз?


Я не в курсе как заставить java/c# выдать мне ассемблерный код по исходнику. Ну а лазить с дизассемблером/отладчиком там мне точно лень. )))
Re[17]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 20:14
Оценка:
Здравствуйте, alex_public, Вы писали:

EP>>А ты сравнивал генерируемый ASM? Как сильно отличается? Точнее в чём там главный тормоз?

_>Я не в курсе как заставить java/c# выдать мне ассемблерный код по исходнику. Ну а лазить с дизассемблером/отладчиком там мне точно лень. )))

Да, проще всего подсоединить отладчик во время работы того самого долгого цикла (можно добавить снаружи ещё несколько итераций чтобы успеть), отладчик VS вполне подойдёт.
Re[29]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 21:18
Оценка:
Здравствуйте, alex_public, Вы писали:

EP>>Вот тут
Автор: Evgeny.Panasyuk
Дата: 06.06.15
C++ код скомпированный в JavaScript и запущенный в Firefox показывает скорость близкую к native'у — 75ms, на native C++ было 60ms, на C# — 69ms.

EP>>Если на C# использовать не низкоуровневый цикл, а transform и лямбду (как было на C++) — то получается 141ms.
_>Если речь про работы со структурами, то возможно. Однако есть и много других нюансов...

Есть, но структуры (и больший упор на value-types), статический полиморфизм, инлайнинг — это одни из основных факторов.

_>Но техника конечно интересная. Хотя всё же C++ с его мощью и доступом ко всем мелочам выглядит очень странно в роли языка для генерации другого программного кода. )))


Писать на Java в стиле ниже уровнем чем C — тоже странновато А ведь пишут же.

EP>>В общем поинт в следующем — если в языке есть эффективная возможность работать с типизированными массивами, да ещё и чем-то типа кастов/view — то есть возможность сделать быстрый код. А чтобы такого кода много не писать (нарезать руками массивы на структуры, руками выписывать каждый цикл вместо ФВП и лямбд, и т.п.) — то в него можно скомпилировать C++, а низкоуровневой работой
Автор: mik1
Дата: 04.06.15
пусть занимается компилятор
Автор: Evgeny.Panasyuk
Дата: 06.06.15
:

_>Как минимум требуется ещё вменяемый интерпретатор (к примеру если тут взять Python вместо JS, то сомневаюсь, что получится похожий результат).

Это я и понимаю под "эффективной возможностью работать с типизированными массивами".

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


А какие конкретно там нюансы? Там же blur через усреднение соседних восьми пикселей, так? GCC ничего необычного там не генерирует — у тебя же C++ код точно такой же? (за минусом незначительных деталей)
Можем ради интересно сравнить с C++ -> JavaScript.

Кстати, там в начале полное копирование в буфер не нужно — достаточно только краёв.
Re[30]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 21:39
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А какие конкретно там нюансы? Там же blur через усреднение соседних восьми пикселей, так? GCC ничего необычного там не генерирует — у тебя же C++ код точно такой же? (за минусом незначительных деталей)


Почти такой же — чуть красивее (и за счёт этого ещё и эффективнее) из-за использования арифметики указателей. )

EP>Можем ради интересно сравнить с C++ -> JavaScript.


Кстати, а JS умеет SIMD (автоматический естественно)? )
Re[31]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 22:44
Оценка:
Здравствуйте, alex_public, Вы писали:

EP>>Можем ради интересно сравнить с C++ -> JavaScript.

_>Кстати, а JS умеет SIMD (автоматический естественно)? )

На стороне браузера, в JIT? — не знаю, думаю вряд ли.
Находятся заметки о появлении SIMD.js, то есть своего рода явные интринсинки, которые в свою очередь теоретически может использовать Emscripten (также находятся комментарии на этот счёт, но ещё не понял в каком оно состоянии).

А к чему спрашиваешь? Я сразу проверил — GCC твой код не векторизирует, по-крайней мере в таком виде.
Re[32]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 23:03
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

_>>Кстати, а JS умеет SIMD (автоматический естественно)? )

EP>На стороне браузера, в JIT? — не знаю, думаю вряд ли.

Я вот что-то задумался... А хоть один динамический язык вообще умеет автовекторизацию? )

EP>Находятся заметки о появлении SIMD.js, то есть своего рода явные интринсинки, которые в свою очередь теоретически может использовать Emscripten (также находятся комментарии на этот счёт, но ещё не понял в каком оно состоянии).


Нуу ручное для таких языков — это не интересно. )

EP>А к чему спрашиваешь? Я сразу проверил — GCC твой код не векторизирует, по-крайней мере в таком виде.


У меня векторизует. )
Re[33]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 23:09
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Кстати, а JS умеет SIMD (автоматический естественно)? )

EP>>На стороне браузера, в JIT? — не знаю, думаю вряд ли.
_>Я вот что-то задумался... А хоть один динамический язык вообще умеет автовекторизацию? )

Не, не слышал о таком.

EP>>Находятся заметки о появлении SIMD.js, то есть своего рода явные интринсинки, которые в свою очередь теоретически может использовать Emscripten (также находятся комментарии на этот счёт, но ещё не понял в каком оно состоянии).

_>Нуу ручное для таких языков — это не интересно. )

Emscripten это как раз компилятор C++ -> JS, вот пусть он и автовекторизует в эти ASM.js интринсинки.

EP>>А к чему спрашиваешь? Я сразу проверил — GCC твой код не векторизирует, по-крайней мере в таком виде.

_>У меня векторизует. )

Значит форма всё же отличается, тогда понятно.
Re[34]: C# - from indians by indians
От: alex_public  
Дата: 07.06.15 23:20
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Emscripten это как раз компилятор C++ -> JS, вот пусть он и автовекторизует в эти ASM.js интринсинки.


Да, в этом случае всё было бы нормально. Но надо признать, что всё же Emscripten — это мягко говоря не популярный инструмент. ))) Так что никто не будет вести разработку JS в расчёте на него.

EP>Значит форма всё же отличается, тогда понятно.


Конечно. Но в том то и весь смысл:
1. Как раз такая форма является наиболее естественной и удобной для подобных алгоритмов.
2. Такую форму невозможно реализовать на языках типа Java или C#. )
Re[35]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 07.06.15 23:50
Оценка:
Здравствуйте, alex_public, Вы писали:

EP>>Emscripten это как раз компилятор C++ -> JS, вот пусть он и автовекторизует в эти ASM.js интринсинки.

_>Да, в этом случае всё было бы нормально. Но надо признать, что всё же Emscripten — это мягко говоря не популярный инструмент. ))) Так что никто не будет вести разработку JS в расчёте на него.

Конечно в первую очередь это инструмент для портирования, причём успешный (Unreal Engine портировали за 4 дня, уже портированно QT и т.п.).
Тем не менее, например если нужно создать быстрый JavaScript код — то почему бы его не использовать?

EP>>Значит форма всё же отличается, тогда понятно.

_>Конечно. Но в том то и весь смысл:
_>1. Как раз такая форма является наиболее естественной и удобной для подобных алгоритмов.
_>2. Такую форму невозможно реализовать на языках типа Java или C#. )

Странно: GCC завекторизировал исходную форму, но только в x32 (на Coliru по умолчанию было x64).
Re[36]: C# - from indians by indians
От: alex_public  
Дата: 08.06.15 00:19
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Конечно в первую очередь это инструмент для портирования, причём успешный (Unreal Engine портировали за 4 дня, уже портированно QT и т.п.).


Хм, Qt на JS? ) Интересно взглянуть на использование подобного инструмента. ) Особенно если учесть то, какие бинарники генерирует Qt.

EP>Странно: GCC завекторизировал исходную форму, но только в x32 (на Coliru по умолчанию было x64).


У меня тоже gcc (4.9.1). Разницы в 64/32 можно сказать нет. На C# аналогично. На Java пробовал только х64 вариант. )
Re[32]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 08.06.15 03:15
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Этот феерический бред сгененировал кажется тот же самый персонаж, что заявлял, что на микроконтроллерах нет C++? И который предлагал оценивать быстродействие Питона по numpy и быстройдействие Java по blas/lapack? Может стоит просто забанить его на форуме? Понятно же ведь, что это или сверхжирный тролль или школьник.


Вот и религиозный C++"поклонник"отметился
Re[37]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 08.06.15 09:42
Оценка: 6 (4)
Здравствуйте, alex_public, Вы писали:

EP>>Конечно в первую очередь это инструмент для портирования, причём успешный (Unreal Engine портировали за 4 дня, уже портированно QT и т.п.).

_>Хм, Qt на JS? ) Интересно взглянуть на использование подобного инструмента. ) Особенно если учесть то, какие бинарники генерирует Qt.

Ага, сам удивился когда узнал.
Вот тут живые примеры QT. Тут интерпретатор Python внутри JS. На JS даже Clang портировали. Общий список демок.

EP>>Странно: GCC завекторизировал исходную форму, но только в x32 (на Coliru по умолчанию было x64).

_>У меня тоже gcc (4.9.1). Разницы в 64/32 можно сказать нет.

У тебя код другой. Я же говорю про исходный — он векторизируется GCC, но только в x32.
Re[38]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 08.06.15 12:22
Оценка: +1 -1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вот тут живые примеры QT. Тут интерпретатор Python внутри JS. На JS даже Clang портировали. Общий список демок.


  Можно, но зачем?
Re[39]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 08.06.15 12:38
Оценка: 3 (2) +1
Здравствуйте, Aртём, Вы писали:

EP>>Вот тут живые примеры QT. Тут интерпретатор Python внутри JS. На JS даже Clang портировали. Общий список демок.

Aё>Можно, но зачем?

Портирование Clang, Python и QT — это скорее демонстрация того что Emscripten справляется с большими проектами. Но это же не единственные примеры.
http://www.youtube.com/watch?v=BV32Cs_CMqo
Re[15]: C# - from indians by indians
От: Sinix  
Дата: 08.06.15 13:14
Оценка:
Здравствуйте, alex_public, Вы писали:

_>P.S. C# версия (без фокусов с fixed, которые превращают C# в кривой аналог C) работает в 7 раз медленнее C++ кода.

Не для спора

А можно весь код на шарпе, чисто посмотреть, что там не так?

Ну и плюсовый, чтоб сравнить.
Re[33]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.06.15 14:10
Оценка: 1 (1) -1 :)
Здравствуйте, greenpci, Вы писали:


G>В реальных корпоративных условиях эта иллюзия экономии может стоить компаниям очень дорого. Во первых, в дотнете есть технические и не технические специалисты. Дотнет фильтрует людей гораздо хуже, чем плюсы. Там легче имитировать опыт и показаться работодателю программистом, на самом деле таковым не являясь. Вероятность, что ты наймешь действительно технического профессионала, который любит свою работу, будет выше на плюсах. А когда что-то любишь делать, работа кипит и заказчик доволен. Другими словами, си плюс плюс программист, который любит свою работу, напишет код быстрее и лучше, за счет энтузиазма, чем дотнетчик, который ее не любит.

А ты хоть раз людей собеседовал? Сказки какие-то рассказываешь. У меня есть 10 вопросов, которые точно показывают насколько человек понимает .NET. Программисты с 5+ годами опыта отвечают в среднем на 7. Так что с фильтрацией пробел никаких нет. А что касается вероятности нахождения профессионала, то она тем выше, чем больше рынок. На узком рынке вообще сложно что-то найти.
Твое мнение построено на незнании.



G>>имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов. В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.

G>Разработка на плюсах имеет некоторую сложность, но эта сложность преувеличена. Программист, работающий на плюсах много лет, будет достаточно эффективен и не будет дороже стоить.
Наоборот, я бы сказал что эта сложность приуменьшена. Я вот помню случай на 5 курсе универа. Надо было численные методы считать. У нас в группе осталось 8 человек, половина из которых кодила на С++, а я три месяца как начал работать на C#. Так вот была банальная задача с матрицами. Пока C++ программисты писали умножение и вычисление обратных матриц на C++ я успел не только закодить всю математику, но и сделал визуализацию на WinForms. При этом они все лучше знали C++, чем я C#, да еще и опыта имели больше.
Re[35]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.06.15 14:22
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Тезис в цитате (с которым я полностью согласен) довольно прост — на C++ проще создать быстрый код. Ты же пытаешься передёрнуть в какую-то совершенно другую плоскость

G>>Плоскость та же самая. Просто ответь на вопрос насколько проще
EP>Намного проще.
Намного это насколько?

G>>и насколько нужна скорость с учетом всех факторов,

EP>Где-то нужна, а где-то нет
Где нужна?

G>>>>Для большинства проектов проценты прироста быстродействия

EP>>>Причём тут "проценты"?
EP>>>Выше как раз показано что при использовании Java-style это не проценты, а разы, и даже порядки.
G>>А при использовании C# не разы.
EP>В разы, бывает и на порядки
Я, слава богу, на java не пишу, а в .net проблем таких не наблюдал. Да и вырожденный во многом случай рассмотрен выше. Мне, например, за все время разработки на .NET понадобились структуры всего пару раз. Я уверен что ту же пару раз спокойно покрывает HotSpot.

G>>Кроме того операции с complex не такой уж частый случай. Я вот сомневаюсь что в том же ФБ много кода, работающего с вещественными числами.

EP>Повторюсь в N-ый раз Это бьёт далеко не только по арифметике и подобным вычислениям.
Ок, покажи другой пример, близкий к реальности, где нет арифметики с комплексными числами, матрицами итп.

G>>>>останутся незамеченными и дешевле будет сделать апгрейд железа, чем заниматься оптимизацией. Поэтому утверждение что "на C++ быстрый код получить на порядки проще" не имеет никакого смысла и верно только в контексте фейсбука\гугла и еще пары-тройки гигантов.

EP>>>Ты почему-то говоришь в контексте каких-то отдельных областей типа web'а — причём так, что как-будто ничего другого нет. Уж по верь "быстрый код на C++" нужен не только гигантам.
G>>Не видел ни одного случая, чтобы без C++ нельзя было добиться достаточного быстродействия.
EP>Опять 25. Без C++, на Java и C# можно добиться быстродействия, что не ясно-то? Ты с чем споришь?
С выделенным.

EP>>>Тебе попадаются задачи где не нужен? Поздравляю, вот только не надо необоснованно экстраполировать свой опыт на всю индустрию.

G>>Как раз ты пытаешься опыт ФБ экстраполировать на всю индустрию.
EP>Где я это пытаюсь делать?
В последних трех постах.

G>>Увы никто, из тех кто будет читать этот форум, даже близко не подойдет к таким масштабам.

EP>Да причём тут вообще масштабы? Есть много программ которые работают на устройствах конечных пользователей и где нужна скорость.
И там почему-то JavaScript, C#, Java и swift. У конечных пользователей скорость очень редко упирается в скорость вычислений.

EP>Ты же пытаешься всё свести к каким-то случаям типа веб-масштабирования. Не хватает только коронного "всё в базу упирается".

Нет, не пытаюсь.

G>>>>В остальных случаях сложность оптимизации на C++ и C# (и иногда Java) сравнимы, а учитывая в общем более высокую сложность разработки на C++ еще непонятно что будет проще в итоге.

EP>>>Нет, не сравнимы. В C++ я могу сделать много уровней абстракций, которые будут либо бесплатными, либо крайне дешёвыми. В C#, а тем более Java, так не получится. И вот за счёт этого получается проще.
G>>А не делать уровни абстракции не? Или ты считаешь, что это на порядок сложнее?

EP>Да, это на порядок сложнее. Например примеры из этого топика:

EP>Вместо того чтобы просто объявить класс Complex — будешь вручную нарезать массив double.
EP>Вместо того чтобы взять готовую ФВП transform, и передать в неё лямбду — будешь выписывать ручной for-цикл.
EP>И чем больше уровней, тем больше ad-hoc boilerplate, причём комбинаторно.
Но это, как мы выяснили уже, вырожденный пример. В реальности не встречающийся. В реальности количество боилерплйта на C++ оказывается не меньше, чем на java или C#.

EP>>>Мой поинт наоборот противоположный, и я уже устал его повторять:

EP>>>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
G>>На практике ровно наоборот.
EP>Почему это? Вот в этом топике и Java и C# показали скорость близкую к C++.
Потому что быстродействие программ вовсе не от быстродействия математики зависит.

G>>В C++ можно вовсе не выделять память под объекты, а в C#\Java без этого никак. В некоторых случаях только один этот факт позволяет из кода на C++ выжать в разы больше быстродействия. Правда затраты на такую оптимизацию очень быстро превышают разумные пределы.


EP>Ты как раз подтверждаешь мои слова выше. Ты читал на что отвечаешь?

EP>

EP>>>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
G>>На практике ровно наоборот.

Нет, ты говоришь о другом. Ты говоришь что на C++ проще получить быстрый код. Я говорю что на C++ в любом случае писать сложно, но код можно получить более быстрый, чем с другими языками.
И тогда встает вопрос оправданности использования C++ даже для performance-crtitical расчетов.
Re[34]: C# - from indians by indians
От: Sinix  
Дата: 08.06.15 14:34
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А ты хоть раз людей собеседовал? Сказки какие-то рассказываешь. У меня есть 10 вопросов, которые точно показывают насколько человек понимает .NET. Программисты с 5+ годами опыта отвечают в среднем на 7.


Да ладно, что там в базовых вещах может быть такого, чтоб с 5 годами опыта не ответить?

Или речь идёт про нюансы конкретных частей фреймворка / перегрузки / этюды в стиле Никова? Там да, до бесконечности валить можно.
Навскидку — раз, Целый ворох — два.

G>Так что с фильтрацией пробел никаких нет.

Угу. Причём для людей с опытом это делается ещё проще — берём любую из статей по сабжу типа такой и просим прокомментировать. Тут заучивание не помогает от слова совсем.
Re[40]: C# - from indians by indians
От: Aртём Австралия жж
Дата: 08.06.15 14:59
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Портирование Clang, Python и QT — это скорее демонстрация того что Emscripten справляется с большими проектами. Но это же не единственные примеры.

EP>http://www.youtube.com/watch?v=BV32Cs_CMqo
Это уже серьёзная заявка. Но какие случаи использования компилятора из C++ в JS ты видишь, где он мог бы быть больше, чем игрушечным проектом "just for fun"? Портировать линейную алгебру на JS, под Node.JS? Но разрабатывать новый код на C++ сложнее, а в уже написанном и оптимизированном мы рискуем потерять в производительности. Вызывать нативный код из Node.JS проблемы не представляет.
Re[36]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 08.06.15 15:32
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>>>Тезис в цитате (с которым я полностью согласен) довольно прост — на C++ проще создать быстрый код. Ты же пытаешься передёрнуть в какую-то совершенно другую плоскость

G>>>Плоскость та же самая. Просто ответь на вопрос насколько проще
EP>>Намного проще.
G>Намного это насколько?

Настолько, что даже в рассматриваемом примере, при использовании удобных средств типа ФВП и лямбд, C++ код скомпилированный в JS (!) оказывается практически в два раза быстрее чем аналогичный на C#.
И это на C# с использованием структур, которые как ты сам пишешь используют редко (а в C++ value type это default) — если же перейти к классам, то там уже получаются отставания на порядки.

G>>>Кроме того операции с complex не такой уж частый случай. Я вот сомневаюсь что в том же ФБ много кода, работающего с вещественными числами.

EP>>Повторюсь в N-ый раз Это бьёт далеко не только по арифметике и подобным вычислениям.
G>Ок, покажи другой пример, близкий к реальности, где нет арифметики с комплексными числами, матрицами итп.

Например послушай какие оптимизации делали вот тут (хотя бы первые полчаса), и почему.
Или тебе нужен короткий пример который мы тут сможем воспроизвести?

EP>>>>Ты почему-то говоришь в контексте каких-то отдельных областей типа web'а — причём так, что как-будто ничего другого нет. Уж по верь "быстрый код на C++" нужен не только гигантам.

G>>>Не видел ни одного случая, чтобы без C++ нельзя было добиться достаточного быстродействия.
EP>>Опять 25. Без C++, на Java и C# можно добиться быстродействия, что не ясно-то? Ты с чем споришь?
G>С выделенным.

А какие у тебя аргументы? И контраргументы какого типа ты сможешь принять?

EP>>>>Тебе попадаются задачи где не нужен? Поздравляю, вот только не надо необоснованно экстраполировать свой опыт на всю индустрию.

G>>>Как раз ты пытаешься опыт ФБ экстраполировать на всю индустрию.
EP>>Где я это пытаюсь делать?
G>В последних трех постах.

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

G>>>Увы никто, из тех кто будет читать этот форум, даже близко не подойдет к таким масштабам.

EP>>Да причём тут вообще масштабы? Есть много программ которые работают на устройствах конечных пользователей и где нужна скорость.
G>И там почему-то JavaScript, C#, Java и swift.

Ага. И, барабанная дробь, C++.

EP>>Да, это на порядок сложнее. Например примеры из этого топика:

EP>>Вместо того чтобы просто объявить класс Complex — будешь вручную нарезать массив double.
EP>>Вместо того чтобы взять готовую ФВП transform, и передать в неё лямбду — будешь выписывать ручной for-цикл.
EP>>И чем больше уровней, тем больше ad-hoc boilerplate, причём комбинаторно.
G>Но это, как мы выяснили уже, вырожденный пример. В реальности не встречающийся.

Кто и где это выяснил?

G>В реальности количество боилерплйта на C++ оказывается не меньше, чем на java или C#.


Аргументы?

EP>>>>Мой поинт наоборот противоположный, и я уже устал его повторять:

EP>>>>Предел оптимизации везде примерно одинаковый, разница в десятки процентов это не так уж серьёзно. Но на C++ этот предел гораздо проще достичь.
G>>>На практике ровно наоборот.
EP>>Почему это? Вот в этом топике и Java и C# показали скорость близкую к C++.
G>Потому что быстродействие программ вовсе не от быстродействия математики зависит.

Ты не смотри то что там комплексные числа умножаются — C# код с классами получился медленней практически на два порядка. Даже если бы сами вычисления там были моментальными — то картину это бы никак не поменяло.

G>Ты говоришь что на C++ проще получить быстрый код.


Ну да: "Reasonably written C++ code just runs fast".

G>Я говорю что на C++ в любом случае писать сложно, но код можно получить более быстрый, чем с другими языками.


Прочитай ещё раз цитату:

"The going word at Facebook is that 'reasonably written C++ code just runs fast,' which underscores the enormous effort spent at optimizing PHP and Java code. Paradoxically, C++ code is more difficult to write than in other languages, but efficient code is a lot easier [to write in C++ than in other languages]." – Herb Sutter at //build/, quoting Andrei Alexandrescu

И прочитай выделенное. А потом чётко сформулируй с чем ты не согласен в этой цитате.
Re[41]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 08.06.15 16:23
Оценка:
Здравствуйте, Aртём, Вы писали:

EP>>Портирование Clang, Python и QT — это скорее демонстрация того что Emscripten справляется с большими проектами. Но это же не единственные примеры.

EP>>http://www.youtube.com/watch?v=BV32Cs_CMqo
Aё>Это уже серьёзная заявка. Но какие случаи использования компилятора из C++ в JS ты видишь, где он мог бы быть больше, чем игрушечным проектом "just for fun"?

Игры или например CAD приложения это вполне реальные проекты, а не только "just for fun". Конкретный пример:
http://www.youtube.com/watch?v=1e7fknGX_uQ

Aё>Портировать линейную алгебру на JS, под Node.JS?


Можно портировать любую готовую библиотеку, из любой области, а не создавать новую.

Aё>Вызывать нативный код из Node.JS проблемы не представляет.


Из браузера native код не вызовешь.
Re[35]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 08.06.15 20:35
Оценка: 2 (1) :)
Здравствуйте, Sinix, Вы писали:

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


G>>А ты хоть раз людей собеседовал? Сказки какие-то рассказываешь. У меня есть 10 вопросов, которые точно показывают насколько человек понимает .NET. Программисты с 5+ годами опыта отвечают в среднем на 7.


S>Да ладно, что там в базовых вещах может быть такого, чтоб с 5 годами опыта не ответить?

Большая часть сыпется на value-type vs reference type и боксинге. Очень многие не понимают IDisposable. У некоторых проблемы с IEumerable и yield. А самое удивительное, что все подряд пользуются Linq2SQL\EF еще что-то при этом 10% даже не слышали про expression tree.
Re[16]: C# - from indians by indians
От: alex_public  
Дата: 08.06.15 22:05
Оценка: 5 (2)
Здравствуйте, Sinix, Вы писали:

S>А можно весь код на шарпе, чисто посмотреть, что там не так?

    static long Test()
    {
        var sw = Stopwatch.StartNew();
        var buf=(int[])image.Clone();
        int width=image.Length/height;
        for(int n=0; n<count; n++){
            for(int y=1; y<height-1; y++){
                var p=width*y;
                for(int x=1; x<width-1; x++) if(image[p+x]!=0xffffff)
                    buf[p+x]=(image[p-width+x]+image[p+x-1]+image[p-width+x-1]+image[p-width+x+1]+image[p+width+x-1]+image[p+width+x]+image[p+x+1]+image[p+width+x+1])>>3;
            }
            for(int y=1; y<height-1; y++){
                var p=width*y;
                for(int x=1; x<width-1; x++) if(buf[p+x]!=0xffffff)
                    image[p+x]=(buf[p-width+x]+buf[p+x-1]+buf[p-width+x-1]+buf[p-width+x+1]+buf[p+width+x-1]+buf[p+width+x]+buf[p+x+1]+buf[p+width+x+1])>>3;
            }
        }
        sw.Stop();
        return sw.ElapsedMilliseconds;
    }


S>Ну и плюсовый, чтоб сравнить.

int Test()
{
    cpu_timer timer;
    auto buf=image;
    const int width=image.size()/height;
    for(int n=0; n<count; n++){
        for(int y=1; y<height-1; y++){
            const auto s=image.data()+y*width;
            const auto d=buf.data()+y*width;
            for(int x=1; x<width-1; x++) if(s[x]!=0xffffff)
                d[x]=(s[-width+x]+s[x-1]+s[-width+x-1]+s[-width+x+1]+s[width+x-1]+s[width+x]+s[x+1]+s[width+x+1])>>3;
        }
        for(int y=1; y<height-1; y++){
            const auto s=buf.data()+y*width;
            const auto d=image.data()+y*width;
            for(int x=1; x<width-1; x++) if(s[x]!=0xffffff)
                d[x]=(s[-width+x]+s[x-1]+s[-width+x-1]+s[-width+x+1]+s[width+x-1]+s[width+x]+s[x+1]+s[width+x+1])>>3;
        }
    }
    return timer.elapsed().wall/1000000;
}


P.S. Естественно повторяющийся код можно было бы вынести в отдельную функцию (а особенно в C++ с его инлайном), но в разных языках (кстати тестировались не только C++/java/C#) с этим есть разные нюансы, так что для чистоты эксперимента везде оставлен одинаковый код в лоб.
Re[17]: C# - from indians by indians
От: Sinix  
Дата: 09.06.15 09:29
Оценка: 4 (2)
Здравствуйте, alex_public, Вы писали:


_>P.S. Естественно повторяющийся код можно было бы вынести в отдельную функцию (а особенно в C++ с его инлайном), но в разных языках (кстати тестировались не только C++/java/C#) с этим есть разные нюансы, так что для чистоты эксперимента везде оставлен одинаковый код в лоб.

C# версия (без фокусов с fixed, которые превращают C# в кривой аналог C) работает в 7 раз медленнее C++ кода.

В общем никаких 7 раз у меня нет. Что легко можно списать на моё незнание плюсов (что знал — успешно забыл)

1920*1080, 500 повторов, массив заполнен
image[i] = i % 321;

для проверки берём image[2000], чтоб не поломать ничего.

Для шарпа:
// x64
fast:  5744 ms,  res 256
orig: 10338 ms,  res 256

// x86
fast:  7422 ms,  res 256
orig: 13758 ms,  res 256


fast — просто перевёл на fixed()

Для плюсов (win32)
Run: 6586 ms, res:  256


VS 2013, со всеми обновлениями, релиз, без отладчика, настройки сборки для плюсов по умолчанию.
Кто померяет яву? Подозреваю, там тоже не 5 раз будет.

  код
код шарпа:
    static long Test(int[] image, int height, int count)
    {
        var sw = Stopwatch.StartNew();
        var buf=(int[])image.Clone();
        int width=image.Length/height;
        for(int n=0; n<count; n++){
            for(int y=1; y<height-1; y++){
                var p=width*y;
                for(int x=1; x<width-1; x++) if(image[p+x]!=0xffffff)
                    buf[p+x]=(image[p-width+x]+image[p+x-1]+image[p-width+x-1]+image[p-width+x+1]+image[p+width+x-1]+image[p+width+x]+image[p+x+1]+image[p+width+x+1])>>3;
            }
            for(int y=1; y<height-1; y++){
                var p=width*y;
                for(int x=1; x<width-1; x++) if(buf[p+x]!=0xffffff)
                    image[p+x]=(buf[p-width+x]+buf[p+x-1]+buf[p-width+x-1]+buf[p-width+x+1]+buf[p+width+x-1]+buf[p+width+x]+buf[p+x+1]+buf[p+width+x+1])>>3;
            }
        }
        sw.Stop();
        return sw.ElapsedMilliseconds;
    }

    static long Test2(int[] image, int height, int count)
    {
        var sw = Stopwatch.StartNew();
        var buf = (int[])image.Clone();

        for (int n = 0; n < count; n++)
        {
            AtoB(image, buf, height);
            AtoB(buf, image, height);
        }

        sw.Stop();
        return sw.ElapsedMilliseconds;
    }

    unsafe static void AtoB(int[] image, int[] buf, int height)
    {
        int width = image.Length / height;
        fixed (int* a = image, b = buf)
        {
            for (int y = 1; y < height - 1; y++)
            {
                var p = width * y;
                for (int x = 1; x < width - 1; x++)
                {
                    var idx = a + p + x;
                    var idx2 = b + p + x;
                    if (*idx != 0xffffff)
                    {
                        *idx2 = (
                            *(idx - width) + *(idx - 1) +
                            *(idx - width - 1) + *(idx - width + 1) +
                            *(idx + width - 1) + *(idx + width) +
                            *(idx + 1) + *(idx + width + 1)) >> 3;
                    }
                }
            }
        }
    }

    static void Main()
    {
        int[] image = new int[1920 * 1080];
        var rnd = new Random(0);
        for (int i = 0; i < image.Length; i++)
        {
            image[i] = i % 321;
        }
        int[] image2 = (int[])image.Clone();

        Console.WriteLine("Begin");
        long t;
        t = Test2(image, 1920, 500);
        Console.WriteLine("fast: {0} ms,\tres {1}", t, image[2000]);
        t = Test(image2, 1920, 500);
        Console.WriteLine("orig: {0} ms,\tres {1}", t, image2[2000]);

        Console.Write("Done.");
        Console.ReadKey();
    }


Для плюсов (да, он меня самого заставляет плакать кговавыми слезами):
int main()
{
    const int size = 1920 * 1080;
    const int height = 1920;
    const int count = 500;
    int* image = new int[size];
    for (int i1 = 0; i1 < size; i1++)
    {
        image[i1] = i1 % 321;
    }

    LARGE_INTEGER frequency;
    LARGE_INTEGER t1, t2;
    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&t1);

    auto buf = image;
    const int width = size / height;
    for (int n = 0; n<count; n++){
        for (int y = 1; y<height - 1; y++){
            const auto s = image + y*width;
            const auto d = buf + y*width;
            for (int x = 1; x<width - 1; x++) if (s[x] != 0xffffff)
                d[x] = (s[-width + x] + s[x - 1] + s[-width + x - 1] + s[-width + x + 1] + s[width + x - 1] + s[width + x] + s[x + 1] + s[width + x + 1]) >> 3;
        }
        for (int y = 1; y<height - 1; y++){
            const auto s = buf + y*width;
            const auto d = image + y*width;
            for (int x = 1; x<width - 1; x++) if (s[x] != 0xffffff)
                d[x] = (s[-width + x] + s[x - 1] + s[-width + x - 1] + s[-width + x + 1] + s[width + x - 1] + s[width + x] + s[x + 1] + s[width + x + 1]) >> 3;
        }
    }
    QueryPerformanceCounter(&t2);
    std::cout << "Run: " << (int)((t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart) << " res:  " << buf[2000];

    delete[] image;
    return 0;
}
Отредактировано 09.06.2015 9:31 Sinix . Предыдущая версия .
Re[16]: C# - from indians by indians
От: Sinix  
Дата: 09.06.15 09:38
Оценка: 1 (1)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

_>>А то он что-то работает в 5 (!) раз медленнее C++ аналога.

_>>P.S. C# версия (без фокусов с fixed, которые превращают C# в кривой аналог C) работает в 7 раз медленнее C++ кода.

EP>А ты сравнивал генерируемый ASM? Как сильно отличается? Точнее в чём там главный тормоз?

У меня такого разброса не получается.
Автор: Sinix
Дата: 09.06.15
Re[36]: C# - from indians by indians
От: Yoriсk  
Дата: 09.06.15 09:42
Оценка:
Здравствуйте, gandjustas, Вы писали:

S>>Да ладно, что там в базовых вещах может быть такого, чтоб с 5 годами опыта не ответить?

G>Большая часть сыпется на value-type vs reference type и боксинге. Очень многие не понимают IDisposable. У некоторых проблемы с IEumerable и yield. А самое удивительное, что все подряд пользуются Linq2SQL\EF еще что-то при этом 10% даже не слышали про expression tree.

Что-то без конкретных примеров вопросов и предполагаемых ответов не совсем понятно о чём идёт речь.
Re[18]: C# - from indians by indians
От: alex_public  
Дата: 09.06.15 09:58
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>В общем никаких 7 раз у меня нет. Что легко можно списать на моё незнание плюсов (что знал — успешно забыл)


S>Для шарпа:

S>
S>// x64
S>fast:  5744 ms,  res 256
S>orig: 10338 ms,  res 256

S>// x86
S>fast:  7422 ms,  res 256
S>orig: 13758 ms,  res 256
S>


S>fast — просто перевёл на fixed()


S>Для плюсов (win32)

S>
S>Run: 6586 ms, res:  256
S>


S>VS 2013, со всеми обновлениями, релиз, без отладчика, настройки сборки для плюсов по умолчанию.

S>Кто померяет яву? Подозреваю, там тоже не 5 раз будет.

Скорее всего дело в неверных настройках компилятора C++ — ему не позволена автовекторизация. ) У меня такие цифры (правда компилятор gcc):
C# — 8,7 c
Java = 7,3 с
C++ — 1,3 с.

Однако даже и без автовекторизазии на твоих же цифрах видно, что разница между C++ и C# вариантом в 2 раза — это уже убойно. )))
Re[19]: C# - from indians by indians
От: Sinix  
Дата: 09.06.15 10:18
Оценка: 1 (1)
Здравствуйте, alex_public, Вы писали:

_>Скорее всего дело в неверных настройках компилятора C++ — ему не позволена автовекторизация. ) У меня такие цифры (правда компилятор gcc):

Да, с /Qvec-report:2 вывод:
info C5002: loop not vectorized due to reason '1200'
// Loop contains loop-carried data dependences

Выше по ветке уже был похожий пример
Автор: PM
Дата: 05.06.15
. Компилятор c++ в vs2013 местами не блещет.

_>Однако даже и без автовекторизазии на твоих же цифрах видно, что разница между C++ и C# вариантом в 2 раза — это уже убойно. )))

Угу, нынешний JIT на числомолотилки не заточен, это давно известно. Чисто ради интереса: какой фреймворк и x64 или x86 вариант проверялся?

P.S. Разница в 2 раза там из-за проверок на границы массива. Для всего кроме "i=0;i<array.Length" они не убираются.

UPD Не из-за них, протупил. Для варианта с указателями на 7 сложений меньше, т.к. аналог (a[p + x]) вычисляется 1 раз. Вот этот вариант с указателями, но с доступом по индексу не отличается от safe-варианта:
    unsafe static void AtoB(int[] image, int[] buf, int height)
    {
        int width = image.Length / height;
        fixed (int* a = image, b = buf)
        {
            for (int y = 1; y < height - 1; y++)
            {
                var p = width * y;
                for (int x = 1; x < width - 1; x++)
                {
                    var idx = p + x;
                    if (a[idx] != 0xffffff)
                    {
                        b[idx] = (
                            a[idx - width] + a[idx - 1] +
                            a[idx - width - 1] + a[idx - width + 1] +
                            a[idx + width - 1] + a[idx + width] +
                            a[idx + 1] + a[idx + width + 1]) >> 3;
                    }
                }
            }
        }
    }


UPD2 Ну да, собственно этим твои варианты под шарп и c++ и отличаются
image[p-width+x] // c#
vs
s[-width+x]    // c++, s == image + p

Как только я их привёл к одному виду на автомате — время совпало с нативным результатом без автовекторизации.

Ручную векторизацию конечно можно попробовать сделать с RyuJIT + SIMD, но это уже за гранью добра и зла имхо. Нужна производительность — проще вытащить кусок в unmanaged-код и не страдать из-за "если добавить 7 лишних сложений, то шарп медленный".
Отредактировано 09.06.2015 11:23 Sinix . Предыдущая версия . Еще …
Отредактировано 09.06.2015 11:11 Sinix . Предыдущая версия .
Отредактировано 09.06.2015 10:27 Sinix . Предыдущая версия .
Re[17]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 09.06.15 10:18
Оценка:
Здравствуйте, alex_public, Вы писали:

S>>Ну и плюсовый, чтоб сравнить.

_>
_>int Test()
_>{
_>    cpu_timer timer;
_>    auto buf=image;
_>    const int width=image.size()/height;
_>    for(int n=0; n<count; n++){
_>        for(int y=1; y<height-1; y++){
_>            const auto s=image.data()+y*width;
_>            const auto d=buf.data()+y*width;
_>            for(int x=1; x<width-1; x++) if(s[x]!=0xffffff)
_>                d[x]=(s[-width+x]+s[x-1]+s[-width+x-1]+s[-width+x+1]+s[width+x-1]+s[width+x]+s[x+1]+s[width+x+1])>>3;
_>        }
_>        for(int y=1; y<height-1; y++){
_>            const auto s=buf.data()+y*width;
_>            const auto d=image.data()+y*width;
_>            for(int x=1; x<width-1; x++) if(s[x]!=0xffffff)
_>                d[x]=(s[-width+x]+s[x-1]+s[-width+x-1]+s[-width+x+1]+s[width+x-1]+s[width+x]+s[x+1]+s[width+x+1])>>3;
_>        }
_>    }
_>    return timer.elapsed().wall/1000000;
_>}
_>


В таком виде GCC автовекторизирует и на x64 и на x32. Но я бы не сказал что тут прям какое-то принципиальное изменение в коде, это скорее недоработка автовекторизатора, тем более он справлялся с векторизацией на x32 без такого изменения (я бы ещё понял если бы наоборот, на x32 он не смог).
Возможно стоит отправить этот пример в их bug tracker?
Re[20]: C# - from indians by indians
От: alex_public  
Дата: 09.06.15 19:57
Оценка: 3 (1) +1 -2
Здравствуйте, Sinix, Вы писали:

S>Выше по ветке уже был похожий пример
Автор: PM
Дата: 05.06.15
. Компилятор c++ в vs2013 местами не блещет.


Да я вообще не пойму кто там ещё пользуется этим убожеством. И дело даже не в оптимизациях, а в стандартах. Кругом уже все на C++14 работают (полиморфные лямбды крайне удобны), а в у MS ещё даже C++11 целиком не реализован.

S>Угу, нынешний JIT на числомолотилки не заточен, это давно известно. Чисто ради интереса: какой фреймворк и x64 или x86 вариант проверялся?


Ммм, а у меня вроде как нет никакой разницы... Т.е. все изначальные тесты я делал для x64 (на всех языках), но сейчас отдельно глянул — 32-ух битный код ничего не меняет.

S>UPD Не из-за них, протупил. Для варианта с указателями на 7 сложений меньше, т.к. аналог (a[p + x]) вычисляется 1 раз. Вот этот вариант с указателями, но с доступом по индексу не отличается от safe-варианта:


Всё верно, я как раз на это и указывал здесь. Что многие алгоритмы записываются максимально эффективно только при наличие в языке арифметики указателей. Т.е. в Java вообще без шансов. В C# ещё можно вывернуться, но тут уже многие говорили, что программировать на unsafe C# смысла нет — это даже ещё более печально, чем на чистом C.

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

S>UPD2 Ну да, собственно этим твои варианты под шарп и c++ и отличаются

S>Как только я их привёл к одному виду на автомате — время совпало с нативным результатом без автовекторизации.

На самом деле не совпадает (разве что с результатом убогого компилятора от MS), но действительно уже близко. Могу показать свои результаты в виде единой таблички:

C++ — 1,3 с.
C++ с отключённой векторизацией — 3,5 с.
D — 4,9 с.
C# unsafe + страшный код с обращением к массиву через * — 5 с.
C# unsafe — 5,9 с.
Java — 7,3 с.
C# — 8,7 с.

Показательно значение для языка D (оригинальный компилятор, а не gdc) — там мы имеем полностью нативный код с указателями, без всяких рантайм проверок, но при этом со слабеньким оптимизатором.

Кстати, видно, что у C++ варианта есть большой простор по ручной SIMD оптимизации. Т.к. прирост в 3 раза — это явно меньше того, что можно получить на современных процессорах. Автовекторизация пока ещё отстаёт от ручной, но думаю через несколько лет это исправится. Так же как когда-то исправилось с обычной оптимизацией.

А ещё на C++ это всё можно распараллелить на все ядра процессора или вообще посчитать на gpu с помощью добавления одной инструкции (openmp или openacc) над циклом. Но это уже другая тема. Просто вспомнилось в контексте обсуждения максимальной эффективности вычислений. )

S>Ручную векторизацию конечно можно попробовать сделать с RyuJIT + SIMD, но это уже за гранью добра и зла имхо. Нужна производительность — проще вытащить кусок в unmanaged-код и не страдать из-за "если добавить 7 лишних сложений, то шарп медленный".


Вообще то .net умеет автовекторизацию, правда в самых тривиальных случаях. Кстати старый компилятор C# (на моём старом компьютере) справлялся даже с примером выше, но только в unsafe варианте (где он в точности как C++ вариант). А вот новый что-то не может ни в каком варианте. Странно даже. Но в любом случае наличие автовекторизации в компиляторе не поможет на таких примерах без использования unsafe. А поводу смысла программирования на unsafe C# тут уже высказали много чего. )))
Отредактировано 09.06.2015 20:05 alex_public . Предыдущая версия .
Re[18]: C# - from indians by indians
От: alex_public  
Дата: 09.06.15 20:23
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В таком виде GCC автовекторизирует и на x64 и на x32. Но я бы не сказал что тут прям какое-то принципиальное изменение в коде, это скорее недоработка автовекторизатора, тем более он справлялся с векторизацией на x32 без такого изменения (я бы ещё понял если бы наоборот, на x32 он не смог).


Если x32 может, а x64 нет, то понятно что какая-то недоработка — должно уметь оба варианта или не уметь ни один. Но вот по поводу изменения кода хочу заметить, что в таком варианте снимается некий логический уровень косвенности. Всё же между:
d[x]=s[x-1]+s[x+1];

и
d[x+width*y]=s[x-1+width*y]+s[x+1+width*y];

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

EP>Возможно стоит отправить этот пример в их bug tracker?


А там случаем не разные команды работают над х32 и х64 оптимизаторами? ) Ну и в любом случае лично у меня сейчас и так перебор с другими делами. )
Re[36]: C# - from indians by indians
От: greenpci  
Дата: 10.06.15 11:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Большая часть сыпется на value-type vs reference type и боксинге. Очень многие не понимают IDisposable. У некоторых проблемы с IEumerable и yield. А самое удивительное, что все подряд пользуются Linq2SQL\EF еще что-то при этом 10% даже не слышали про expression tree.


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

Я еще соглашусь, что можно работать без знаний боксинга и expression tree, но остальное знать просто обязательно для работы. И я тебе сочувствую, как и себе впрочем, так как я тоже имею дело с дотнетом.

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

Но, это идеалистический взгляд на жизнь. В реальной корпорации, где софт скилс рулят, не всегда начальником становится технический человек и собеседующие не всегда являются профессионалами. Для таких условий лучше иметь какой-то автоматический метод отбора, такой, как знание Си++, например.

По поводу ORM, я заметил, что многие так любят его, только из-за того, что они не знают и не хотят знать SQL и пытаются, таким образом, облегчить себе жизнь.
Re[19]: C# - from indians by indians
От: Evgeny.Panasyuk Россия  
Дата: 10.06.15 12:58
Оценка:
Здравствуйте, alex_public, Вы писали:

EP>>В таком виде GCC автовекторизирует и на x64 и на x32. Но я бы не сказал что тут прям какое-то принципиальное изменение в коде, это скорее недоработка автовекторизатора, тем более он справлялся с векторизацией на x32 без такого изменения (я бы ещё понял если бы наоборот, на x32 он не смог).

_>Если x32 может, а x64 нет, то понятно что какая-то недоработка — должно уметь оба варианта или не уметь ни один.

На x64 больше регистров, я бы понял если бы на x64 получилось, а на x32 нет.

_>Но вот по поводу изменения кода хочу заметить, что в таком варианте снимается некий логический уровень косвенности. Всё же между:

_>
d[x]=s[x-1]+s[x+1];

_>и
_>
d[x+width*y]=s[x-1+width*y]+s[x+1+width*y];

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

1. Разница есть, и действительно хорошо когда есть возможность иметь средства для её выражения в коде. Но всё же по-хорошему оптимизатор должен был с ней справится.
2. Я пробовал вообще без индексов — 8 указателей — оно нигде не векторизовалось, даже с __restrict'ами. Оно начинает векторизироваться если убрать if из цикла.

EP>>Возможно стоит отправить этот пример в их bug tracker?

_>А там случаем не разные команды работают над х32 и х64 оптимизаторами? )

Не знаю, а зачем могло бы понадобится разделение на таком высоком уровне (относительно векторизации)?

_>Ну и в любом случае лично у меня сейчас и так перебор с другими делами. )


Мне не трудно отправить когда будет время. Это я так, советуюсь.
Re[37]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.06.15 12:58
Оценка:
Здравствуйте, greenpci, Вы писали:

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


G>>Большая часть сыпется на value-type vs reference type и боксинге. Очень многие не понимают IDisposable. У некоторых проблемы с IEumerable и yield. А самое удивительное, что все подряд пользуются Linq2SQL\EF еще что-то при этом 10% даже не слышали про expression tree.


G>Да... Ты только подтверждаешь сказанное мной выше. Если так много людей сыпятся на этих вопросах, то дела в дотнете очень плохи. В плюсах они не смогли бы и пару байтов переслать без подобных знаний.

Ты прямо яркий пример confirmation bias, ищешь любые доказательства своей позиции даже если факты твою позицию прямо опровергают.
Вот смотри:
1) Программисты на .NET в среднем плохо знают .net
2) При этом они вполне успешно работают .net разработчиками, только получают меньше, чем хотели бы
С одной стороны если ты захочешь найти хороших программистов, то вполне сможешь отфильтровать неподходящих. В другой стороны ты всегда можешь взять более дешевых и организовать более плотный контроль над тем, что пишут. Для C++ картина ровно обратная — мало спецов на рынке, а брать "студентов" — получить совершенно нерабочий код. В итоге за ту же самую разработку ты вынужден платить дороже и никуда не денешься.
То, что ты доказываешь, не выдерживает проверку реальностью.

G>Я еще соглашусь, что можно работать без знаний боксинга и expression tree, но остальное знать просто обязательно для работы. И я тебе сочувствую, как и себе впрочем, так как я тоже имею дело с дотнетом.

Ты удивишься, но на .NET можно много чего и даже успешно написать не зная вообще нечего из этих 10 вопросов (на самом деле на пару вопросов надо ответить). Но это джуниоры, а я набирал обычно крутых чуваков .

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

Зачем команда? Достаточно одного.

G>Но, это идеалистический взгляд на жизнь. В реальной корпорации, где софт скилс рулят, не всегда начальником становится технический человек и собеседующие не всегда являются профессионалами. Для таких условий лучше иметь какой-то автоматический метод отбора, такой, как знание Си++, например.

Непонятно чем C++ поможет. Если собеседующий не сможет задать правильные вопросы, то можно проскочить независимо от знания. Или ты думешь что знание C++ будет видно любому неподготовленному человеку?
Re[21]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.06.15 13:15
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Да, и что самое главное... В таком варианте код не только быстрее, но и удобнее. Т.е. в отличие от вариантов во многих других языках, где нам надо уродовать код для достижения производительности, здесь у нас самый красивый код является самым быстрым.

Ровно до тех пор пока не нужна асинхронность

А вообще правильно. Всю математику лучше на C++ (или даже на C, в примерах C++ и не пахнет).

_>А ещё на C++ это всё можно распараллелить на все ядра процессора или вообще посчитать на gpu с помощью добавления одной инструкции (openmp или openacc) над циклом. Но это уже другая тема. Просто вспомнилось в контексте обсуждения максимальной эффективности вычислений. )

В .NET просто меняешь for на Parallel.For

_>Вообще то .net умеет автовекторизацию, правда в самых тривиальных случаях.

Вообще не умет. Ни авто, ни ручную. Давно еще читал статью про JIT, там чувак писал что намеренно отказались от векторных операций, чтобы не получать 100500 разных исполняемых образов под разные процессоры. Только в RyuJIT сделали классы для векторов и компиляцию в векторные инструкции (как в mono).

_>Кстати старый компилятор C# (на моём старом компьютере) справлялся даже с примером выше, но только в unsafe варианте (где он в точности как C++ вариант). А вот новый что-то не может ни в каком варианте. Странно даже. Но в любом случае наличие автовекторизации в компиляторе не поможет на таких примерах без использования unsafe. А поводу смысла программирования на unsafe C# тут уже высказали много чего. )))

Тут наоборот надо повышать уровень абстрации. Был такой проект — accelerator (http://research.microsoft.com/pubs/70250/tr-2005-184.pdf), который позволял описывать вычисления над массивами и матрицами, а потом запускать это все на видеокарте. Даже примеры в интернетах можно найти — http://tomasp.net/blog/accelerator-dataparallel.aspx/.
Все API строилось как раз на операциях с векторами и матрицами, а они потом уже перекладывались в GPU или SSE.
Но, увы, в MS забили на этот проект.
Re[20]: C# - from indians by indians
От: alex_public  
Дата: 10.06.15 15:11
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>2. Я пробовал вообще без индексов — 8 указателей — оно нигде не векторизовалось, даже с __restrict'ами. Оно начинает векторизироваться если убрать if из цикла.


Ну индекс то для векторизации как раз нужен (так же как и для openmp или openacc), но желательно только один — так сказать идеальная ситуация для векторизации. )
Re[22]: C# - from indians by indians
От: alex_public  
Дата: 10.06.15 15:21
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

_>>Да, и что самое главное... В таком варианте код не только быстрее, но и удобнее. Т.е. в отличие от вариантов во многих других языках, где нам надо уродовать код для достижения производительности, здесь у нас самый красивый код является самым быстрым.

G>Ровно до тех пор пока не нужна асинхронность

Если ты про что-то вроде async/await, то в отличие от stackless реализации в .net, в C++ мы имеем ещё и stackfull реализации (типа Boost.Coroutine), которые заметно эффективнее.

Но всё это уже обсуждалось на форуме ещё пару лет назад. Не вижу смысла в повторном пережёвывание.

_>>А ещё на C++ это всё можно распараллелить на все ядра процессора или вообще посчитать на gpu с помощью добавления одной инструкции (openmp или openacc) над циклом. Но это уже другая тема. Просто вспомнилось в контексте обсуждения максимальной эффективности вычислений. )

G>В .NET просто меняешь for на Parallel.For

Не всё так просто. Parallel.For требует лямбду. А в .net лямбда не совместима с fixed. Т.е. легко в Parallel.For засовывается только медленный safe вариант кода. А чтобы распараллелить unsafe вариант надо уже напрягаться.

Ну а про аналог openacc я вообще молчу. )))

_>>Вообще то .net умеет автовекторизацию, правда в самых тривиальных случаях.

G>Вообще не умет. Ни авто, ни ручную. Давно еще читал статью про JIT, там чувак писал что намеренно отказались от векторных операций, чтобы не получать 100500 разных исполняемых образов под разные процессоры. Только в RyuJIT сделали классы для векторов и компиляцию в векторные инструкции (как в mono).

Хм, может ты конечно и прав. Тем более, что на текущем компьютере никаких векторизаций у C# я действительно не наблюдаю. Однако у меня было чёткое воспоминание, что на старой машине вариант C# unsafe всё же векторизовался. Как доберусь до неё, так сразу проверю. )))
Re[23]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 10.06.15 21:42
Оценка: +1
Здравствуйте, alex_public, Вы писали:


_>>>А ещё на C++ это всё можно распараллелить на все ядра процессора или вообще посчитать на gpu с помощью добавления одной инструкции (openmp или openacc) над циклом. Но это уже другая тема. Просто вспомнилось в контексте обсуждения максимальной эффективности вычислений. )

G>>В .NET просто меняешь for на Parallel.For

_>Не всё так просто. Parallel.For требует лямбду. А в .net лямбда не совместима с fixed. Т.е. легко в Parallel.For засовывается только медленный safe вариант кода. А чтобы распараллелить unsafe вариант надо уже напрягаться.

Там где "требует лямбду" можно передать обычную функцию. А обычная функция вполне может быть unsafe.

_>Ну а про аналог openacc я вообще молчу. )))



_>Хм, может ты конечно и прав. Тем более, что на текущем компьютере никаких векторизаций у C# я действительно не наблюдаю. Однако у меня было чёткое воспоминание, что на старой машине вариант C# unsafe всё же векторизовался. Как доберусь до неё, так сразу проверю. )))


В той же статье было, что векторные инструкции используются для более быстрого обнуления или какой-то подобной, не сильно важной операции.
Re[24]: C# - from indians by indians
От: alex_public  
Дата: 10.06.15 23:18
Оценка:
Здравствуйте, gandjustas, Вы писали:

_>>Не всё так просто. Parallel.For требует лямбду. А в .net лямбда не совместима с fixed. Т.е. легко в Parallel.For засовывается только медленный safe вариант кода. А чтобы распараллелить unsafe вариант надо уже напрягаться.

G>Там где "требует лямбду" можно передать обычную функцию. А обычная функция вполне может быть unsafe.

Ну так если у нас не лямбда, то как тогда в эту функцию будут переданы сами массивы и т.п? Это что, отдельный класс писать для организации подобного цикла? )))

_>>Хм, может ты конечно и прав. Тем более, что на текущем компьютере никаких векторизаций у C# я действительно не наблюдаю. Однако у меня было чёткое воспоминание, что на старой машине вариант C# unsafe всё же векторизовался. Как доберусь до неё, так сразу проверю. )))

G>В той же статье было, что векторные инструкции используются для более быстрого обнуления или какой-то подобной, не сильно важной операции.

Глянул сейчас. В общем на старой машинке (C2D, WinXP 32) C# unsafe вариант кода исполняется почти с той же производительностью, что и C++ вариант с SIMD (и соответственно в несколько раз быстрее, чем просто C# или Java вариант и даже быстрее чем D и невекторизованный C++). Диссасемблером я туда не лазил, так что конечно же ничего точно сказать не могу. Но никаких других объяснений, кроме использования SIMD в этом коде, мне в голову не приходит. И больше всего меня сбивает с толку, что на текущей машинке (Haswell Xeon, Win7 64) ничего подобного не наблюдается — тут unsafe медленнее D.
Re[38]: C# - from indians by indians
От: greenpci  
Дата: 11.06.15 03:10
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

G>Вот смотри:

G>1) Программисты на .NET в среднем плохо знают .net
G>2) При этом они вполне успешно работают .net разработчиками, только получают меньше, чем хотели бы

Успешно то успешно, но медленно. Почему программист с 5+ стажем плохо знает дотнет? Потому, что он не любит свою работу и думает об отпуске на бали или лыжном спорте в рабочее время. Такой человек будет успешно выполнять свою работу, но медленно. Думаю не будешь спорить, что работа без энтузиазма, гораздо медленнее. Как говорил один писатель блога, с энтузиазмом работа "летит", а без него она "ползет". А ты подтвердил, что "в среднем". То есть, в среднем, дотнет программист работает без энтузиазма, следовательно медленно. Исходя из этого, основное преимущество над С++ под вопросом для среднего разработчика.

G>С одной стороны если ты захочешь найти хороших программистов, то вполне сможешь отфильтровать неподходящих. В другой стороны ты всегда можешь взять более дешевых и организовать

более плотный контроль над тем, что пишут.

Плотный контроль организовать можно, но, опять же, работа будет идти медленно. По поводу нахождения хороших дотнет программистов, как бы не получилось, что они так же редки, как и С++ программисты. Особенно, если учесть, что дотнет это новая технология и многие работники уже начали с графических мышко-клик интерфейсов и перескочили командную строку и сопутствующие сложности. А без сложностей нет опыта и знаний. А хорошие дотнет программисты — это бывшие плюсники, которые перешли туда из-за экономических соображений.

UPD: специально залез посмотреть про тебя и оказалось, как в воду смотрел. Бывший С++ программист. Вот тебя я бы взял на работу

От: gandjustas Россия http://gandjustas.blogspot.com/
Дата: 23.09.07 06:21
Здравствуйте, TNikolay, Вы писали:

TN> pc валиден только пока str не вышла из области видимости или нет? и если мы str="d"; сделаем то все, pc уже "не тот"?
В принципе указатель, возвращенный c_str, действителен пока не вызвана неконстантная функция. Соответственно operator= совсем не константная функция.

TN>Это более менее нормально или есть более правильный путь?
Нормально. Хотя красивее было бы писать что-то типа Screen<<"State = "<< field[col][row].state <<" , value = "<< field[col][row].value;



G>Для C++ картина ровно обратная — мало спецов на рынке, а брать "студентов" — получить совершенно нерабочий код. В итоге за ту же самую разработку ты вынужден платить дороже и никуда не денешься.


Возможно, это российская картина. В Австралии, например, переизбыток Си плюс плюс программисов с опытом, которые не могут найти работу, потому что все уже перешли на дотнет.

G>То, что ты доказываешь, не выдерживает проверку реальностью.


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

G>Зачем команда? Достаточно одного.


Да, согласен. Просто, по опыту, собеседуют, обычно, по двое.

G>Непонятно чем C++ поможет. Если собеседующий не сможет задать правильные вопросы, то можно проскочить независимо от знания. Или ты думешь что знание C++ будет видно любому неподготовленному человеку?


Легче определить дейстивельно ли человек работал на С++, чем определить хороший ли он разработчик в определенной технологии. Можно задать простые, полутехнические вопросы о прошлом опыте.

Что использовали?
Зачем?
Почему?
Что делали?
Какие сложности были?

По ответам, взляду, тону голоса, мудрый успешный руководитель с софт скиллами сможет определить врет или нет. Помнишь, как мудрая женщина раскусила Шарапова, посмотрев на его руки? "Какой же ты водитель с такими руками?". Конечно, есть шанс, что кто-то удобно сидел в корпорации рядом с С++ программистами, но это гораздо реже, так как слишком не эффективно и расточительно для предприятия.
Отредактировано 11.06.2015 7:16 greenpci . Предыдущая версия . Еще …
Отредактировано 11.06.2015 3:14 greenpci . Предыдущая версия .
Re[37]: C# - from indians by indians
От: greenpci  
Дата: 11.06.15 07:06
Оценка: -1
Здравствуйте, Yoriсk, Вы писали:

Y>Что-то без конкретных примеров вопросов и предполагаемых ответов не совсем понятно о чём идёт речь.


Ты точно не С++ программист.
Re[39]: C# - from indians by indians
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 11.06.15 12:16
Оценка: 1 (1) +1
Здравствуйте, greenpci, Вы писали:

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


G>>Вот смотри:

G>>1) Программисты на .NET в среднем плохо знают .net
G>>2) При этом они вполне успешно работают .net разработчиками, только получают меньше, чем хотели бы

G>Успешно то успешно, но медленно. Почему программист с 5+ стажем плохо знает дотнет? Потому, что он не любит свою работу и думает об отпуске на бали или лыжном спорте в рабочее время. Такой человек будет успешно выполнять свою работу, но медленно. Думаю не будешь спорить, что работа без энтузиазма, гораздо медленнее. Как говорил один писатель блога, с энтузиазмом работа "летит", а без него она "ползет". А ты подтвердил, что "в среднем". То есть, в среднем, дотнет программист работает без энтузиазма, следовательно медленно. Исходя из этого, основное преимущество над С++ под вопросом для среднего разработчика.

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

Скорость работы кстати от знаний не зависит, она зависит исключительно от опыта. Если человек решал проблемы 100 раз, что и 101 раз быстро сделает, если ранее такие проблемы не решал, то знания вряд ли помогут сделать быстрее.

Тут, кстати, С++ может сыграть злую шутку. На собеседованиях в основном то знания можно проверить, а не опыт, и человек, который прочитал внимательно 4-5 книг покажется офигенно умным, хотя реального опыта у него будет 0 и будет делать 100500 "детских" ошибок пока не получит опыт.
Я вот никогда не писал на С++ за деньги, только в универе изучал, но один раз легко прошел собеседование на топовую ЗП на С++ в одной конторе в родном городе.

G>>С одной стороны если ты захочешь найти хороших программистов, то вполне сможешь отфильтровать неподходящих. В другой стороны ты всегда можешь взять более дешевых и организовать

G>более плотный контроль над тем, что пишут.

G>Плотный контроль организовать можно, но, опять же, работа будет идти медленно.

Это зависит от руководителя в первую очередь и от опыта программистов, а вовсе не от знаний.

G>По поводу нахождения хороших дотнет программистов, как бы не получилось, что они так же редки, как и С++ программисты. Особенно, если учесть, что дотнет это новая технология и многие работники уже начали с графических мышко-клик интерфейсов и перескочили командную строку и сопутствующие сложности. А без сложностей нет опыта и знаний.

Ниже порог вхождения — больше рынок. Экономику не обманешь. Спрос достаточен, чтобы рынок не развалился.

G>А хорошие дотнет программисты — это бывшие плюсники, которые перешли туда из-за экономических соображений.

Наоборот. Те кто писал на плюсах последние три года чаще всего выдают хреновый код на C# да еще и часто путаются в особенностях платформы. Я провел более 200 собеседований и все это видел в живую.

G>UPD: специально залез посмотреть про тебя и оказалось, как в воду смотрел. Бывший С++ программист. Вот тебя я бы взял на работу

Во-во, ты подтверждаешь мои слова. Я никогда не писал на C++ заденьги, у меня нет опыта, я не знаю буст, посредственно знаю stl, не знаю какой результат дает (i+++++i), по сути на C++ могу написать только самые простые программы. В С++ я тяну на юниора, от силы на мидла.
Примерно таким же макаром мне предлагали топовую ЗП в С++ной конторе в моем родном городе в 2008 году (разгар кризиса, а эти хлопчики работали на западные компании).



G>>Для C++ картина ровно обратная — мало спецов на рынке, а брать "студентов" — получить совершенно нерабочий код. В итоге за ту же самую разработку ты вынужден платить дороже и никуда не денешься.

G>Возможно, это российская картина. В Австралии, например, переизбыток Си плюс плюс программисов с опытом, которые не могут найти работу, потому что все уже перешли на дотнет.
Да, там рынок С++ схлопнулся (спрос упал до почти нуля), у нас не упадет, у нас банально больше контор и больше унаследованного кода.

G>>То, что ты доказываешь, не выдерживает проверку реальностью.

G>Мы этого никогда не узнаем, потому что большинство руководителей рассуждает так же, как ты и уже перешли на джаву и дотнет. Но, то что делают все, это не всегда разумно.
То что делают — всегда разумно. Просто ты не знаешь мотивации и целей того, кто принимает решение.


G>>Непонятно чем C++ поможет. Если собеседующий не сможет задать правильные вопросы, то можно проскочить независимо от знания. Или ты думешь что знание C++ будет видно любому неподготовленному человеку?

G>Легче определить дейстивельно ли человек работал на С++, чем определить хороший ли он разработчик в определенной технологии. Можно задать простые, полутехнические вопросы о прошлом опыте.
Хороший разработчик = знания + опыт. Знания определить легко. Опыт — почти нереально.

G>Что использовали?

Использовал XYZ (на деле ни одной строчки с XYZ не написал, просто оно было в проекте)

G>Зачем?

Начальство сказало надо — не мое решение

G>Почему?

См выше

G>Что делали?

Делали проект ABC, который... (на самом деле я там написал 10 строк и все, а остальное время ковырялся в носу)

G>Какие сложности были?

(Тут рассказывается душещипательная история про баг с утечкой, дедлоком или race condition, который бороли долго, я но к нему никакого отношения не имел, просто со стороны видел)

И это еще хорошо если так расскажут, а ведь большинство программистов и два слова не может в таком разговоре склеить.

G>По ответам, взляду, тону голоса, мудрый успешный руководитель с софт скиллами сможет определить врет или нет.

А чего тут врать? Достаточно не уточнять детали. Вроде как неправду не сказал, а сразу "опыта" у тебя стало в разы больше.

G>Помнишь, как мудрая женщина раскусила Шарапова, посмотрев на его руки? "Какой же ты водитель с такими руками?".

Да-да, апелляция к фильмам — отличный аргумент.
На деле такого "опытного" человека проще раскусить именно на знаниях. Был у меня пример — чувак позиционировал себя как супер-мега DBA и не представлял уровни изоляции, на этом и засыпался, а опыта у него было ого-го и рассказывал он неплохо.

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

G>Конечно, есть шанс, что кто-то удобно сидел в корпорации рядом с С++ программистами, но это гораздо реже, так как слишком не эффективно и расточительно для предприятия.

Такое происходит очень часто. Берут стажера, они полгода смотрит чем занимаются люди и усиленно читает книжки. Сам код в продакшн не пишет, занимается каким-нить простым тулингом. Потом идет собеседоваться и рассказыват будто он сам делал все, что делали коллеги. А знания из книжек помогают отвечать на технические вопросы. И не понятно брать его в программисты или продавцы.
Re[40]: C# - from indians by indians
От: greenpci  
Дата: 11.06.15 13:53
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Знания и опыт с энтузиазмом не связаны. Скорее я видел опытных людей без этузиазма и неопытных с шилом в одном месте, чем наоборот. Ты все пытаешь доказать свою точку зрения приводя совершенно бредовые аргументы, которые не выдерживают проверку реальностью.


Я больше про долговременный энтузиазм, который двигает человека к познанию многие годы. Без энтузиазма будет только опыт, но не будет знаний. Корпоративный программист может фиксить мелкие баги несколько лет в старом продукте. Если у него нет энтузиазма, он не будет ничего знать, зато будет обладать гигантским опытом пофиксить нал референс эксепшн. Такой человек и не сможет ответить на твои семь вопросов, в тоже время, обладая гигантским опытом. Я работал с человеком, который сидел на продукте 18 !!! лет и вручную билдил 4 конфигурации (32bit+64bit)*(release+debug), при этом он не распараллелил компилятор имея машину с 4мя ядрами. На это у него уходило часа полтора внимательной ручной работы, где можно было допустить ошибку. Вот это опыт !!!. Когда я пришел с энтузиазмом, написал скрипт, распараллелил компиляцию и мы оба освободили кучу времени. Вот это энтузиазм и знания. Никто не спорит, энтузиазм должен быть основан на здравом смысле и должен быть приложен в правильном направлении и когда надо, а не с "шилом в одном месте".

G>Скорость работы кстати от знаний не зависит, она зависит исключительно от опыта. Если человек решал проблемы 100 раз, что и 101 раз быстро сделает, если ранее такие проблемы не решал, то знания вряд ли помогут сделать быстрее.


И какие проблемы в программировании можно решать 100 раз? Если ты сидишь много лет на одном продукте, то код нужно использовать заново. Если перемещаешься каждые пару лет, то в дотнете уже успеют выпустить новую версию фреймворка и метод решения этой проблемы изменится. Другое дело консалтинг, возможно, ты про такую работу говоришь.

G>Тут, кстати, С++ может сыграть злую шутку. На собеседованиях в основном то знания можно проверить, а не опыт, и человек, который прочитал внимательно 4-5 книг покажется офигенно умным, хотя реального опыта у него будет 0 и будет делать 100500 "детских" ошибок пока не получит опыт.


Обычный человек не сможет удержать в голове знания из 4-5 книг, если он этим не занимается или не занимался. В одно ухо войдет, в другое выйдет. Я вот сейчас возьму книгу по ядерной физике, что у меня от нее в голове останется. Не спорю, есть люди с хорошей памятью, но это исключение и о них никто не говорит.

G>Я вот никогда не писал на С++ за деньги, только в универе изучал, но один раз легко прошел собеседование на топовую ЗП на С++ в одной конторе в родном городе.


значит память хорошая. Исключение.

G>>Плотный контроль организовать можно, но, опять же, работа будет идти медленно.

G>Это зависит от руководителя в первую очередь и от опыта программистов, а вовсе не от знаний.

как ты хитро разделил опыт от знаний. Ну это, наверное, феномен выше с 5тью книгами и памятью. Это исключение. Обычный человек не запоминает не нужные ему знания в достаточной мере, чтобы пройти 2 — 4 часовое собеседование с пристрастием.

G>Наоборот. Те кто писал на плюсах последние три года чаще всего выдают хреновый код на C# да еще и часто путаются в особенностях платформы. Я провел более 200 собеседований и все это видел в живую.


На собеседованиях, возможно. Но если бы ты их все таки взял на работу, дал бы пару месяцев освоиться, из них бы получились дотнетчики намного лучше. От человека зависит, конечно. Но если сравнивать самых худших в плюсах с самыми худшими в дотнете, и которые, действительно, что-то программировали, то плюсисты будут лучше в дотнете. Такое мое мнение.

G>>UPD: специально залез посмотреть про тебя и оказалось, как в воду смотрел. Бывший С++ программист. Вот тебя я бы взял на работу

G>Во-во, ты подтверждаешь мои слова. Я никогда не писал на C++ заденьги, у меня нет опыта, я не знаю буст, посредственно знаю stl, не знаю какой результат дает (i+++++i), по сути на C++ могу написать только самые простые программы. В С++ я тяну на юниора, от силы на мидла.

ты исключение. С плюсами не работал, а обучал плюсистов на рсдн правильно работать с потоками. Чтож, похвально.

G>Примерно таким же макаром мне предлагали топовую ЗП в С++ной конторе в моем родном городе в 2008 году (разгар кризиса, а эти хлопчики работали на западные компании).


Да, есть такие люди. У меня в универе был парень, который за 15 минут до экзаменя быстро готовился и сдавал на 5ть.

G>Да, там рынок С++ схлопнулся (спрос упал до почти нуля), у нас не упадет, у нас банально больше контор и больше унаследованного кода.


Надеюсь, что новый тоже на плюсах пишут. Но не знаю, так как не в России, в данным момент.

G>>Мы этого никогда не узнаем, потому что большинство руководителей рассуждает так же, как ты и уже перешли на джаву и дотнет. Но, то что делают все, это не всегда разумно.

G>То что делают — всегда разумно. Просто ты не знаешь мотивации и целей того, кто принимает решение.

Выделенное — максимализм. Что-то разумно, а что-то нет.

G>Хороший разработчик = знания + опыт. Знания определить легко. Опыт — почти нереально.


см. выше. Я не разделяю знания от опыта.

G>>Что использовали?

G>Использовал XYZ (на деле ни одной строчки с XYZ не написал, просто оно было в проекте)

G>>Зачем?

G>Начальство сказало надо — не мое решение

G>>Какие сложности были?

G>(Тут рассказывается душещипательная история про баг с утечкой, дедлоком или race condition, который бороли долго, я но к нему никакого отношения не имел, просто со стороны видел)

G>И это еще хорошо если так расскажут, а ведь большинство программистов и два слова не может в таком разговоре склеить.


Сеньер со стажем, который не может и двух слов связать, тут в Австралии будет иметь проблемы с трудоустройством. Везде требуется комуникейшн скиллз. И его и проверяют. Это, возможно, российская специфика.

G>>По ответам, взляду, тону голоса, мудрый успешный руководитель с софт скиллами сможет определить врет или нет.

G>А чего тут врать? Достаточно не уточнять детали. Вроде как неправду не сказал, а сразу "опыта" у тебя стало в разы больше.

Если один не будет уточнять, возьмут другого. Опять же, здесь 80 кандидатов на объявление и их отфильтровывает агент по разговору и навыкам общения.

G>Да-да, апелляция к фильмам — отличный аргумент.


Хоть как-то оживить разговор. Не на суде же.

G>На деле такого "опытного" человека проще раскусить именно на знаниях. Был у меня пример — чувак позиционировал себя как супер-мега DBA и не представлял уровни изоляции, на этом и засыпался, а опыта у него было ого-го и рассказывал он неплохо.


Это то, что я описал выше. Корпорация, все хранимые процедуры уже написаны до него, он сидит поправляет where, добавляет поля. Для работы ему изоляция еще лет 5ть не понадобится. Опыт есть, а энтузиазма и знаний нет. Зато семья довольна. Тоже вариант. Я его понимаю.

G>Поэтому я всегда начинаю с вопросов на знания, чтобы определить общий уровень кандидата с какими задачами он может работать, а потом можно говорить про конкретные эпизоды из опыта. Иногда после первой части и нет смысла дальше общаться.


это тоже. см. выше.

G>Такое происходит очень часто. Берут стажера, они полгода смотрит чем занимаются люди и усиленно читает книжки. Сам код в продакшн не пишет, занимается каким-нить простым тулингом. Потом идет собеседоваться и рассказыват будто он сам делал все, что делали коллеги. А знания из книжек помогают отвечать на технические вопросы. И не понятно брать его в программисты или продавцы.


Если он прочитал книжки и знания закрепились в голове, значит он эти знания закреплял практикой. Может, свой проект лабал на работе, утилиту или попробовал повторить то, что эти программисты рядом делали. Я бы взял такого. Люди без энтузиазма книг не читают. Им хватает стек оверфлоу и гугл. Они даже меня убеждали, что книги уже не нужны, мол, в 21м веке.

Люди с хорошей памятью, исключение. Но даже им, зачем напрягаться. Ведь можно найти лазейку и хорошо устроиться и без этого.

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

It's magical. If a person wants to do something, I'm so much in favor of letting them, whatever other things they'd have to stop doing. I mean, there are things which nobody will ever do except the one person – or maybe one of two or three people – to whom it's important.

Or someone could do it, but not nearly as well. And not because he's "worse" – he may be "better" on all the common benchmarks (IQ, grades, reputation, whatever). He's not "worse" in any quantifiable way, but it just doesn't click – the project is not a good fit for him.

...

So actually I'm at the other extreme on this one, most likely – I don't think very much of "relevant experience", and I'll be the first to say that a person new to something will cope with it very well, don't worry. Everyone is replaceable, because everyone can deal with everything.

...

What do I mean by this "project/person fit" then?

What I mean is that there's still a 10x productivity difference between a person struggling with this important stuff that you dumped on them but they kinda don't understand or care about very much, and a person who wants the thing done.

Actually it's more than 10x – you can't quantify it, it's qualitatively different. A bird doesn't just move faster than a snail. You can't express the difference between crawling and flying in a single number, even if your HR policy mandates this sort of quantification.

People have their own priorities

A manager classifies things as important and unimportant, and he might be tempted to think that somebody gives a damn about his view of these matters.

But they don't give a damn. They classify things as "stuff the manager wants" and "stuff that they want". Stuff that's only important to them because you said so crawls. Stuff that they feel is important and interesting flies.

Managers might think that work gets done because they want it done. It's true – but the best work gets done because people who do it want it done.

And people are amazing in the diversity of their tastes. Taste depends on many things – personal talents and interests, personal history that makes some problems closer to your heart than others, and so on – but no matter what the reasons are, the result is that tastes are wildly different.


здесь
Re[20]: C# - from indians by indians
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.07.15 08:22
Оценка:
Здравствуйте, Sinix, Вы писали:
Кстати интересно проверить на новых типах Доступен новый JIT: теперь с поддержкой SIMD
https://code.msdn.microsoft.com/windowsdesktop/SIMD-Sample-f2c8c35a
http://blogs.msdn.com/b/dotnet/archive/2014/11/05/using-system-numerics-vector-for-graphics-programming.aspx
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.