Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
Athari
Дата 13.5.2013, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



Добавил версию на строках: https://github.com/Athari/Tmp-StringBuilder...elphi/Unit1.pas
Обновлённые цветастые таблички: https://github.com/Athari/Tmp-StringBuilder...ingBuilder.xlsx

Забавная эта штука дельфи -- код, который согласно любой логике работать не должен, умудряется работать быстрее того, который по любой логике более шустр. smile То есть дельфи всё ещё сливает дотнету, конечно, причём в некоторых тестах раз в пять, а если выигрывает, то почти всегда незначительно, -- но теперь хотя бы нет ужасающего стабильного разрыва в несколько раз во всех тестах. Причём даже потребление памяти исправилось, на пике вышло 750 метров. Надо признать: строки оптимизированы хорошо.

Но почему в дельфи такое медленное создание объектов (ускорение в первой четверти таблицы в 2-3 раза) -- для меня остаётся загадкой. В коде нет ничего очевидного, что может так тормозить.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
fd00ch
Дата 13.5.2013, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Цитата(Athari @ 13.5.2013,  21:48)
Но почему в дельфи такое медленное создание объектов (ускорение в первой четверти таблицы в 2-3 раза) -- для меня остаётся загадкой. В коде нет ничего очевидного, что может так тормозить.
каких еще объектов?

Цитата(Athari @ 13.5.2013,  21:48)
Причём даже потребление памяти исправилось, на пике вышло 750 метров
потому что по-честному не создается копия результирующей строки, о чем я говорил выше

Цитата(Athari @ 13.5.2013,  21:48)
Надо признать: строки оптимизированы хорошо
скорее, менеджер памяти

результаты в обновленной таблице у Delphi (+) какие-то убогие. оставил циклы прежними, не стал по-хорошему их переписывать?

Это сообщение отредактировал(а) fd00ch - 13.5.2013, 22:22
PM MAIL   Вверх
Akella
  Дата 13.5.2013, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



В реальных же проектах нет необходимости по миллиону раз, и даже по 10 тыс. раз выполнять конкатенацию строк в цикле. По крайней мере мне не приходилось. Максимум раз 10-20 в цикле. И у меня часто используется функция StringReplace().
PM MAIL   Вверх
Athari
Дата 13.5.2013, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@fd00ch

Цитата
Код привел выше Akella - это мой вариант. Вот чуть более быстрый:

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

Цитата
кидай этот код, посмотрим

Хм, что-то сорцы не высосались. Ну вот декомпиляция StringBuilder из .NET 3.5 (выкинул комментарии и сериализацию): https://gist.github.com/Athari/5570726
Вот из дельфи: https://gist.github.com/Athari/5570745
В дотнете ещё всякая потокобезопасность накручена, так что ещё медленнее должно быть.

Цитата
Обсуждаемый вопрос. Я не в курсе, что такое unsafe код - значит, может не работать на другой платформе, под которой фреймворка все равно нету?))

Managed code: "Стерлять в ногу -- нельзя!"
Unmanaged code: "Стрелять в ногу -- здесь!"
Собственно, unsafe код -- это работа с указателями. Про платформы не фантазируй, ибо кросс-платформенность получше, чем у дельфи.

Цитата
Цитата
Во-первых, в коллекциях нативного кода, вроде, нет
Ну тогда не надо в конце кричать "смотрите, как наш управляемый код с JIT, GC и прочими умными буквами уделывает ваш убогий нативный", т.к. управляемый код там, по факту, и не работает

Не улавливаю логику. Прочитай прокомментированное внимательнее...

Цитата
Цитата
Белтар уже "писал" конкатенацию простых строк, "натестировались".
прочитай процитированный кусок еще раз, ты его не понял

Здесь опечатка: "простых" следует читать как "пустых". У Белтара была ошибка в коде, из-за которой складывались пустые строки. Поэтому поведение приложения в этом случае мне известно.

Цитата
каких еще объектов?

TStringBuilder. Собственно, в первой стадии теста (первая четверть таблицы) дельфи просаживается -- по словам Белтара -- в конструкторе TStringBuilder. При этом в конструкторе никакого подозрительного кода не видать (см. мой пост выше, там код).
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
Athari
Дата 13.5.2013, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Akella

Цитата
В реальных же проектах нет необходимости по миллиону раз, и даже по 10 тыс. раз выполнять конкатенацию строк в цикле. По крайней мере мне не приходилось. Максимум раз 10-20 в цикле. И у меня часто используется функция StringReplace().

У нас нет реальных эквивалентных проектов на разных технологиях, на которых можно эффективно проводить сравнения, поэтому единственное, что остаётся -- маразматичные синтетические тесты.

@fd00ch

Цитата
потому что по-честному не создается копия результирующей строки, о чем я говорил выше

Гы, и правда:
Код

SetString(Result, MarshaledString(FData), Length);

Но начерта так сделали?
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
fd00ch
Дата 13.5.2013, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Цитата(Athari @ 13.5.2013,  22:22)
В дотнете ещё всякая потокобезопасность накручена, так что ещё медленнее должно быть.
В Delphi тоже, не переживай. Потому код и тормозит...

Цитата(Athari @ 13.5.2013,  22:22)
Собственно, в первой стадии теста (первая четверть таблицы) дельфи просаживается -- по словам Белтара -- в конструкторе TStringBuilder. При этом в конструкторе никакого подозрительного кода не видать (см. мой пост выше, там код).
Дык, ты создаешь и уничтожаешь 100 млн объектов. ничего удивительного, что элементарный код
Код
for i:=0 to 100000000 do TObject.Create.Free;
выполняется 4-5 секунд, инициализация-финализация не дается бесплатно, но тут - и не слишком дорого. NET, кстати, не создает ли в реале 1 билдер, а потом 100 млн раз делает Clear и использует его снова и снова?))

Цитата(Athari @ 13.5.2013,  22:48)
Но начерта так сделали?
Очевидно, потому что в 99.9% случаев внутренний буфер имеет бОльшую длину
PM MAIL   Вверх
Athari
Дата 14.5.2013, 00:08 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



Добавил версию с "оптимизированными циклами": https://github.com/Athari/Tmp-StringBuilder...elphi/Unit1.pas
Результаты: https://github.com/Athari/Tmp-StringBuilder...ingBuilder.xlsx

В левом нижнем углу страницы в экселе добавил табличку с соотношением скоростей. Процент означает потерю/прирост времени при переходе с Delphi на .NET. Если процент меньше нуля и зелёный -- победа за дотнетом, если больше нуля и красный -- за дельфи. В первой четверти победила дельфи (впрочем, дотнет на операторах здесь тоже будет летать, но мерять лень). В остальных практически ничья, правда наблюдается закономерность, что дотнет заметно лучше на небольших строках, а дельфи незначительно -- на больших, но за счёт того, что суммарно по времени на большие строки уходит больший процент времени, ситуация выравнивается. В реальных приложениях стомегабайтные строки --  это, конечно, большая редкость; равно как и слияние "а" + "аа" на StringBuilder.

Что дельфи настолько просаживается на for-in, что это оставляет в тени остальной код -- это забавно. Ну нельзя так писать компилятор, чтобы синтаксический сахар в самых тривиальных и часто используемых случаях умудрялся тормозить код в два раза. smile 

@fd00ch

Цитата
В Delphi тоже, не переживай. Потому код и тормозит...

Не вижу упоминания потоков в сорцах TStringBuilder.

Цитата
выполняется 4-5 секунд, инициализация-финализация не дается бесплатно

Какая инициализация-финализация? Выделить блок под билдер, выделить блок под буфер, записать три dword'а, удалить блок буфера, удалить блок билдера. Выделение и удаление блоков, как мы уже выяснили, быстрое. Тогда в чём тормоза?

Цитата
Очевидно, потому что в 99.9% случаев внутренний буфер имеет бОльшую длину

Потери 50% памяти -- незначительная погрешность в современных реалиях, особенно учитывая, что большинство строк умрёт вскоре после создания. Собственно, всеми любимые vector<T>/List<T> исходят из той же логики.

Цитата
NET, кстати, не создает ли в реале 1 билдер, а потом 100 млн раз делает Clear и использует его снова и снова?))

Дотнет не настолько умный. smile Ну и можно проверить и вынести билдер за цикл -- тесты будут пролетать моментально.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
fd00ch
Дата 14.5.2013, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Цитата
Что дельфи настолько просаживается на for-in, что это оставляет в тени остальной код -- это забавно. Ну нельзя так писать компилятор, чтобы синтаксический сахар в самых тривиальных и часто используемых случаях умудрялся тормозить код в два раза. smile 
Нельзя рассуждать о том, чего не понимаешь. Основной тормоз там должен быть не от for in, а от поддержки многопоточности строками. Хотя и for in тормоз)

Цитата
Не вижу упоминания потоков в сорцах TStringBuilder.
Ищи эти упоминания в подкапотных low level функциях для работы со стрингами

Цитата
Тогда в чём тормоза?
Ты описал действия для некоего стрингбилдера, который является "потомком" record, потомки TObject выполняют еще и доп.код

Цитата
Дотнет не настолько умный. smile Ну и можно проверить и вынести билдер за цикл -- тесты будут пролетать моментально.
Ну а я пока не верю, что .NET реально создает и уничтожает 100 млн объектов за 600 мс, умудряясь еще и полезную работу выполнить (в одном потоке))). Где-то он обязан филонить. Вынеси за пределы цикла - посмотрим))
PM MAIL   Вверх
fd00ch
Дата 14.5.2013, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Хотя, нет - 100 млн объектов создается только в первом проходе - на это .NET тратит минимум 4.5 сек (с полезной работой). в это поверить еще можно...

Тогда сравнивать Delphi и .NET описанным сценарием изначально не имело смысла - тупо из-за накладных расходов в Delphi при создании/уничтожении объектов (100 млн итераций TObject.Create.Free занимает 4.5 сек, TStringBuilder.Create.Free - аж 9 сек). Хотя, на последних проходах (где создается мало объектов) Delphi с TStringBuilder и грамотными циклами вполне мог бы потягаться с .NET ;)

Это сообщение отредактировал(а) fd00ch - 14.5.2013, 00:53
PM MAIL   Вверх
Athari
Дата 14.5.2013, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@fd00ch

Цитата
Ты описал действия для некоего стрингбилдера, который является "потомком" record, потомки TObject выполняют еще и доп.код

Какой доп. код? Не вижу в конструкторе TObject ничего.

Цитата
Ну а я пока не верю, что .NET реально создает и уничтожает 100 млн объектов за 600 мс, умудряясь еще и полезную работу выполнить (в одном потоке))). Где-то он обязан филонить. Вынеси за пределы цикла - посмотрим))

Сделал полное повторное использование. Ускорилось в два раза в случае .NET 4.5, в полтора -- в случае .NET 3.5.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
serger
Дата 14.5.2013, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Цитата(Athari @  13.5.2013,  22:48 Найти цитируемый пост)
Но почему в дельфи такое медленное создание объектов (ускорение в первой четверти таблицы в 2-3 раза) -- для меня остаётся загадкой. В коде нет ничего очевидного, что может так тормозить. 

Отсутствие GC.
Выделение памяти без сборки раза в 4-5 медленнее.

Добавлено через 5 минут и 17 секунд
Цитата(fd00ch @  14.5.2013,  01:26 Найти цитируемый пост)
Основной тормоз там должен быть не от for in, а от поддержки многопоточности строками. 

В java для этого есть StringBuffer(потокобезопасен) и StringBuilder(не потокобезопасен - теперь рекомендуется).


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Athari
Дата 14.5.2013, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@serger

Цитата
Отсутствие GC. Выделение памяти без сборки раза в 4-5 медленнее.

Строки при конкатенации через оператор+ спамят менеджер памяти только так. Дельфи в этом режиме работает достаточно быстро, дотнет -- загибается. Или строки особенные какие-то?
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
serger
Дата 14.5.2013, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Athari, не совсем понял.
Вообще строки - это такая запутаная штука, как я понимаю. В каждом языке стараютя посвоему "извратиться". Наверное это не очень удачный способ померяться.

Добавлено через 10 минут и 45 секунд
http://store.embarcadero.ru/catalog/product/1
Если этого достаточно, то не так и дорого, но они болванки продают за 1000 р!!!


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Athari
Дата 14.5.2013, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@serger

Цитата
не совсем понял.

На дельфи сложить 32 раза строки оператором+ (то есть выделить память под строки длины 1, 2, 3, 4, ..., 32) быстрее, чем сложить билдером (создать билдер, создать три буфера длиной 16, 32 и 32). Это странно.

Цитата
Если этого достаточно, то не так и дорого, но они болванки продают за 1000 р!!!

Starter нервно курит в сторонке от одного вида Visual Studio Express: совершенно бесплатно, ограничений на доход нет; разработка под десктоп (WinForms, WPF, WinAPI), метро, веб (ASP.NET, Azure), Windows Phone, игры для десктопа и XBox 360 (XNA); C#, C++, VB; 32, 64-bit; SQL Server. Собственно, Delphi Pro (14 091.72 руб) сосёт и причмокивает у Visual Studio Express (0 руб). (Средства отладки более урезанные, да, но возможностей всё равно на порядок больше.)

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

Это сообщение отредактировал(а) Athari - 14.5.2013, 13:20
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
serger
Дата 14.5.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Цитата(Athari @  14.5.2013,  14:16 Найти цитируемый пост)
На дельфи сложить 32 раза строки оператором+ (то есть выделить память под строки длины 1, 2, 3, 4, ..., 32) быстрее, чем сложить билдером (создать билдер, создать три буфера длиной 16, 32 и 32). Это странно.

КО. Надо смотреть исходы - какие буферы создаются.


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1062 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.