Здравствуйте, alexzz, Вы писали:
EP>>1. Возьми тест из обсуждаемой статьи и сделай нормальный интерфейс для сортировки (например как у std::sort) — позволяющий сортировать последовательности из разных типов контейнеров, с разными типами элементов, и с разными предикатами сравнения, задаваемыми например замыканиями. Для пущей уверенности выключи любую автовекторизацию при замерах.
A>Моё большое имхо: код, который оперирует разными универсальными обобщёнными абстракциями, ― это те 90%, от которых не требуется скорости. Он пишется так, чтобы было легко писать, читать и поддерживать, без оглядки на производительность. Если явно не тормозит, то и замечательно. По крайней мере, у меня дела обычно обстоят именно так.
А у меня тот код который быстрый обычно оперирует обобщёнными абстракциями — это более высокий уровень — because I can. И в таком коде я спокойно могу использовать например ФВП и замыкания, а не расписывать вручную каждую комбинацию алгоритма, контейнера и предиката — because I can.
A>Сравнивать скорость имеет смысл у того кода, который в самом деле её требует и который пишется с оглядкой на скорость, а не на удобство, и использует все доступные в языке средства оптимизации.
Это же одна из главных фишек 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
Вообще, это распространённое заблуждение что быстрый код синоним низкоуровневого.
EP>>3. Ещё такой примерАвтор: Evgeny.Panasyuk
Дата: 20.06.15
: высокоуровневый код C++ скомпилированный в JavaScript почти в два раза быстрее аналога на C# в своей родной среде.
EP>>JavaScript, в веб-браузере, Карл!
A>Вот в этом постеАвтор: greenpci
Дата: 05.06.15
я нашёл рядом два исходника на C++ и C#. У варианта С++ в настройках Optimization включил всё, что было на максимум. У варианта на C# сделал очевидную оптимизацию в коде (ценой в несколько миллисекунд), поменял
A>for (int i = 0; i < n; i++)
A> v[i] = v[i] * u[i];
A>на
A>for (int i = 0; i < v.Length; i++)
A> v[i] *= u[i];
A>Запустил оба варианта раз по десять, лучшие результаты такие:
A>C#
A>.NET Elapsed: 52,0000 ms
A>C++
A>Elapsed = 51.3899 ms
A>С++ победил!
C++ с ФВП и лямбдой дал результат сравнимый с рукопашным низкоуровневым циклом C#

А теперь попробуй сравни аналогичный код на C# с ФВП и лямбдой.
Вообще, я в и той теме говорил, да уже и в этой сказал: и на C# и на Java можно писать быстрый код, который будет отставать от C++ буквально на десятки процентов (не считая удары ниже пояса типа автовекторизации/автопареллизации). Но при этом на C++ будет высокоуровневый код, а на C#, и тем более на Java — низкоуровневая возня, что ты успешно и продемонстрировал.