Re[9]: Java vs C# vs C++
От: Evgeny.Panasyuk Россия  
Дата: 28.09.15 22:05
Оценка:
Здравствуйте, 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 — низкоуровневая возня, что ты успешно и продемонстрировал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.