Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 15:49 31-03-2024
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Lena44

Цитата:
kaz_av это пустота дискуссии и пустая трата времени.

Мне лично дискуссия понравилась и оказалась полезной.  
 

Всего записей: 1477 | Зарегистр. 24-03-2009 | Отправлено: 19:11 06-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo

Цитата:
Если такой зависимости нет, то это обычный робо-трейдинг.  

На сайте же прямо написано - high-frequency. Контора работающая в этой области и продающая продукт, в курсе наверное о чем говорит.
 
Lena44

Цитата:
Эту бесполезность провоцируют такие участники как например kaz_av.  

Я провоцирую? Может стоит почитать с чего разговор начался.

Цитата:
Я рассматриваю fmx как и RAD в целом, только как инструмент решения корпаративных задач, а не массового использования в маркете.  

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

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 19:19 06-01-2015
landy



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
На сайте же прямо написано - high-frequency. Контора работающая в этой области и продающая продукт, в курсе наверное о чем говорит.  

В курсе обычно только те, кто пишут продукт, а отнюдь не девочки- моркетологи, которые пишут новости на сайт.
 
Добавлено:

Цитата:
По моему мнению для корпаративных задач - fmx хорошее решение. Правда я решала свою задачу не на паскале а на с++.

Лена, в данном случае именно ты сбиваешь планку дискуссии

Всего записей: 576 | Зарегистр. 17-01-2003 | Отправлено: 21:39 06-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
landy

Цитата:
В курсе обычно только те, кто пишут продукт, а отнюдь не девочки- моркетологи, которые пишут новости на сайт.  

По той ссылке и цифры находятся.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 22:55 06-01-2015
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
Результат:
Java (Release. Open JDK x64): 6286
Delphi (Release. x64): 24214

Сколько байт занимает один символ в Java?

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 00:58 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Сколько байт занимает один символ в Java?

2 байта, как и в Delphi и в C#.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 01:07 07-01-2015
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В D тоже есть GC.
Ради интереса написал:
Код
Код и exe-шники (x32)
Будет интересен результат.

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 01:18 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Код:
 
kazalex@kazalex-pc:~/Downloads$ wine BenchAllocateGCDisable.exe  
-->36569
 
kazalex@kazalex-pc:~/Downloads$ wine BenchAllocateGCEnable.exe  
-->62070
 

У тебя там в обоих циклах на одну итерацию больше. И разве в D нет аналога стрингБилдера, т.к. строки-то иммутабельные?

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 01:37 07-01-2015
data man



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
BenchAllocateGCEnable.exe  
-->62070  

Результат немного удручает, да.

Цитата:
У тебя там в обоих циклах на одну итерацию больше.

Нет, правая граница не считается.

Цитата:
И разве в D нет аналога стрингБилдера

Есть, всё тот же appender.
На самом деле я немного схитрил: тип string хранит строки в UTF-8. Для чистоты эксперимента нужно заменить на wstring.
Вообще, после D и Delphi и С++ кажутся какими-то...недоязыками, извините.
 
 
Добавлено:
Всё-всё, ухожу-ухожу.

----------
Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
Кекс. Антибиотики. Ламбада.

Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 01:49 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
data man

Цитата:
Нет, правая граница не считается.

Вот всё у вас ни как у людей
 

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 01:57 07-01-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Сколько бы она ни стоила, она лучше EOutOfMemory.  

Только вот момент, когда заканчивается память у managed приложения наступает много раньше, чем у натива. Из-за GC. Покажи мне пример, когда, проблема фрагментации стала для натива стала критичной.

Цитата:
Это прекрасно. Не слышал, но уверен, что не на много.  
потому что я знаю, как работает кэш, и не вижу, какие преимущества может дать GC.
Это ты не дал никакий ни теоретических, ни практических обоснований для своего утверждения.  
 

Цитата:
У менеджеров конечно нет, это геморой программиста. Только с GC его нет.  

но есть другой?
Цитата:
при использовании GC можно голову выключать. Я уже писал, что GC это инструмент и им нужно уметь пользоваться, а не просто: "память безгранична, ООП головного мозга, щас спою".  

Так то! В нативе все, что нужно: это вовремя освободить память.  
А managed девелоперы, столкнувшиеся с серьезной задачей, вынуждены думать и о неявном боксинге, и о времени жизни объектов, и о передаче ссылок на объекты -- то есть, не зная точной стратегии мусорщика, все же пытаться ему помогать. И это ли не геморрой?
Блин, я лучше буду искать утечки, или иногда(случается редко) расследовать случаи поврежденного буфера, чем такое.

Цитата:
Это статические-то массивы на стеке нетривиальная практика??? Куда уж тривиальнее...  

я лично такое использую редко. И если проблема проявится, то по стеку вызовов это место будет одним из первых для анализа и проверки.
 
 Притом я сам всегда делаю буфер, как ты говоришь: "на 1-2 байта" больше, чем ожидаю получить:занижаю декларированный для АПИ размер. Это мой личный опыт.
 

Цитата:
Работает-работает, просто увеличивается время на просмотр графа.  

как его можно до конца проанализировать, когда он постоянно меняется? И даже если можно, сколько процессорного времени будет это занимать?
 

Цитата:
У меня нет айфона, но ты вот мне ответь, почему на своём ведроиде я ни каких тормозов и проблем с отзывчивостью не наблюдаю?  
это что за аргумент? Проблемы с отзывчивостью андроида общеизвестны.
Их может не быть на топовых устройствах, конечно, с большим объемом оперативной памяти. Сколько в твоем?  
Но если взять взять android телефон по тех характеристикам равный iPhone(<=1Gb RAM), какой будет ситуация?
 

Цитата:
Ну т.е. если запустить аппу собранную с обезьяной они конечно сразу обнаруживаются, но дело тут-то точно не в GC  
это проблема FMX, никто не говорит, что он хорош.
 

Цитата:
У Рихтера есть книжка посвященная GC. Есть статьи с детальным разбором. Ищущий да обрящет.  

это опять отсылка в гугль?

Цитата:
SMM из стадии эксперимента все никак не выйдет.

пустая отмазка. Чем он плох?

Цитата:
 А его наличие никак не отменяет отстойности стандартного менеджера в многопоточке.  
не отменяет. Ну и что? Менеджер памяти для Delphi - вагон. И их можно кастомизировать средствами самого языка, в отличие от GC;они много проще устроены,так что это посильная задача даже для одиночки.
Мы-то знаем, что некоторые джависты в своей борьбе с ущербным инструментом пишут свои GC, и вот это -- хардкор.
 

Цитата:
Теперь скажи, а кому по карману идеальный код в нативе?  
никому почти. Но он и не нужен. Даже средний код нативный -- очень быстр.

Цитата:
А вот середнячки с нативом в руках, что обезьяны с гранатой.  
ложь. Думаешь Windows писали одни асы? А Delphi среду? А любой движок БД?
 
У тебя просто заниженный показатель "среднего", думается. Что, дотнетчик с 1 годом опыта уже у тебя средним является? Я себя к асам не причисляю, но с таким бы программером рядом и с..ть не сел.  
 

Цитата:
А ты бы хотел, чтоб я я сюда постил многостраничные тексты? Пару слов в гугл вбить очень сложно?  
Я бы хотел, чтобы ты давал конкретные ссылки, причем если объем большой, что своими словами резюмировал суть.
Только тролли посылают в гугль. И только дураки дают ссылки на пространные документы без указания, что именно там искать.

Цитата:
Цитата:
ЧТО? это вызов косвенный адово замедляет?  Во времена, когда в тренде Dependency Injections и интерфейсы(в которых все вызовы  косвенные)?
 
Читай.

Это 5 процентов овехеда -- чудовищное замедление? Что за ерунда? А сколько жрет GC, пусть даже работая в фоне?
Потом, мы не знаем кейса. Может, он в тугом цикле перекидывает ссылки на объекты как параметры, без const или var модификатора. Подсчет ссылок -- это ведь тоже не серебряная пуля. Но справиться с подсчетом все же проще , чем с GC.
 

Цитата:
Она появиться может не сразу, а вылазить у юзера при обработке специфических данных. Такие ошибки самые гадские, и в плане поиска и в плане последствий.
Так трудно-повторяемые ошибки на специфических данных вообще худшие, безотносительно, связаны они с порчей памяти, или нет. GC от них не гарантирует.
Да, это проблема. Но у программиста должно быть достаточно мужества, чтобы быть готовым к этому.

Цитата:
Высокочастотный трейдинг достаточно серьезное применение? Вот например, написан на жабе
тут чел уже давал ссылку
https://www.lektorium.tv/lecture/14257  
там умудренный джавист два часа распинался, как борясь с языком и парадигмой GC(по сути, они реализовывали свои кастомные неуправляемые кучи, чтобы избежать GC), а также ломая парадигмы не только ООП, но даже и просто структурного программирования, -- словом, пускаясь во все тяжкие, они добивались скорости.
Да уж, толк в извращениях они знают.
 
И да,объем знаний, который при этом был задействован, столь велик, что мне рассудилось, что было проще нанять команду "средних" нативщиков, которые будут писать неидеальный но все же очень быстрый (ибо натив и без GC) код, ну и одного аса, который будет за ними подчищать утечки и прочие скорбные дела натива.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 02:22 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL

Цитата:
Только вот момент, когда заканчивается память у managed приложения наступает много раньше, чем у натива. Из-за GC.

Когда у GC заканчивается память, он уплотняет кучу. Когда у нативного менеджера память фрагментировалась  - game over.

Цитата:
Покажи мне пример, когда, проблема фрагментации стала для натива стала критичной.  

Гуглиться на раз.

Цитата:
Это ты не дал никакий ни теоретических, ни практических обоснований для своего утверждения.

Какие обоснования тебе нужны? Что работает быстрее: последовательный просмотр памяти или прыжки по разным участкам? Так вот первый сценарий это GC, второй - подсчет ссылок.

Цитата:
но есть другой?

У программиста нет. Есть определенные требования к среде исполнения.

Цитата:
Так то!

Так я с самого начала об этом твержу. С чем ты спорил-то?

Цитата:
я лично такое использую редко. И если проблема проявится, то по стеку вызовов это место будет одним из первых для анализа и проверки.

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

Цитата:
Притом я сам всегда делаю буфер, как ты говоришь: "на 1-2 байта" больше, чем ожидаю получить:занижаю декларированный для АПИ размер. Это мой личный опыт.  

А чего не на 4 или 8?

Цитата:
как его можно до конца проанализировать, когда он постоянно меняется?

Прочитай уже, как работает concurent GC.

Цитата:
И даже если можно, сколько процессорного времени будет это занимать?  

Я тебе предлагал уже самому посмотреть на счетчики любого дотнетовского приложения. Всё от ситуации зависит, когда я мониторил одну софтину там GC кушал сотые доли процента.

Цитата:
Проблемы с отзывчивостью андроида общеизвестны.
Их может не быть на топовых устройствах, конечно, с большим объемом оперативной памяти.

Сравнивать iOS и Android, для поисков истины в споре ARC vs. GC, вообще глупо т.к. iOS является оптимизированным решением для железа единственного вендора, а Android универсальная ОС работающая на диком зоопарке разношерстного говна. У меня аппарат далеко не флагман, скорее середнячек. Памяти там 2Gb, но свободной почти гигабайт. Я тебе больше скажу, на моей старой нокии, работающей на S60, была установлена Java ME и несколько игрушек для неё, которые работали без каких либо проблем. Памяти на аппарате было всего-то 4Mb.  

Цитата:
это опять отсылка в гугль?

Я не пойму, ты от меня ссылок ждешь, или перепоста книги и статей? Ну возьми да вбей ".net gc richter", и получишь желаемое.

Цитата:
пустая отмазка. Чем он плох?

Кроме того, что не пригоден для использования в продакшене? Ничем.

Цитата:
И их можно кастомизировать средствами самого языка, в отличие от GC;они много проще устроены,так что это посильная задача даже для одиночки.  

Ты уже начал свой писать, чтоб обогнать жабий GC на строках?

Цитата:
Даже средний код нативный -- очень быстр

Да, он очень быстро падает.

Цитата:
У тебя просто заниженный показатель "среднего", думается.

Нет, просто насмотрелся.

Цитата:
Я бы хотел, чтобы ты давал конкретные ссылки, причем если объем большой, что своими словами резюмировал суть.  

Я по возможности даю конкретные ссылки, а когда предлагаю погуглить то контекста ясно что искать (пример выше был дан). А перечитывать статьи и кратко их тебе пересказывать мне, увы, не интересно. Если ты берешься спорить, а теории не хватает, то это не моя проблема.

Цитата:
Это 5 процентов овехеда -- чудовищное замедление?

Из ничего - не то слово.

Цитата:
А сколько жрет GC, пусть даже работая в фоне?  

Я тебе уже ответил выше. А еще раньше говорил, что работающий в фоне GC на производительность приложения практически не влияет т.к. приложений способных загрузить многоядерный процессор на 100% крайне мало.

Цитата:
Потом, мы не знаем кейса.

Это не обязательно. Достаточно знать, как в дельфях финалятся управляемые типы, а объекты в мобильном компиляторе, о котором речь, как раз управляемые. Досаточно декларировать в процедуре/функции/методе переменную управляемого типа, и ты попадаешь на неявный вызов финализатора. Ну и если такой метод часто вызывать, то просадка может быть весьма ощутимой.

Цитата:
GC от них не гарантирует.  

Их позволяет избежать управляемый safe code.

Цитата:
там умудренный джавист два часа распинался, как борясь с языком и парадигмой GC

А он там не рассказал, чего они не взяли нативные плюсы?

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 04:21 07-01-2015 | Исправлено: kaz_av, 04:42 07-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Почему GC от C# убивает TrayIcon? Дело в том что в программе я не делал Visible = false. В логе видел Visible = true, но у пользователя пропадала иконка и он не мог зайти в программу.
 
Добавлено:

Цитата:
Да, он очень быстро падает.

У дровосеков одной и той же квалификации - реже падает. Там гораздо больше экзепшенов прописано - труднее заблудиться в вариациях на тему.
 
Добавлено:
Разницы между подсчётом ссылок и счётчиком особой не вижу. Мне больше нравится самостоятельно высвобождать память или губить ссылку, заранее зная что объект останется.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 07:36 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Почему GC от C# убивает TrayIcon? Дело в том что в программе я не делал Visible = false. В логе видел Visible = true, но у пользователя пропадала иконка и он не мог зайти в программу.

GC не может убить объект на который есть ссылки. Может у твоего юзера винда скрыла иконку, или твоя софтина не умеет восстанавливать иконку после падения эксплорера?
 

Цитата:
труднее заблудиться в вариациях на тему.  

AV указывающий на мусор мало чем тебе поможет, а это очень распространенная ситуация.
 

Цитата:
Разницы между подсчётом ссылок и счётчиком особой не вижу.

В смысле, между ARC и GC?
 

Цитата:
Мне больше нравится самостоятельно высвобождать память или губить ссылку, заранее зная что объект останется.

И мне больше нравится натив. Я пишу на дельфях уже 16 лет, а до этого два года писал на TurboPascal + Assembler. Но я не слепой фанатик, и не собираюсь отрицать плюсы GC и минусы натива, равно как и замалчивать проблемы конкретно дельфей.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 16:10 07-01-2015 | Исправлено: kaz_av, 16:20 07-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
В смысле, между ARC и GC?  

Да, не вижу особой разницы. Будь это даже удаление записей в базе по ID на которых каунтер или подсчитываемое хранимое поле = 0. Разницы особой нет.
 

Цитата:
Я пишу на дельфях уже 16 лет

Похвально
 

Цитата:
AV указывающий на мусор мало чем тебе поможет, а это очень распространенная ситуация.

AV указывающего на мусор, так понимаю ошибки памяти, я никогда не видел - там свой собственный экзепшен (и вылавливал я их легко собственным менеджером памяти, могу запостить - удобно мемори лики ловить). Но "уже 16 лет", тута я сильно засомневался. Если компилим проект с Debug DCU -optimization, до всех исходников указан путь, то любой AV, совершенно любой, тут же покажет где он случился, а далее - дело 10-и минут. Если 16 лет, то Вы должны знать про AV всё.
 

Цитата:
или твоя софтина не умеет восстанавливать иконку после падения эксплорера?

Когда падает Explorer - это визуально заметно, этого не было.  
 

Цитата:
GC не может убить объект на который есть ссылки. Может у твоего юзера винда скрыла иконку,

Так если бы это было один раз, так это было постоянно. Посмотрите в ILSpy или ILdasm, там она (иконка), как раз с GC общается по поводу того что у неё внутри системный ресурс.
 
 
Добавлено:

Цитата:
Может у твоего юзера винда скрыла иконку,  

Скрывать - не скрывала. А вот чтобы убить, надо знать имя процесса и уметь вычислить именно её хэндл в систрее, в чём я сильно сомневаюсь, что кто-то бы заморочился. Убивалась именно моя иконка постоянно, и думаю что GC успевал понять что системный ресурс ссылками не одолеть, но не успевал её пометить как не убиваемую, - при старте системы процессорного времени для дотнета маловато, так что и процессы GC рубятся. Запускали после загрузки - всегда иконка есть.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 18:52 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
AV указывающего на мусор, так понимаю ошибки памяти, я никогда не видел

При порче стека это очень вероятная ошибка. Я на D2010 попадал с ошибкой компилятора, который при определенных условиях дважды финализировал интерфейсную переменную, в результате чего я имел указатель на несуществующий объект. Я её вылавливал несколько часов. И это мой собственнй код, который я пишу и о котором знаю всё до самой последней мелочи. Если бы аналогичная проблема возникала в коде сторонней библиотеки, не думаю, что я ограничился бы несколькими часами поисков.
 

Цитата:
Так если бы это было один раз, так это было постоянно.

GC не может убить объект на который имеются ссылки. Это аксиома.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 19:53 07-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
мой собственнй код, который я пишу и о котором знаю всё до самой последней мелочи

Интересно было бы посмотреть.

Цитата:
При порче стека  


Цитата:
дважды финализировал интерфейсную переменную

На сколько знаю в стеке только ссылка на интерфейс, а счётчик интерфейса явно за рамками стека. Или мы о других интерфейсах? Что такое интерфейсная переменная?

Цитата:
Я на D2010 попадал с ошибкой компилятора, который при определенных условиях  

Компилятор ошибаться не может, так же как калькулятор, если ему ввели дважды три, он никак четыре не покажет. На счёт косяков оптимизации тоже сомнительно - давно уже вроде всех выловили. Вот и интересно что за условия?

Цитата:
Если бы аналогичная проблема возникала в коде сторонней библиотеки, не думаю, что я ограничился бы несколькими часами поисков.

Так как Вы встретились с проблемой впервые, то потратили много времени, с аналогичной проблемой в чужом коде теперь Вы разберётесь гораздо быстрее.

Цитата:
дважды финализировал  

При финализации, все ссылки заполняются nil, так что хоть 10 финализаций, все пройдут успешно, интерфейсы же вызывают деструктор памяти объекта, но это не есть финализация, это _Release.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 21:16 07-01-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
Цитата:
Покажи мне пример, когда, проблема фрагментации стала для натива стала критичной.  
 
Гуглиться на раз.  

там чел  коммитит 6-7 блоков по 380 мегабайт, это идет в обход MM. А потом освобождает.
В 32-битном режиме!
идиот..
 
 Такая задача либо для 64-разрядных машин, где ,большой фрагментации не будет, либо для специаированного MM.  
 
Он сам виноват. Не такая и проблема: следить чтобы 6-7 блоков не фрагментировались. Это и ежу понятно.
 
У тебя все примеры такие дурацкие??

Цитата:
Что работает быстрее: последовательный просмотр памяти или прыжки по разным участкам? Так вот первый сценарий это GC, второй - подсчет ссылок.  

В плане кэша, ведь ты говоришь о нем: если участок больше 64 байт, линейки кеша, то разницы нет.
Конечно есть префетч, и накладные расходы на стороне RAM для пересылки и вычисления адреса: там, действительно, несколько последовательных чтений или записей выгоднее (DRAM burst).  
Но это не поможет : выигрыш невелик по сравнению с ценой кэшевого промаха.
 
Другими словами, рандомные адреса, не влияют на обработку длинных в массивах(так как там все последовательно), ни на локальные переменные(то все последовательно).
 
Напротив, наличие активного GC в отдельном потоке, потребляет невеликие ресурсы кэша 3-го уровня. А в процессорах Интел, и вовсе активный GC может вызвать обнуление кэша L2 в другом ядре.
 
Что же до остального, типа строк, то не даст последовательное размещение особых преимуществ, если объекты больше 64-байт.
Ручное управление памятью тоже не серебряная пуля, но там намного больше контроля. Больше возможностей.
 
А крохотные объекты  обходятся дорого везде: причем GC с ними работает хуже: приходится вычислять достижимость каждого из целой тучи.
 

Цитата:
 А чего не на 4 или 8?
а того, что при вычислении размера буфера, программисты чаще всего ошибаются на 1 элемент, как в том случае, который ты упоминал.
Опыт, батенька

Цитата:
Я тебе предлагал уже самому посмотреть на счетчики любого дотнетовского приложения. Всё от ситуации зависит, когда я мониторил одну софтину там GC кушал сотые доли процента.  

мы далее рассмотрим время GC, только поскольку ты использовал JVM в своем примере, то о ней и будем говорить.
 

Цитата:
Кроме того, что не пригоден для использования в продакшене? Ничем.  

Кто сказал? Форк ScaleMM включен даже в дистрибуцию mORMot. Он вполне юзабелен.
 

Цитата:
Сравнивать iOS и Android, для поисков истины в споре ARC vs. GC, вообще глупо т.к. iOS является оптимизированным решением для железа единственного вендора, а Android универсальная ОС работающая на диком зоопарке разношерстного говна. У меня аппарат далеко не флагман, скорее середнячек. .  

iOs приложения тоже вынуждены работать с разными версиями iPhone, которые различаются железом.
 

Цитата:
Памяти там 2Gb, но свободной почти гигабайт
вот тебе и ответ. GC может быть хорош, когда памяти вдвое более требуемой.
в покое есть половина, а как начинается нагрузка, GC забирает эту память своим оверхедом.
---------
теперь по примеру.
У меня нет оксиджена, да и вообще писать на нем, таргетируя под JVM, -- имхо извращение, так что я написал аналогичный код на жабе.
Прежде всего скажу, что в твоем коде в итерации забирает  не более  30 мегабайт=(12букв*2*10+48(размер объекта) )*100'000. Так не пойдет. Нужно создать близкую к предельной нагрузку.
Второе, нужно условиться, сколько же памяти мы разрешаем JVM. Как раз для того, чтобы рассчитать нагрузку.
 
И третье, код , который ты привел на оксиджене, ужасен. Ну зачем пересоздавать StringBuilder? Это замедляет код почти в два раза! За такое нужно увольнять с формулировкой "нахер".  
 
JVM, которую я использовал  

Код:
 
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b18)
Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode, sharing)
 

 
вот код
Код Delphi
Проект iDea, как и проект Delphi, с бинарниками доступны по ссылке
https://yadi.sk/d/7K10xzn3dpbF2
Я сейчас на слабой машине, поэтому все под XP/32
 
ключ Xmx400m задает предел кучи 400 Мб, ключ  Xms200m задает начальный размер кучи в 200 мегабайт(это дает фору JVM)

Код:
 
>java -Xms200m -Xmx400m -Xmn300m    -jar untitled.jar 100000 20 1
cached sb
3 args, 20 tries
string size:36, element size:408
Press enter to start
 
Memory 387 973 120, using 100 000 elements=39 843Kb(10 % of free heap)
total:184 384Kb, free:174 549Kb
used? memory:9 834Kb
done pass in 266 (13 per 5000 el)
done pass in 234 (11 per 5000 el)
done pass in 375 (18 per 5000 el)
done pass in 235 (11 per 5000 el)
done pass in 875 (43 per 5000 el)
done pass in 234 (11 per 5000 el)
done pass in 1 453 (72 per 5000 el)
done pass in 203 (10 per 5000 el)
done pass in 235 (11 per 5000 el)
done pass in 406 (20 per 5000 el)
done pass in 219 (10 per 5000 el)
done pass in 968 (48 per 5000 el)
done pass in 219 (10 per 5000 el)
done pass in 875 (43 per 5000 el)
done pass in 219 (10 per 5000 el)
done pass in 219 (10 per 5000 el)
done pass in 500 (25 per 5000 el)
done pass in 218 (10 per 5000 el)
done pass in 703 (35 per 5000 el)
done pass in 204 (10 per 5000 el)
---------------------------------
total:280 120Kb, free:140 528Kb
used? memory:139 591Kb, delta:129 757Kb
---------------------------------
Done: 8 875 time done;
---------------------------------
---------------------------------
8 875 time collected;
---------------------------------
total:280 120Kb, free:276 339Kb
used? memory:3 780Kb, delta:-6 054Kb
total:280 120Kb, free:208 528Kb
used? memory:71 591Kb, delta:61 756Kb
 

итак, 8.56 секунд для 100K элементов в 20 итерациях
замечу на полях, Xmn300m форсирует пул молодых объектов до 300 метров, что увеличивает скорость вдвое: без этого свитча время будет около 16с.
 
теперь Delphi-32

Код:
 
>untitled  100000 20 1 400m
Limit Memory to 400MB
Acquire priviledge:TRUE
handle:1972
Result:TRUE
Using elements:100000; Directly Allocated: 52343Kb
---------
Done in 719; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 687; 34 per 5000 el
Done in 719; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 718; 35 per 5000 el
Done in 704; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 718; 35 per 5000 el
Done in 704; 35 per 5000 el
Done in 718; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 719; 35 per 5000 el
Done in 703; 35 per 5000 el
Done in 734; 36 per 5000 el
Done: 14953
 

14.85 секунд. Delphi медленнее
Но это -- при том, что размер тестового массива очень мал, в сравнении с размером доступной кучи.
 
По моим подсчетам, яве требуется от 38 для работы с массивом: около 360 байт на 10 строк плюс 48 байт на объект, ну и 4 байта на список.
Для Delphi требуется не менее 60мегабайт, из-за оверхеда строк по 12байт на каждую.
По моим вычислениям, именно 60 метров использовала JVM, чтобы хранить этот массив.
 
Но!, судя по тесту, JVM держала около 128 мегабайт, когда при завершении внешнего цикла.
 
Так что я удвоил количество элементов: не количество прогонов, а количество элементов.

Код:
 
total:286 720Kb, free:147 103Kb
used? memory:139 616Kb, delta:129 782Kb
---------------------------------
Done: 23 953 time done;
---------------------------------
---------------------------------
23 953 time collected;
---------------------------------
total:276 664Kb, free:272 865Kb
used? memory:3 798Kb, delta:-6 035Kb
total:276 664Kb, free:138 537Kb
used? memory:138 126Kb, delta:128 292Kb
 

24 секунды, а ведь, должно быть 8.5*2=17
Что же Delphi?

Код:
 
Done: 29890
 

почти линейно удвоилось, 30 против 14.85. А тем временем JVM на выходе из цикла сожрала уже 276 664Kb=270 Мб.
Что же произошло?
Запустим еще раз JVM, с ключом -verbose:gc

Код:
 
>java -Xms200m -Xmx400m -Xmn300m  -verbose:gc  -jar untitled.jar 200000 20 1
 
cached sb
3 args, 20 tries
string size:36, element size:408
Press enter to start
 
Memory 387 973 120, using 200 000 elements=79 687Kb(21 % of free heap)
total:184 384Kb, free:174 549Kb
used? memory:9 834Kb
done pass in 515 (12 per 5000 el)
[GC (Allocation Failure)  163904K->19872K(184384K), 0.1618317 secs]
done pass in 594 (14 per 5000 el)
[GC (Allocation Failure)  183776K->43280K(207296K), 0.3533835 secs]
[Full GC (Allocation Failure)  43280K->43280K(207296K), 0.2921022 secs]
done pass in 1 125 (28 per 5000 el)
[GC (Allocation Failure) , 1.4949862 secs]
[Full GC (Allocation Failure)  286719K->49966K(286720K), 0.6880628 secs]
done pass in 2 641 (66 per 5000 el)
[Full GC (Allocation Failure)  213870K->76672K(267600K), 0.7981438 secs]
done pass in 1 219 (30 per 5000 el)
[Full GC (Allocation Failure)  240576K->103234K(286720K), 1.0608103 secs]
done pass in 1 515 (37 per 5000 el)
done pass in 531 (13 per 5000 el)
[Full GC (Allocation Failure)  286719K->14523K(286720K), 0.3241174 secs]
done pass in 969 (24 per 5000 el)
[GC (Allocation Failure) , 1.4938817 secs]
[Full GC (Allocation Failure)  286719K->41358K(286720K), 0.6118239 secs]
done pass in 2 563 (64 per 5000 el)
[Full GC (Allocation Failure)  205262K->67860K(286720K), 0.7302461 secs]
done pass in 1 156 (28 per 5000 el)
[Full GC (Allocation Failure)  231764K->94394K(286720K), 0.9640220 secs]
done pass in 1 406 (35 per 5000 el)
[Full GC (Allocation Failure)  258298K->121496K(286720K), 1.2126902 secs]
done pass in 1 656 (41 per 5000 el)
done pass in 532 (13 per 5000 el)
[Full GC (Allocation Failure)  286719K->14524K(286720K), 0.3204992 secs]
done pass in 984 (24 per 5000 el)
[Full GC (Allocation Failure)  178428K->41359K(286720K), 0.4725040 secs]
done pass in 906 (22 per 5000 el)
[Full GC (Allocation Failure)  205263K->67861K(286720K), 0.7336974 secs]
done pass in 1 172 (29 per 5000 el)
[Full GC (Allocation Failure)  231765K->94422K(286720K), 0.9798696 secs]
done pass in 1 422 (35 per 5000 el)
[Full GC (Allocation Failure)  258326K->121524K(286720K), 1.2060775 secs]
done pass in 1 656 (41 per 5000 el)
done pass in 532 (13 per 5000 el)
[Full GC (Allocation Failure)  286719K->14524K(286720K), 0.3246451 secs]
done pass in 968 (24 per 5000 el)
---------------------------------
total:286 720Kb, free:147 103Kb
used? memory:139 616Kb, delta:129 782Kb
---------------------------------
 

15 полных сборок, и еще 4 частичных! А было?
 
А было шесть полных и 4 частичных. Ну а по времени?
я запустил
 jstat -gkutil PID 500 10000
 и выходит, что 14.54 секунд было потрачено на сборку, из них 11 - на полную.
В случае со 100000 элементов, цифры совсем другие 4.6 / 2.6
 
Ну а какие цифры будут при 400 000 элементов, когда под данные придется отвести 280 из 400 мегабайт?

Код:
69 656 time collected;

А Delphi?

Код:
 
g:\devsoft\myprojects\lab\untitled\delphi\Win32\Release>untitled  400000 20 1 400m
Limit Memory to 400MB
Acquire priviledge:TRUE
handle:1972
Result:TRUE
Using elements:400000; Directly Allocated: 209375Kb
---------
Done in 2875; 35 per 5000 el
Done in 2922; 36 per 5000 el
Done in 2937; 36 per 5000 el
Done in 2922; 36 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2859; 35 per 5000 el
Done in 2860; 35 per 5000 el
Done in 2844; 35 per 5000 el
Done in 2843; 35 per 5000 el
Done in 2860; 35 per 5000 el
Done in 2890; 36 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2907; 36 per 5000 el
Done in 2906; 36 per 5000 el
Done in 2859; 35 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2860; 35 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2875; 35 per 5000 el
Done in 2890; 36 per 5000 el
Done: 60500
 

60.5 секунд, против 69.6 секунд у JVM.
Delphi выигрывает там, где это и нужно: в высоконагруженных сценариях.
При этом она потребляет меньше памяти, не больше 300метров, точнее сказать затрудняюсь
При этом она работает ровнее, обработка 5000 строк занимает одно и то же время, всегда, н-р у меня 35ms, против разброса 10-70 у JVM.
То есть гарантированная отзывчивость у Delphi вдвое выше, чем JVM.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 21:50 07-01-2015
kaz_av

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Интересно было бы посмотреть.
 

Там нечего смотреть, это был элементарный энумератор реализованый в виде записи с единственным полем интерфейсного типа. Ошибка была в невкорректной кодогенерации при возвращении этого энумератора функцией GetEnumerator. Я, когда выяснил причину ошибки, не стал писать в QC т.к. на XE она уже не воспроизводилась, а старые версии абракадабра не правит.
 

Цитата:
На сколько знаю в стеке только ссылка на интерфейс, а счётчик интерфейса явно за рамками стека. Или мы о других интерфейсах? Что такое интерфейсная переменная?

Порча стэка и двойная финализация это были разные примеры.
 

Цитата:
Компилятор ошибаться не может

Ты такие глупости больше никому не рассказывай, хорошо?
 

Цитата:
с аналогичной проблемой в чужом коде теперь Вы разберётесь гораздо быстрее.  

Проблема была не в коде, он был корректен, ошибка была в кодогенерации.
 
AlekXL

Цитата:
 
У тебя все примеры такие дурацкие??  

Ты убедился, что проблема фрагментации памяти не надумана? Вот и ладушки.
 

Цитата:
Другими словами, рандомные адреса, не влияют на обработку длинных в массивах(так как там все последовательно), ни на локальные переменные(то все последовательно).

Последовательно у тебя расположены ссылки, а счетчики находятся где? Вот-вот... В объектах, которые лежать могут где угодно.
 

Цитата:
программисты чаще всего ошибаются на 1 элемент, как в том случае, который ты упоминал.
Опыт, батенька  

Детский сад какой-то. А элемент массива не может быть 32 или 64 байта, нет?
 

Цитата:
Кто сказал?

Сам автор пишет, что версия экспериментальная. Если ты считаешь использование экспериментальной версии в продакшене нормальным, то говорить более не о чем.
 

Цитата:
iOs приложения тоже вынуждены работать с разными версиями iPhone, которые различаются железом.  

Только iOS пилиться именно под это конкретное железо, а ведроид работает вообще на любой ноунеймовой китайщине. Разница немного очевидна, не считаешь?
 

Цитата:
вот тебе и ответ. GC может быть хорош, когда памяти вдвое более требуемой.  

Нет не ответ. Если GC не будет хватать памяти, ведроид тупо скинет в кэш фоновые приложения. Т.е. для пользователя вообще не имеет значения сколько свободной памяти доступно на устройстве т.к. для работы активного приложения она есть всегда.
 

Цитата:
Второе, нужно условиться, сколько же памяти мы разрешаем JVM

Это с чего вдруг? Никаких разговоров об ограничении небыло.  
 

Цитата:
код который ты привел на оксиджене, ужасен.

Я на красоту не претендовал. Ты хотел пример, я тебе его дал.
 

Цитата:
---------
теперь по примеру.  

Ты не написал код на дельфях, который обогнал бы жабу на работе со строками. Всё что ты сделал, это загнал жабу в некомфортные условия работы. Молодец. А о том, что GC не требователен к количеству памяти никто не говорил.

Всего записей: 439 | Зарегистр. 15-02-2006 | Отправлено: 01:13 08-01-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaz_av

Цитата:
Ошибка была в невкорректной кодогенерации при возвращении этого энумератора функцией GetEnumerator.


Цитата:
Цитата:  
>Компилятор ошибаться не может    
Ты такие глупости больше никому не рассказывай, хорошо?  

Компилятор ошибаться не может - это Вы ошибаетесь когда не берёте на себя ответственность за использование только что появившихся новинок языка, компонентов, алгоритмов, технологий. Это касается всего, компилятор тут ни чем не лучше он умеет только то чему успел научиться. Я использую новинки строго с изучением CPU. Иначе не пойму.
Компилятор ошибаться не может - Это не глупости это истина, когда ты начинаешь использовать его как инструмент. Ещё раз говорю интересно было бы посмотреть Ваш код, так как я не смог написать ошибочные GetEnumerator для d2010. Тут компилятор не ошибается, он только вставляет то' чему его недавно научили. Енумераторы так же как inline были бажными вплоть до XE2. Это неизвестно только Вам. Дело даже не в бажности кода. У моего товарища стояли сторонние расширения для разрисовки редактора кода и сама среда разработки падала - так как плагины разрисовки не знали енумераторы, либо ToolsAPI связанный с ними. я обернул их в добровольную директиву, а директиву запретил по дефолту. Это мне позволило сформировать демки удобоваримые для всех версий.
 
Ещё раз говорю интересно было бы посмотреть Ваш код пусть даже в ПМ. Очень люблю по изучать баги Delphi, они их фиксят по 300 штук от версии к версии, а те снова появляются.
 
Добавлено:

Цитата:
Ещё раз говорю интересно было бы посмотреть Ваш код

В замен могу предложить посмотреть мою ADH (Automatic Date's in Header and source code). Это дизайн там пакетик без компонентов, ничего лишнего. Совместимость D6-XE7 (исключение D7, не удалось победить). Что он делает? - Вставляет имя исходника, дату, автора в хидер комментария. Вставляет время в Double и TTimeStamp формате в исходник. Происходит это при нажатии Ctrl+S в Delphi. Вставка идёт не в файл, а прямо в редактор перед сохранением. Вот примерчик:
 

Код:
{*******************************************************}
{  Project                                              }
{  Original Code:  $Id: 123.pas $                       }
{  Modified:  $Date: 2015/01/07 14:44:44 $autor         }
{*******************************************************}
...
const
  sDate_123 = 42011.56789XXXXX;
 

123 - это имя модуля. для тиместамп sDate_123: TTimestamp = (xxx). В окне About у меня всегда версия основного исходника автоматом. Один минус - при выходе из Delphi иногда возникает один экзепшен, надо нажать окей. Это единственная плата за удобства. смотреть директория tools\adh, остальное не обязательно.
http://sourceforge.net/p/vdbi/home/Home/
 

Цитата:
Ещё раз говорю интересно было бы посмотреть Ваш код

Пришлите в ПМ хотя бы плиз, но лучше запостите здесь.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 07:54 08-01-2015 | Исправлено: xpin2013, 07:59 08-01-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru