Re[5]: C# generics: Тормоза. Что я не так делаю?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Мне охота посмотреть возможно ли на Шарпе эффективно писать generic код, работающий с value-типами, и если возможно, насколько легко это дается. Пока, кажется, что нелегко.


Я не сказал бы, что в этом вообще есть смысл. С точки зрения разных контейнеров — проблем особых нет. И эффективность высокая. С алгоритмами все сложенее. Абстракция в Шарпе вся динамическая и есть соттвествующие накладные расходы.

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

>> ты меряешь на грани разумного. Здесь любая мелочь может дать разницу в два-три раза.


ПК>Для C++ это не так: обычно abstraction penalty колеблется в пределах десятка процентов, если вообще присутствует.


Тут не причем С++. Ты погляди на код быстрой сортировки и прикинь, что чаще всего выполняется?... Правильно, сравнение! А так как это самая частая операция, то начинает серьезно играть роль банальная скорость вызова метода, инлайнинг, выравнивание кода и т.п. Может случиться так, что переставление переменных местами или добавление новой даст выигрыш в скорости.

Ну, и опять же. Что за зверь такой С++? Есть разные компиляторы. Один прекрасно справляется с устранением накладных расходов вызываемых абстракцией, а другой не очень. Разница тоже может составить разы.

Я еже кажется приводил пример с qsort и С. Так можно из-за того, что qsort оказывается не быстрой делать выводы о всем языке?

>> Это уже не архитектурная разница, а борьба команд оптимизаторов.


ПК>Для меня больше вопрос не в абсолютных цифрах C# vs. C++, а в относительных: насколько падает быстродействие C# для арифметики и около того при использовании мало-мальской абстракции над встроенными типами и попытках повторного использования кода. Пока результаты не радуют.


Опять та же песня. Да от оптимизатора это зависит. Ну, и опять же где ты видел подобную работу с вэйлью-типами?

ПК>Я выложил полные листинги всех файлов, которые использовал.


1. Нахрена мучиться с копированием отдельных фрагментов когда можно скачать проект в зипе?
2. Где код С++-ного проекта? Или нужно по бырому его переписать?

ПК>Для этих тестов мне вполне достаточно используемой точности.


И все же. Это намного удобнее и точнее.

ПК>Гм... В том же сообщении полный код на C++


Где?

ПК>С удовольствием, если руки дойдут.


Давай, двай. Народу интересно. Темболее, что тебе доступен больший список компиляторов.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: C# generics: Тормоза. Что я не так делаю?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Что значит "сложности"? Я хочу повторно использовать один раз написанные функции, а не плодить вместо них "ускорители" В голове в качестве "жизненного" примера я держу шаблоны классов, встречавшихся в реальных проектах: "маленькие" вектора:Vector2<T>, Vector3<T>, Vector4<T> (можно еще обобщить, сделав Vector<dimension,T>);


Пош, раскажи мне идиоту, чем List<T> тебя не устраивает? И чем он может быть медленнее чем какой-нибудь вектор?
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: C# generics: Тормоза. Что я не так делаю?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка: -2
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Пока планов писать что-нибудь кроме тестов на C# у меня нет (разве что, если в web какой-нить занесет). (По крайней мере пока) к C# у меня интерес исключительно академический. Интересно смотреть на все (новые) языки. Просто, наконец, получилось немного с C# generics поиграться, а не только в черновиках стандарта читать. Соответственно, и вопросы появились практического характера.


Забавно, что совсем необоснованых суждений стало мнеьше. Теперь ты уже в основном напираешь на скорость. То ли еще будет.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: C# generics: Тормоза. Что я не так делаю?
От: Павел Кузнецов  
Дата: 14.01.05 02:09
Оценка:
VladD2,

> ПК> В голове в качестве "жизненного" примера я держу шаблоны классов, встречавшихся в реальных проектах: "маленькие" вектора:Vector2<T>, Vector3<T>, Vector4<T> (можно еще обобщить, сделав Vector<dimension,T>);


> Пош, раскажи мне идиоту, чем List<T> тебя не устраивает? И чем он может быть медленнее чем какой-нибудь вектор?


Это векторы линейной алгебры. Vector2<T> — вектор двумерного пространства, Vector3<T> — трехмерного и т.п. Для этих классов определены соответствующие операции. Например, умножения на матрицу, афинные преобразования и т.п. List<T> сюда никаким боком.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: C# generics: Тормоза. Что я не так делаю?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.05 03:07
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это векторы линейной алгебры. Vector2<T> — вектор двумерного пространства, Vector3<T> — трехмерного и т.п. Для этих классов определены соответствующие операции. Например, умножения на матрицу, афинные преобразования и т.п. List<T> сюда никаким боком.


Понял. Просто смутило похожее на СТЛ-евский вектор название. Что-то по матрицам я в сети встречал. Но сейчас уже не припомню.

В общем, если что никогда не поздно подключить генератор кода. Не та это проблема.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: C# generics: Тормоза. Что я не так делаю?
От: Денис Федин Россия  
Дата: 14.01.05 15:42
Оценка: +1 -1
Добрый день!
Уважаемый Павел Кузнецов, я знаю что вы профессионал, но высказывание типа: "вот это тормозит в 2 раза" очень некорректно, и очень далеко от истины, чтобы языку присваивать клеймо — "в 2 раза медленней!".
(Особенно было смешно про видео-плейер.)

Наберите в C# код:


for(int i = 0; i < 10000000; i++)
{
    string s = "123456789012345678901234567890";
    s += "1";
}


и наберите в C++ тот же самый код с использованием любого класса типа string.
Вы скорее всего предпочтете std::string.


for(int i = 0; i < 100000000; i++)
{
    std::string s = "123456789012345678901234567890";
    s += "1";        
}



Теперь скомпилируйте в release и сравните.

Я использовал:
MS VS C++ 7.0 и MS VS C#.

На моей машине Cel2500 такие показатели:
C++ — 46 сек.
C# — 18 сек.

Тогда я могу сделать однозначный вывод по поводу производительности?
Конечно, нет. Где-то быстрее, а где-то медленнее. Линейной и тем-более константной зависимости тут нет, и быть не может, Вы как профессионал должны это понимать.
Ясно одно, что в достаточно крупных приложениях очень часто используется дин. память, поэтому в словах Влада истина в том, что зачастую при миграции более менее крупного проекта с C++ на C# заметно повышение производительности на глаз.
Вообще суть то не в самом C#, а в dotNET, т.к. сборщик мусора включает в себя "грамотный" диспетчер дин. памяти, а отсюда и выигрыш в конечной производительности.
Страуструп очень умный человек и позволил переопределять оператор "new" как на локальном так и на глобальном уровне, что позволяет писать при надобности свои менеджеры дин. памяти, а не использовать встроенные в систему.
Но вопрос в том кто это делает?
Re[5]: C# generics: Тормоза. Что я не так делаю?
От: Павел Кузнецов  
Дата: 14.01.05 18:44
Оценка:
Денис,

> высказывание типа: "вот это тормозит в 2 раза" очень некорректно, и очень далеко от истины, чтобы языку присваивать клеймо — "в 2 раза медленней!".


Я нигде не говорил, что язык в 2 раза медленней (такое высказывание с моей точки зрения вообще не имеет смысла). Я измерял конкретные test cases, которые, да, примерно в 2 раза медленнее.

> (Особенно было смешно про видео-плейер.)


Это была иллюстрация того, что может означать замедление в 2 раза в ответ на совершенно конкретный вопрос Тимофея: "Два раза это так плохо?". Это не означает, что использование C# вообще или generics в частности означает обязательное замедление в 2 раза.

> На моей машине Cel2500 такие показатели:

> C++ — 46 сек.
> C# — 18 сек.
> Тогда я могу сделать однозначный вывод по поводу производительности?

Да, конечно, можно сделать однозначный вывод о том, что данный фрагмент кода на VC++ выполняется в два с половиной раза медленнее, чем на C#. Более того, можно даже объяснить, почему это происходит, и что по этому поводу можно сделать. На мой взгляд, любые шаги на пути к пониманию подобных моментов полезны.

> Линейной и тем-более константной зависимости тут нет, и быть не может


Речь идет о зависимости падения производительности от повышения уровня абстракции, т.е. в данном случае количества "слоев" использования generics и разнообразных оберток вокруг простых типов. Эта зависимость вполне может быть как константной, так и линейной, равно как и фактически любой другой. Правда, подозреваю, что дальше линейной на практике дело не пойдет.

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


Еще раз: я не делаю никаких общих выводов. Речь о стоимости использования конкретных техник. А именно, применения generic программирования к абстракциям уровня value-классов. Производительность подсистемы управления памятью меня в данных test cases вообще не интересует, т.к. код был специально написан таким образом, чтобы по возможности исключить выделение/освобождение памяти в замеряемых фрагментах.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.