OberonCore
https://forum.oberoncore.ru/

Standard Container Library
https://forum.oberoncore.ru/viewtopic.php?f=47&t=6234
Страница 4 из 6

Автор:  Trurl [ Суббота, 17 Март, 2018 21:17 ]
Заголовок сообщения:  Re: Standard Container Library

Владимир Ситников писал(а):
Вы, вроде, понимаете ("Если у нас есть 10 секунд, то нормально"), но почему-то пишете вопросами.

Потому, что цели ваши туманны, а мысли неясны.

Автор:  Сергей Оборотов [ Суббота, 17 Март, 2018 22:43 ]
Заголовок сообщения:  Re: Standard Container Library

Интересно само по себе.

Автор:  Владимир Ситников [ Вторник, 20 Март, 2018 19:51 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
Точно. Документ я обновлю с оказией.
Посмотрим что будет в новой версии документа.

Как я доказал, сейчас в разделе Scl benchmarks приводятся ложные утверждения, что Scl, якобы, быстрее C++ STL:
Цитата:
SclVectors demonstrate 40% better results against 'std::vector without iterators', especially with array bounds check as a bonus.
...
SclLists demonstrate 26% better results for 8bit and 3% better for 16 bit.
...
SclMaps demonstrate 41% better results for 8bit and 55% better for 16 bit.


Конечно, Scl приводится на правах public domain, т.е. может оказаться, что новой версии документа вообще не возникнет. Нельзя исключать и того, что кто-то в новой версии вообще удалит раздел "Scl benchmarks".
Поэтому читателям стоит трезво оценивать скорость работы Scl (и/или делать свои замеры), и нужно с большой долей скепсиса относиться к тому, что пишет Дмитрий Дагаев по вопросам производительности. По факту, Дмитрий много раз написал, что ББ код быстрее C++ кода, и рука у него не дрогнула.

На всякий случай: указание того, что "результаты C++ получены в debug режиме" не спасут раздел "Scl benchmarks". Отладочный режим C++ нужен для отладки, а не для конечной эксплуатации, и всевозможные фразы типа
Дмитрий Дагаев писал(а):
более простые решения более эффективны в плане быстродействия, чем переопределяющие операции решения типа reference operator[]( size_type pos ), используемые в c++ stl.
разбиваются в дребезги самым обычным оптимизирующим C++ компилятором. Попросту говоря, С++ позволяет получить одновременно и удобство разработки и высокую скорость работы результирующего кода.

Обновление: как я и предполагал, в очередном обновлении Scl добавился фрагмент
Цитата:
Mingw32 compiler for windows was used with -std=c++11 options, no optimization...
2. Scl against C++ stl results can be really compared when we get highly optimized BlackBox compiler

Т.е. автор продолжает водить читателей по ложному следу и утверждать, что Scl работает на 6-19-40% быстрее.

Автор:  Info21 [ Вторник, 20 Март, 2018 22:11 ]
Заголовок сообщения:  Re: Standard Container Library

Владимир Ситников писал(а):
С++ позволяет получить одновременно и удобство разработки и высокую скорость работы результирующего кода.
Как, однако, надоела эта лабуда.

Автор:  Пётр Кушнир [ Вторник, 20 Март, 2018 22:35 ]
Заголовок сообщения:  Re: Standard Container Library

Владимир Ситников писал(а):
Попросту говоря, С++ позволяет получить одновременно и удобство разработки и высокую скорость работы результирующего кода.
Чем и в ч0м измеряется удобство?
Владимир Ситников писал(а):
разбиваются в дребезги самым обычным оптимизирующим C++ компилятором
Попросту говоря - в деньги.

Автор:  Rifat [ Среда, 21 Март, 2018 08:49 ]
Заголовок сообщения:  Re: Standard Container Library

Владимир Ситников писал(а):
Отладочный режим C++ нужен для отладки, а не для конечной эксплуатации...

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

Автор:  Дмитрий Дагаев [ Среда, 21 Март, 2018 11:59 ]
Заголовок сообщения:  Re: Standard Container Library

Цитата:
Ну, какой смысл сравниваться с "отладочным режимом работы C++"? Как раз нужно взять нормальный режим (например, -O3)

Тем, кто считает, что режим с оптимизациями является ненормальным, предлагаю ознакомиться с The Pitfalls of Benchmarking with Applications.
Цитирую по тексту
Цитата:
Our absolute reference is a run on the x86 32-bit Linux
target compiled with GCC at -O0 optimization level. This
is by no means a value judgment. One configuration has to
be chosen for comparison purposes. The lowest optimization
level decreases the likelihood of compiler-introduced errors.

И далее результаты сравнения с Windows 7 (как у меня)
Вложение:
Optimization.png
Optimization.png [ 26.95 КБ | Просмотров: 7030 ]

Ну и выводы по анализу корректности
Цитата:
1) qsort: All configurations have positive runs, except the
Windows 7 platform which shows 100% negative.

По остальным тестам корректности есть и 40%, и 100% негативных прогонов.

Автор:  Сергей Оборотов [ Среда, 21 Март, 2018 12:46 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
... предлагаю ознакомиться с The Pitfalls of Benchmarking with Applications.
Вот что от вас хотят, Владимир.

Автор:  Владимир Ситников [ Среда, 21 Март, 2018 15:25 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
Тем, кто считает, что режим с оптимизациями является ненормальным

Вот вы это кому только что сказали?
Я как раз всегда говорил, что режим с оптимизациями является основным, и сравнивать нужно "с оптимизациями".

Дмитрий Дагаев писал(а):
1) qsort: All configurations have positive runs, except the
Windows 7 platform which shows 100% negative.


Читайте, пожалуйста, полностью. Или вы ссылаетесь на статью только ради того, чтобы сослаться?
Цитата:
Windows 7 platform which shows 100% negative. This is due
to the text output format and different end-of-line characters:
Windows uses CR+LF, while Linux uses only LF. When
using diff -b or diff --strip-trailing-cr 3
, or
dos2unix on output files, they show no difference with the
absolute reference. They should be considered false negatives
since the benchmark runs correctly, only the testing procedure
is inappropriate. A better testing framework should either use
different files for different platforms, or specify what utility is
to be used for comparison, with the appropriate set of flags.

Перевожу на русский: отрицательный результат для qsort теста оказалось лишь проблемой запускатора тестов. Сам код отработал верно. Проблема в том, что проверяющая система не ожидала, что в Windows строки будут разделяться символами CR+LF.

Иными словами, они прямо пишут, что проблемы вообще нет. Отсортировалось правильно во всех случаях.
И эта проблема "с форматом перевода строк" отмечена во многих Windows тестах. Наверняка, авторы исходного кода вообще никогда на Windows не запускались. Какое это отношение имеет к замерам? Да никакого. Какое это отношение имеет к оптимизациям? Тоже никакого.

Дмитрий Дагаев писал(а):
По остальным тестам корректности есть и 40%, и 100% негативных прогонов.

По факту, в предложенной вами работе сплошная вода.
Ну какой толк от того, что "из-за перевода строк бенчмарк показывает негативные результаты на Windows"?
Если бы они поправили очевидные огрехи в самом коде, тогда ещё можно было обсуждать.

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

Есть ровно 2 случая, когда от изменения -O "изменился" результат.
Это susan_c и rsynth.
Про susan_c сказано, что результат другой из-за "ошибок округления" (т.е. по-другому округлилось значение).
По rsynth снова разница в плавающей точке.

Какой вывод можно сделать?
Статья НЕ подтверждает того, что от -O1/O2/O3/Os что-то портится.
В статье авторы что-то там измерили, и таким образом установили, что:
1) На Windows перевод строки CR+LF, а на Linux это просто LF
2) Операции с плавающей точкой могут выдавать тот или иной ответ в зависимости от того какие команды процессора используются.
3) Использование неинициализированных переменных это плохо

Для кого-то эти пункты стали откровением?
Кто-то не знал, что нужно инициализировать переменные перед обращением?
Кто-то не знал, что вычисления с плавающей точкой не всегда гарантируют побитовый результат?

Автор:  Иван Денисов [ Четверг, 22 Март, 2018 07:51 ]
Заголовок сообщения:  Re: Standard Container Library

Владимир, статья и правда не идеальная, но там этот вопрос хотя бы рассмотрен. Может какую-то более подходящую найдете? А то всё равно кроме споров друг с другом было бы хорошо иметь представление о современном состоянии проблемы в мире. Но я не понимаю предмета, чего вы в целом нападаете? Для референса нормально использовать любой режим, если надо просто от чего отталкиваться. Я уверен, что Дмитрий Викторович не собирался как-то принижать С++, или как-то задеть людей, кто им пользуется. Для референса возможно выбрать и такой режим и другой. Главное указать, какой выбрал.

Ваши аргументы верные, но вот я специально заглянул в документацию Scl. Никто там не скрывает, что в С++ оптимизации были выключены. Это ведь для референса нужно, а не чтобы доказать кому-то. Для Вас это какой-то болезненный вопрос? Я совершенно согласен с выводами Дмитрия Викторовича, которые он сделал по результатам проверки. Реализация приемлемая, а правильное сравнение сейчас невозможно. Что-то вам еще хочется? Я не понимаю.

Автор:  Wlad [ Четверг, 22 Март, 2018 09:02 ]
Заголовок сообщения:  Re: Standard Container Library

Я правильно понимаю, что пользователь библиотеки обязан знать про тип Elem и Iterator при работе со списками? и - наследовать свои классы от Elem, в предположении, что они будут храниться в списках?

Автор:  Дмитрий Дагаев [ Четверг, 22 Март, 2018 10:33 ]
Заголовок сообщения:  Re: Standard Container Library

Wlad писал(а):
Я правильно понимаю, что пользователь библиотеки обязан знать про тип Elem и Iterator при работе со списками? и - наследовать свои классы от Elem, в предположении, что они будут храниться в списках?

Да, именно так

Автор:  Владимир Ситников [ Четверг, 22 Март, 2018 17:18 ]
Заголовок сообщения:  Re: Standard Container Library

Иван Денисов писал(а):
Владимир, статья и правда не идеальная, но там этот вопрос хотя бы рассмотрен. Может какую-то более подходящую найдете? А то всё равно кроме споров друг с другом было бы хорошо иметь представление о современном состоянии проблемы в мире.

В статьях я не знаток.
Вот пример годного материала на тему: https://www.youtube.com/watch?v=8pMfUopQ9Es ( слайды: http://2014.jokerconf.com/presentations ... arking.pdf )

Если лень смотреть весь доклад, вот фрагмент, точно описывающий то, что проделал Дмитрий: https://www.youtube.com/watch?v=8pMfUop ... .be&t=2727 (ну и минута-полторы)

Иван Денисов писал(а):
Для референса нормально использовать любой режим, если надо просто от чего отталкиваться. Я уверен, что Дмитрий Викторович не собирался как-то принижать С++, или как-то задеть людей, кто им пользуется. Для референса возможно выбрать и такой режим и другой. Главное указать, какой выбрал.

А чего мелочиться? Давайте уж C++ запускать под valgrind'ом? "главное указать, какой выбрал" Шутка. Но она объясняет то, почему выбирать -O0 неграмотно.

Я вот тут всё детально разбирал уже: viewtopic.php?f=47&t=6234&start=40#p104028
Вопрос вовсе не в том, чтобы определить во сколько раз C++ быстрее.

Иван Денисов писал(а):
, а правильное сравнение сейчас невозможно

Правильное сравнение возможно.
Берём ББ код, измеряем.
Берём C++ код, измеряем (разумеется, -O2 или -O3).

Дальше анализируем результаты: ББ код работает в 15 раз медленнее, т.к. в ББ нет такой-то и такой-то оптимизации.

Как вариант, можно для C++ взять несколько режимов (O0 и O3). Но это делать сложнее, т.к. больше времени уйдёт на замеры, их анализ и т.п.
Поэтому, если делать только 1 вид C++, то остановиться стоит на -O3 (обоснование по ссылке выше)

Автор:  Иван Денисов [ Четверг, 22 Март, 2018 19:41 ]
Заголовок сообщения:  Re: Standard Container Library

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

Я вот как-то уже обжегся на этих сравнениях, когда нерепрезентативный тест подсунул компилятору ifort и получил ускорение в 50 раз. Реальные цифры, если ускорение в 2-3 раза. В 50 раз бывает на очень и очень редких задачах.

Сейчас экспериментирую с компилятором icc, транслирую Компонентный Паскаль в Си с помощью CPfront и подсовываю интеловскому компилятору. Но об этом потом отчет напишу.

Автор:  Владимир Ситников [ Четверг, 22 Март, 2018 21:29 ]
Заголовок сообщения:  Re: Standard Container Library

Иван Денисов писал(а):
-O3 использовать возможно, однако помимо подстановок такой режим использует другие оптимизирующие алгоритмы, которые на ряде тестовых задач могут показать аномальное ускорение. И покажется, что библиотека работает плохо, что не соответствует действительности. А непрофессионал тоже будет толковать такое ускорение превратно

Вы всё правильно говорите, но к чему это?
Эти слова как-нибудь подтверждают, что нужно использовать режим "без оптимизаций"? нет.


Иван Денисов писал(а):
Я вот как-то уже обжегся на этих сравнениях

Ну, да, "А непрофессионал тоже будет толковать".
Разумеется, нужно применять мозг при составлении кода и при анализе результатов.

Автор:  Пётр Кушнир [ Четверг, 22 Март, 2018 22:02 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
Wlad писал(а):
Я правильно понимаю, что пользователь библиотеки обязан знать про тип Elem и Iterator при работе со списками? и - наследовать свои классы от Elem, в предположении, что они будут храниться в списках?

Да, именно так

Зачем, блин, зачем...

Автор:  Wlad [ Четверг, 22 Март, 2018 22:39 ]
Заголовок сообщения:  Re: Standard Container Library

Дмитрий Дагаев писал(а):
Wlad писал(а):
Я правильно понимаю, что пользователь библиотеки обязан знать про тип Elem и Iterator при работе со списками? и - наследовать свои классы от Elem, в предположении, что они будут храниться в списках?
Да, именно так

Это - плохо.
Классы предметки (их разработчики) не должны (в общем случае), строить какие-либо предположения о факте и способах включения в какие-либо, явно выраженные в проектируемом приложении, множества(отношений, признаков) (списки)...
В общем случае сущность НЕ ДОЛЖНА иметь свойства "быть элементом списка".
А вот произвол (со стороны разработчика системы/приложения) включения этой сущности в ЛЮБОЙ список(множество) - ДОЛЖЕН БЫТЬ.
Поэтому, мы должны обеспечить возможность и механизмы организации таких множеств, но это никоим образом не должно быть отражено в проектируемых сущностях.
Лучше исходить из таких требований.
Тогда (при некотором снижении производительности), возрастает показатель гибкости и общности решения.
К тому же, что я считаю более важным, уровень семантики прикладной системы не засоряется лишними знаниями о способах реализации множеств.

Автор:  Пётр Кушнир [ Пятница, 23 Март, 2018 00:28 ]
Заголовок сообщения:  Re: Standard Container Library

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

Автор:  Дмитрий Дагаев [ Пятница, 23 Март, 2018 09:20 ]
Заголовок сообщения:  Re: Standard Container Library

Wlad писал(а):
В общем случае сущность НЕ ДОЛЖНА иметь свойства "быть элементом списка".
А вот произвол (со стороны разработчика системы/приложения) включения этой сущности в ЛЮБОЙ список(множество) - ДОЛЖЕН БЫТЬ.
Поэтому, мы должны обеспечить возможность и механизмы организации таких множеств, но это никоим образом не должно быть отражено в проектируемых сущностях.
Лучше исходить из таких требований.

Да, я рассматривал эту проблему. Элемент списка Elem имеет естественные поля next, prev.
Включение любой сущности в любой список(множество) делаем по схеме инкапсуляции
Код:
Entity = RECORD (BaseEntity)
    user_data: INTEGER;
END;
Elem = RECORD (Lists.Elem)
   e: Entity;
END;

На сущность Entity не накладывается никаких ограничений, она, например, может наследоваться от BaseEntity или вставляться как элемент дерева в Map.

P.S.
А вот индексы внутри Entity пока не получится вставить. Спасибо за вопрос, доделаю, когда будет время.

Автор:  Wlad [ Суббота, 24 Март, 2018 01:01 ]
Заголовок сообщения:  Re: Standard Container Library

Реализациям коллекций не нужно быть "полиморфными" (под тем или иным соусом).
Безопасность типа достигается в агрегирующих их классах.
На уровне модели прикладной области нет необходимости знать о том, вектором или списком реализовано ЧТО-ТО внутри множества-сущности из прикладной области.
Безопасность как раз и будет достигнута приведением типа во время работы методов-оберток (от сеттеров и геттеров и - до каких-то сложных методов).
Например, множество процессов-"серверов", ожидающих каких-либо внешних сигналов, не есть "просто список" с традиционным набором операций над списком. Скорее всего, интерфейсные функции этого "множества" будут включать в себя довольно нетривиальные действия. Но работать они будут именно с сущностями-процессами. Внутри этого класса мы гарантированно работаем ИМЕННО с "процессами" (нашего уровня предметки) и - НИ С ЧЕМ ДРУГИМ (ну - просто по логике работы этого класса-"множества процессов"), а прохождение "границы" между внутренностями этого класса-"множества" и "внешним миром" будет обеспечиваться высокоуровневыми проверками при обеспечении выполнения контрактов.
Поэтому, на уровне "чуть ниже" проектируемой системы, не будет никакого другого класса "список" (как примера контейнера для хранения "процессов"), кроме одного, элементы которого - ANY/void*/OBJECT (в зависимости от языка).
Поэтому и шаблонные "инстанцируемые" типы - особо не нужны.
Знаменитого (в библиотеках шаблонных классов коллекций) дублирования кода не происходит, а высокоуровневая проверка ("обеспечение типовой безопасности") - и так будет осуществляться в методах объектов уровня предметной области.

П.Н. Пересмотр подходов к проектированию - да - нужен.

Страница 4 из 6 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/