Re[17]: Visual C# vs C++. Надо сравнить перспективы.
От: itslave СССР  
Дата: 09.01.17 12:51
Оценка:
Здравствуйте, lpd, Вы писали:
lpd>На мой взгляд — обычный C++ это баланс производительностью, удобством и простотой, с возможностью ручного ассемблера.
Рыдал. Не шути так больше.
Re[17]: Visual C# vs C++. Надо сравнить перспективы.
От: alex_public  
Дата: 09.01.17 13:01
Оценка:
Здравствуйте, lpd, Вы писали:

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


А что у тебя за механизм передачи данных между потоками? ) Есть конечно специфические варианты прокидывания данных через систему (типа использования PostMessage в винде или что-то подобное), которые позволяют передать указатель и не позволяют объект. Но это как бы далеко не лучший способ организации межпоточного взаимодействия. Если же у тебя всё организовано по нормальному, внутри приложения, то непонятно откуда возьмётся разница в передаче между указателем и самим объектом.

_>>Дело не в разыменования указателя, а в технике работы кэща процессора. В случае обхода одного непрерывного массива данных у тебя все запрашиваемые данные будут уже в кэше, что ускорит работу в разы. А в случае использования массива указателей они практически наверняка (ну если ты там не используешь именно для этих данных какой-нибудь специальный аллокатор на пуле) будут указывать на различные непоследовательные участки памяти...

lpd>Это при условии, что контейнер, все-таки вектор, да еще и обходится последовательно, что не столь типично.

Это как раз самый базовый сценарий. Обработка массива данных. И именно на нём максимально сильно дохнут всякие там Java/C# как раз из-за их врождённой дополнительной косвенности.

_>>Вот есть у тебя некое красивое, но не идеально оптимизированное C++ приложение (встречаются копирования объектов и т.п.). Ты добавил в него поддержку семантики перемещения и получил ускорение его работы на сколько то там процентов при сохранение внешнего вида кода. Это как считается, "нужна" или нет? )

lpd>Если нужно ускорение работы на несколько процентов, то я бы использовал ассемблер.

Но код тогда явно изменится и не в лучшую сторону.

_>>Или вот скажем у тебя есть хорошо оптимизированное приложение написанное на чистых указателях, где ты страдаешь с ручным отслеживанием всего этого дела. Ты переписал это всё на современном C++, сохранив старую производительность и при этом полностью забыл про все ужасы ручных указателей. Это считается "нужна" или нет? )

lpd>Ручные указатели ужасом мне не представляются, в отличие от всего свода правил по rvalue-ссылкам.

Ужас не в том смысле что сложные (тут как раз проблем нет), а в том что при их подобном использование программист берёт на себя кучу лишней работы, которую вполне по силам исполнять компилятору.

lpd>В принципе, если кто-то действительно может быстрый и понятный(хотя бы ему) код с move-семантикаой, то это само по себе не плохо. Кому-то вот, например нравится ассемблер, и он будет писать код, который ему нравится со вставками на ассемблере. Другой добавит туда perl6, который ему нравится.

lpd>Я к тому, что главное не использовать move-семантику только потому, что она в новом стандарте, а значит, типа, must-have.

Нуу естественно нет никаких обязательных правил, просто это одно из самых лучших нововведений, причём не имеющее аналогов больше нигде в мейнстриме. Ну и кстати говоря, тебе довольно трудно будет не использовать его: достаточно передать где-нибудь временный объект (или скажем вернуть его в return) из stl (а они там практически все умеют перемещаться) и автоматически получится использование. )))

lpd>Я еще редактировал предыдущий пост недавно, и добавлял:

lpd>На мой взгляд — обычный C++ это баланс производительностью, удобством и простотой, с возможностью ручного ассемблера. А с move-семантикой теряется простота. Кроме того, вот я когда то достаточно написал программ на ассемблере, и мне с моим опытом не очевидно, как move-семантика реализована. Компилятор резервирует место на стеке, выходит из функции, а когда стек возвращается к передвинутой локальной переменной, пропускает этот кусок памяти? или как?

Это ты сейчас описал что-то похожее на RVO. Единственный способ (без указателей) решать ту проблему с return до C++11. Но есть принципиальная разница. Во-первых в отличие от семантики перемещения это просто оптимизация, так что оно не всегда работает (зависит от компиляторов, может отключаться опциями оптимизации и т.п.). Во-вторых оно подходит только для узкой категории случаев (например в моём первом примере RVO не сработает из-за первого if'a), в то время как семантика перемещения гораздо универсальнее.

Что касается работы семантики перемещения, то она тривиальная по своим принципам. И в тоже время может быть сколько угодно сложной, т.к. полностью определяется программистом в том самом конструкторе перемещения. В самом банальном случае это может выглядеть так:
struct A{
    int8_t* data;
    A(int size): data(new int8_t[size]) {}
    A(A&& a) {data=a.data; a.data=nullptr;} //вот тут вся наша "магия"
    ~A() {delete data;}
};


Специально написал этот пример с явным указателем, для простоты понимания. Естественно в нормальном случае стоило бы использовать вместо него unique_ptr<int8_t> — тогда можно было бы не выписать руками деструктор. Да, кстати, а unique_ptr тоже сам по себе работает через семантику перемещения. )))
Re[18]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 13:14
Оценка:
Здравствуйте, alex_public, Вы писали:

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


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


_>А что у тебя за механизм передачи данных между потоками? ) Есть конечно специфические варианты прокидывания данных через систему (типа использования PostMessage в винде или что-то подобное), которые позволяют передать указатель и не позволяют объект. Но это как бы далеко не лучший способ организации межпоточного взаимодействия. Если же у тебя всё организовано по нормальному, внутри приложения, то непонятно откуда возьмётся разница в передаче между указателем и самим объектом.


PostMessage он не только в винде — это распространенный механизм, и очень полезный, т.к. упрощает синхронизацию и исключает большинство deadlockов при обмене данными между потоками. Но в данном случае достаточно просто передать в конструктор std::thread указатель, и после этого поиспользовать и затем забыть про него в основном потоке, как-то синхронизируясь, а с локальными объектами этого сделать нельзя.

Вообщем, можно спорить относительно полезности семантики. Очевидно, что это большое нововведение, меняющее язык, и я уже встречал вакансии где менеджеры(или тех лиды) пишут требованием C++14. На мой взгляд, это все равно что требовать от C++ программиста знания perl, lisp, erlang, rust или еще какого-то редкого языка, который, без сомнения, может чем-то улучшить программу. И это делается массово. Я, например, не увлекаюсь языками программирования — C++ это для меня только инструмент, а специализации у меня другие. И _необходимости_ использовать C++11-14 в программе нет. Это всего лишь дополнение к языку, к которому у разных людей разное отношение.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 09.01.2017 13:15 lpd . Предыдущая версия . Еще …
Отредактировано 09.01.2017 13:14 lpd . Предыдущая версия .
Re[19]: Visual C# vs C++. Надо сравнить перспективы.
От: itslave СССР  
Дата: 09.01.17 13:16
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>и я уже встречал вакансии где менеджеры(или тех лиды) пишут требованием C++14.

Жжош напалмом
Re[20]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 13:37
Оценка:
Здравствуйте, itslave, Вы писали:

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


lpd>>и я уже встречал вакансии где менеджеры(или тех лиды) пишут требованием C++14.

I>Жжош напалмом

Не понял, что тебя удивляет. Как раз менеджеру или HR в первую очередь и представляется критическим преимуществом знание технологии именно последней версии, при этом он понятия не имеет что это и насколько реально необходимо в проекте. "Но это же СТАНДАРТ"
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 09.01.2017 13:38 lpd . Предыдущая версия .
Re[14]: VS Code
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 13:42
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Соответственно, и ответа на то, чего не хватает интеграции C# в плане фич не будет. Для справки — поддержка C# устанавливается "целым пакетом" — OmniSharp for VSCode — и все работает.


Я например уже несколько раз говорил про создание проекта. Установили VS Code, установили расширение на базе OmniSharp "ивсеработает" — как C# проект создать?
Re[21]: Visual C# vs C++. Надо сравнить перспективы.
От: itslave СССР  
Дата: 09.01.17 13:43
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>Не понял, что тебя удивляет. Как раз менеджеру или HR в первую очередь и представляется критическим преимуществом знание технологии именно последней версии, при этом он понятия не имеет что это и насколько реально необходимо в проекте. "Но это же СТАНДАРТ"


Я прочитал как "манагеры пишут на С++14". Был неправ, недочитал.
Re[15]: Visual C# vs C++. Надо сравнить перспективы.
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 13:55
Оценка: +1 -1
Здравствуйте, lpd, Вы писали:

_>>И именно такой подход существенно убивает производительность, т.к. добавляет лишний уровень косвенности.

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

Вообще-то лишние косвенности по памяти это один из главных источников тормозов в управляемых языках. Если в C++ ты будешь использовать аналогичные структуры данных с кучей индерекций, то и получаешь скорость намного более близкую к управляемым тормозам
Re[16]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 13:57
Оценка: -1 :))) :)))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


_>>>И именно такой подход существенно убивает производительность, т.к. добавляет лишний уровень косвенности.

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

EP>Вообще-то лишние косвенности по памяти это один из главных источников тормозов в управляемых языках. Если в C++ ты будешь использовать аналогичные структуры данных с кучей индерекций, то и получаешь скорость намного более близкую к управляемым тормозам


Основной источник тормозов — это байткод. Разыменование указателя это одна процессорная инструкция, т.е. несколько тактов процессора.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[17]: Visual C# vs C++. Надо сравнить перспективы.
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 14:09
Оценка:
Здравствуйте, lpd, Вы писали:

EP>>Вообще-то лишние косвенности по памяти это один из главных источников тормозов в управляемых языках. Если в C++ ты будешь использовать аналогичные структуры данных с кучей индерекций, то и получаешь скорость намного более близкую к управляемым тормозам

lpd>Основной источник тормозов — это байткод.

Он по-твоему интерпретируется что ли?

lpd>Разыменование указателя это одна процессорная инструкция, т.е. несколько тактов процессора.


Ты думаешь раз одна процессорная инструкция, то должна выполнятся быстро? Даже если данные приедут например из файла подкачки?
Re[18]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 14:14
Оценка: :))
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


EP>>>Вообще-то лишние косвенности по памяти это один из главных источников тормозов в управляемых языках. Если в C++ ты будешь использовать аналогичные структуры данных с кучей индерекций, то и получаешь скорость намного более близкую к управляемым тормозам

lpd>>Основной источник тормозов — это байткод.

EP>Он по-твоему интерпретируется что ли?


Незнаком с деталями последних раработок Java и C#, однако все еще он исполняется в 2-4 раза медленне, чем процессорные коды.

lpd>>Разыменование указателя это одна процессорная инструкция, т.е. несколько тактов процессора.


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


Если система начнет свопиться, в подкачке данные окажутся, где бы они не находились. Оптимизация уровня экономии на разыменовании указателя может встречаться только в обработчиках срочных прерываний real-time embedded систем, и то очень редко. Если ты о кэше, то он сам далеко не даст той раницы в скорости, которая есть между Java/C# и C++.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[19]: Visual C# vs C++. Надо сравнить перспективы.
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 14:25
Оценка: +1
Здравствуйте, lpd, Вы писали:

lpd>>>Основной источник тормозов — это байткод.

EP>>Он по-твоему интерпретируется что ли?
lpd>Незнаком с деталями последних раработок Java и C#, однако все еще он исполняется в 2-4 раза медленне, чем процессорные коды.

Гугли JIT — just-in-time compilation.

lpd>>>Разыменование указателя это одна процессорная инструкция, т.е. несколько тактов процессора.


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

lpd>Если система начнет свопиться, в подкачке данные окажутся, где бы они не находились.

Это я тебе показываю что твоя мера скорости количеством инструкций абсурдна, причём на много порядков.

lpd>Оптимизация уровня экономии на разыменовании указателя может встречаться только в обработчиках срочных прерываний real-time embedded систем


Сделай простой тест, заполни массив десятью миллионами случайных int'ов, отсортируй, и просуммируй, замерь время суммирования.
В одном случае возьми vector<int>, а в другом vector<int*>.
Re[20]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 14:30
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


lpd>>>>Основной источник тормозов — это байткод.

EP>>>Он по-твоему интерпретируется что ли?
lpd>>Незнаком с деталями последних раработок Java и C#, однако все еще он исполняется в 2-4 раза медленне, чем процессорные коды.

EP>Гугли JIT — just-in-time compilation.


Я знаю что такое JIT, однако она недостаточно оптимизирует код по понятным причинам.
lpd>>Оптимизация уровня экономии на разыменовании указателя может встречаться только в обработчиках срочных прерываний real-time embedded систем

EP>Сделай простой тест, заполни массив десятью миллионами случайных int'ов, отсортируй, и просуммируй, замерь время суммирования.

EP>В одном случае возьми vector<int>, а в другом vector<int*>.

Суммирование это одна инструкция. С загрузкой из памяти инструкций окажется две, что даст разницу. Однако, это синтетический тест, т.к. редко вся обработка заключается в прибавлении intа. В реальных программах исключение разменования указателя и даже кэш миссы дадут крохи производительности почти всегда. Там, где это даст разницу, оптимизируют обычно на ассемблере.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[21]: Visual C# vs C++. Надо сравнить перспективы.
От: Klikujiskaaan КНДР  
Дата: 09.01.17 14:34
Оценка:
Здравствуйте, lpd, Вы писали:

EP>>Гугли JIT — just-in-time compilation.


lpd>Я знаю что такое JIT, однако она недостаточно оптимизирует код по понятным причинам.


Как раз таки оптимизирует код оно прекрасно, но проблема не в этом, а в типичном вопросе на собеседовании: "В чем разница между кучей и стеком".
Re[28]: Неубогие IDE
От: alex_public  
Дата: 09.01.17 14:55
Оценка: +1
Здравствуйте, itslave, Вы писали:

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

I>Если взять https://www.devexpress.com/products/net/controls/winforms/grid/ и сравнить со стандартным qt гридом, то сколько % фичеров покроет грид qt из коробки? А предлагает ли https://inqlude.org/index.html что нить сравнимое?

Если честно, то все эти продвинутые гриды и т.п. — это совсем не моя область компетенции. Но попробую ответить в рамках того, что знаю.

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

Что касается сторонних решений, то я сделал поиск по странице inqlude на "grid" и "table" и ничего не нашёл. Собственно больше я тут ничего сказать не могу. Может нет таких готовых решений, а может и есть, но я про них ничего не знаю — мне никогда не требовались такие контролы.
Re[27]: Компилятор
От: Qbit86 Кипр
Дата: 09.01.17 15:08
Оценка:
_>Но ты вместо этого продолжаешь оправдываться, да ещё и пытаешься какие-то переходы на личности делать...

Напомню, что вся ветка началась с твоего перехода на мою личность.

_>Раз так, то давай разберёмся окончательно с этим вопросом. И так вот твоя точная цитата


Прекрасно, с этого и надо было начать — с точной цитаты того, что ты не понял.

Q>«В C++ это не так: выбираешь ли ты «Go To Declaration Ctrl+F12», или «Go To Definition F12» — он может выдать список.»


Здесь под «в C++» подразумевалось «в случае C++».

Q>«Потому что компилятор на «этапе чтения мной кода» (евпочя) не имеет достаточной информации»


_>Соответственно или ты тут нечаянно обозвал анализатор кода IDE компилятором


Да нет, вполне осознанно; не предвидя, конечно, что это у кого-то вызовет недоумение.

_>у тебя тут наблюдается банальное незнание самых базовых вещей (что компилятор C++ не имеет никакого отношения к навигации по коду в VS).


Боюсь, незнание базовых вещей набюлдается у тебя. Точнее, просто отстутсвие определённого бэкграунда в разработке компиляторов не позволяет тебе понимать неформальный жаргон. Твоё понимание ограничивается представлением, что компилятор — это такой исполняемый файл по типу `cl.exe` или `g++.exe` (это не компиляторы, скажешь ты, а консольные интерфейсы к компилятору и компоновщику). Я же трактую понятие несколько шире.

_>Каких-либо ещё вариантов интерпретации этой твоей цитаты быть не может.


Объясняю, как работает компиляция. Исходный код подвергается лексическому и синтаксическому анализу, строится некая его модель, даже несколько по желанию, например: AST, конкретное синтаксическое дерево, семантическое дерево, таблица символов, etc. Это условный фронт-энд. Дальше модель подвергается всяким преобразованиям, меняет ряд представлений, проходит через какие-то оптимизации, SSA-формы и тому подобное; например, втискивается в модель LLVM, etc.

Так вот, для полноценного анализа кода нужно фактически пропустить исходник через фронт-энд. Это не обязательно тот же фронт-энд, что в фактическом «компиляторе». Но его создание — описание грамматики (подмножества) языка, реализация парсинга в соответствии с этой грамматикой, организация символов, контекстно-зависимое разрешение еоднозначностей — это существенная часть компилятора. Люди, которые этим занимаются называют себя компиляторщиками — даже если они подсвечивают IDE, а не генерируют исполняемый код. Очевидно желание столь значительную часть переиспользовать, поэтму Майкрософт перешёл от C#-компилятора, написанного на C++, к компилятору, который использует общую платформу Roslyn, и шарит её с командой, разрабатывающей IDE. Чтоб не приходилось поддерживать ещё один параллельный независимый компилятор для целей IDE.

_>И оба данных варианта тебя совсем не красят.


Тебя не красит пустопорожнее до**ывание к формулировкам.

_>Вот сразу видно хорошо аргументированное утверждение.


Вместо тысячи слов — одна картинка э... из тысячи слов.


_>Вообще то я не советовал ему именно C++. Перечитай моё сообщение повнимательнее.


Ты так написал, что C++ чуть ли не вариант по-умолчанию, так как «универсальность». Вместо того, чтоб написать, что это last resort — если нет никакой возможности избежать, только тогда берите C++.

_>(всё же макросы заметно проще шаблонов). Навигация в таких случаях работает корректно в любом случае, т.к. она контекстная. Подсветка (неактивная ветка ifdef обычно подсвечивается серым фоном)


Откуда контексту взяться? Я читаю исходный файл библиотеки, внутри него перехожу к определению функции, навигация переводит меня в «не серую» ветку. Но в дальнейшем, когда я буду вызывать это в своём коде — кто знает, после каких дефайнов заинклудится мне файл библиотеки? Даже в разных единицах трансляции по разному может быть.
Глаза у меня добрые, но рубашка — смирительная!
Re[19]: Visual C# vs C++. Надо сравнить перспективы.
От: alex_public  
Дата: 09.01.17 15:13
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>PostMessage он не только в винде — это распространенный механизм, и очень полезный, т.к. упрощает синхронизацию и исключает большинство deadlockов при обмене данными между потоками.


Если ты подразумеваешь под PostMessage самую идею, а не реализацию, то это по сути и есть некая разновидность модели акторов. ))) А вот реализации могут быть очень разные. Можно попробовать использовать в этой роли системную очередь сообщений винды, но это далеко не самый стабильный и эффективный путь. А вот если взять что-то вроде такого http://actor-framework.org решение, то всё будет гораздо веселее. )

lpd>Но в данном случае достаточно просто передать в конструктор std::thread указатель, и после этого поиспользовать и затем забыть про него в основном потоке, как-то синхронизируясь, а с локальными объектами этого сделать нельзя.


Эээ что? ) Вот такой простейший пример кода:
struct Test{
    string data;
    Test(const string& s): data(s) {cout<<this_thread::get_id()<<" constructor: "<<data<<endl;}
    Test(const Test& t) {data=t.data; cout<<this_thread::get_id()<<" copy constructor: "<<data<<endl;}
    Test(Test&& t) {data=move(t.data); cout<<this_thread::get_id()<<" move constructor: "<<data<<endl;}
    ~Test() {cout<<this_thread::get_id()<<" destructor: "<<data<<endl;}
    void print() {cout<<this_thread::get_id()<<" print: "<<data<<endl;}
};
int main()
{
    thread second, third;
    second=thread([&]{
        Test test("hello world");
        test.print();
        third=thread([&](Test&& t){
            second.join();//ждём завершения родительского потока, чтобы всё было по честному (было ясно, что данные берутся не из его стека)
            t.print();
        }, move(test));
    });
    second.join();
    third.join();
}

Выдаёт такой результат:
2 constructor: hello world
2 print: hello world
2 move constructor: hello world
2 move constructor: hello world
2 destructor:
2 destructor:
3 print: hello world
3 destructor: hello world


lpd>Вообщем, можно спорить относительно полезности семантики. Очевидно, что это большое нововведение, меняющее язык, и я уже встречал вакансии где менеджеры(или тех лиды) пишут требованием C++14. На мой взгляд, это все равно что требовать от C++ программиста знания perl, lisp, erlang, rust или еще какого-то редкого языка, который, без сомнения, может чем-то улучшить программу. И это делается массово. Я, например, не увлекаюсь языками программирования — C++ это для меня только инструмент, а специализации у меня другие. И _необходимости_ использовать C++11-14 в программе нет. Это всего лишь дополнение к языку, к которому у разных людей разное отношение.


Конечно. C++ в общем то тем и хорош, что позволяет работать в любом стиле. Хоть в стиле чистого древнего C пиши и всё будет отлично работать. Но я бы всё же посоветовал изучить и применять современный C++, потому как он позволяет переложить значительную часть работы на плечи компилятора.
Re[21]: Visual C# vs C++. Надо сравнить перспективы.
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 15:16
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>>>>>Основной источник тормозов — это байткод.

EP>>>>Он по-твоему интерпретируется что ли?
lpd>>>Незнаком с деталями последних раработок Java и C#, однако все еще он исполняется в 2-4 раза медленне, чем процессорные коды.
EP>>Гугли JIT — just-in-time compilation.
lpd>Я знаю что такое JIT, однако она недостаточно оптимизирует код по понятным причинам.

Он плохо оптимизирует в том числе потому что управляемый код труднее оптимизировать. Например замыкания на C++ порождают обычные вызовы, а на C# косвенные.
Собственно C++ код быстрее
Автор: Evgeny.Panasyuk
Дата: 07.06.15
даже после JIT'а (в веб-браузере, Карл!).

lpd>>>Оптимизация уровня экономии на разыменовании указателя может встречаться только в обработчиках срочных прерываний real-time embedded систем


EP>>Сделай простой тест, заполни массив десятью миллионами случайных int'ов, отсортируй, и просуммируй, замерь время суммирования.

EP>>В одном случае возьми vector<int>, а в другом vector<int*>.
lpd>Суммирование это одна инструкция. С загрузкой из памяти инструкций окажется две, что даст разницу.

Ты опять меряешь количество инструкций я могу в вариант vector<int> добавить хоть десять xor eax,eax — и он всё равно окажется быстрее.

lpd>С загрузкой из памяти инструкций окажется две, что даст разницу.


Разница (причём на порядок) будет из-за дополнительной загрузки из памяти по случайному адресу, что портит prefetcher, cache-hit и КПД использования bandwidth.

lpd>В реальных программах исключение разменования указателя и даже кэш миссы дадут крохи производительности почти всегда.


А в реальных управляемых программах будет не одна индерекция, а целое дерево

lpd>Там, где это даст разницу, оптимизируют обычно на ассемблере.


Ты понятия не имеешь о чём говоришь.
Re[22]: Visual C# vs C++. Надо сравнить перспективы.
От: Evgeny.Panasyuk Россия  
Дата: 09.01.17 15:23
Оценка: +1
Здравствуйте, Klikujiskaaan, Вы писали:

lpd>>Я знаю что такое JIT, однако она недостаточно оптимизирует код по понятным причинам.

K>Как раз таки оптимизирует код оно прекрасно, но проблема не в этом,

Проблема в том числе и в этом. У JIT'а нет столько времени на оптимизацию, плюс сам управляемый код труднее оптимизировать.

K>а в типичном вопросе на собеседовании: "В чем разница между кучей и стеком".


В приведённом примере vector<int> vs vector<int*> — и то и другое находится в куче.
Re[22]: Visual C# vs C++. Надо сравнить перспективы.
От: lpd Черногория  
Дата: 09.01.17 15:25
Оценка: -2 :))) :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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



EP>Разница (причём на порядок) будет из-за дополнительной загрузки из памяти по случайному адресу, что портит prefetcher, cache-hit и КПД использования bandwidth.

Если мы говорим о хранении больших объектов в векторе, то возникает проблема переаллокации и фрагментации.
А в listе никакой локальности данных не будет.

lpd>>В реальных программах исключение разменования указателя и даже кэш миссы дадут крохи производительности почти всегда.


EP>А в реальных управляемых программах будет не одна индерекция, а целое дерево


lpd>>Там, где это даст разницу, оптимизируют обычно на ассемблере.


EP>Ты понятия не имеешь о чём говоришь.

Я тебе поясню, если ты начитался статей про оптимизацию JIT-компиляции:
Оптимизировать попадания в кэш и индирекцию нужно при проектировании в самую последнюю очередь, и только в редких случаях. А если необходима максимальная производительность, то архитектура, move-семантика и простота кода все вместе уходят на второй план. В общем случае о локальности данных имеет смысл заботится только разработчикам процессоров и компиляторов, которые выжимают каждый процент и которым необходимо сразу учесть все варианты использования.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.