Согласен с вами, в asp.net поведение отличается от консольного или того же WinForms.
Именно для этого в топике предложение:
«По разному ведет себя в консолях, WinForms, WPF…», можно дописать asp.net, wcf и т.д.
Но изучить и описать в одном пункте сразу все возможные повороты я не могу, тем более что по словам Джона Скита «информация не документирована явно». И когда это средство впервые было представлено публике Хейлсбергом произошло много изменений, и не факт что их не будет в дальнейшем (без нарушения работы существующих решений).
Ваше замечание уместно и справедливо, спасибо что подсказали как оно в asp.net.
P.S. Два года назад я проходил курс внутреннего устройства Windows NT, и думаю что догадываюсь что такое контекст потока.
Что бы убрать сомнения и разобраться самому, приведу результаты тестов консольного приложения в котором создается 10 млн (+1) Point и затем сразу 10 млн (+1) анонимных типов. Сбор данных идет до запуска циклов и после.
До
0:003> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x000000c200001030
generation 1 starts at 0x000000c200001018
generation 2 starts at 0x000000c200001000
ephemeral segment allocation context: none
segment begin allocated size
000000c200000000 000000c200001000 000000c200005fe8 0x4fe8(20456)
Large object heap starts at 0x000000c210001000
segment begin allocated size
000000c210000000 000000c210001000 000000c210009728 0x8728(34600)
Total Size: Size: 0xd710 (55056) bytes.
------------------------------
GC Heap Size: Size: 0xd710 (55056) bytes.
0:003> !heapstat
Heap Gen0 Gen1 Gen2 LOH
Heap0 20408 24 24 34600
Free space: Percentage
Heap0 24 0 0 152SOH: 0% LOH: 0%
После
0:006> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x000000c20e416a70
generation 1 starts at 0x000000c20de16a40
generation 2 starts at 0x000000c200001000
ephemeral segment allocation context: none
segment begin allocated size
000000c200000000 000000c200001000 000000c20e4f9fe8 0xe4f8fe8(240095208)
Large object heap starts at 0x000000c210001000
segment begin allocated size
000000c210000000 000000c210001000 000000c210009728 0x8728(34600)
000000c218000000 000000c218001000 000000c220001040 0x8000040(134217792)
Total Size: Size: 0x16501750 (374347600) bytes.
------------------------------
GC Heap Size: Size: 0x16501750 (374347600) bytes.
0:006> !heapstat
Heap Gen0 Gen1 Gen2 LOH
Heap0 931192 6291504 232872512 134252392
Free space: Percentage
Heap0 24 24 69984 184SOH: 0% LOH: 0%
Gen2 232872512 — 222 Mb.
Данные проверял в Windbg и Process Explorer, консольное приложение собрано в режиме x64.
«Люди видят то, что хотят видеть; слышат то, что хотят слышать; верят в то, во что хотят верить и отказываются верить в то, что им не нравится.» Скилеф
У меня есть эта книжечка, спасибо что напомнили про нее.
В разных источниках разные данные:
Поколение 0 — изначально отводится от 256 Кбайт до 4 Мбайт, далее может меняется динамически. Он зависит от разрядности ОС, размера кэш памяти процессора L2 и L3.
Поколение 1 — немногим больше поколения 0.
Поколение 2 — не ограничен искусственно. 10 mb наверное первое пороговое значение, можно проверить в отладчике размер куч если интересно.
* CLR резервирует блоки памяти (запрашивает у Windows), но не выдает их процессу сразу и полностью. Блока два, один SOH другой LOH, и с ними тоже есть свои тонкости и настройки (подробней в 3 источнике).
Согласен что сложно, именно поэтому «По разному ведет себя в консолях, WinForms, WPF…».
Не имеет отношения к потокам? Тогда зачем Task и пул.
Не мешайте все в одну кучу. Если вы очень хорошо знаете работу этого типа в контексте aps.net, то это не распространяется в равной степени на другие его формы.
Отчасти так, детали не документированы явно. Передавая FALSE мы лишь сообщим что на с не заботит где выполниться продолжение, а не использовать специфический контекст.
Для оптимизации приложений на .NET в которых к быстродействию предъявляют дополнительные требования.
Сейчас как раз дочитываю одноименную книгу, и О_О как много я не знал и еще не скоро пойму до конца.
Например: иногда рекурсия может быть JIT-оптимизирована так что не нужно будет создавать пролог, эпилог и делать очистку; иногда цикл for может быть оптимизирован так что не будет проверки индекса массива (-2 инструкции ASM); иногда упаковка происходит там где ее никто не ждал, и много другого.
И все таки, были ли случаи когда отвечали на все вопросы, или когда сами задавали такие что глаза на лоб? :)
Академия Microsoft: Параллельные вычисления и многопоточное программирование.
Разобрана работа многих алгоритмов в разных режимах.
Все обновления ставлю, ошибок нет, багов нет, даже забыл про них.
Возможно у вас стороннее ПО повлияло на Windows.
Crash Bandicoot — Complete 100% Walkthrough — All Gems, All Boxes, All Bonus Stages
x32 .NET 4.5
Думал одно, писал другое.
Оказывается не документирована именно работа метода со значением FALSE.
Именно для этого в топике предложение:
«По разному ведет себя в консолях, WinForms, WPF…», можно дописать asp.net, wcf и т.д.
Но изучить и описать в одном пункте сразу все возможные повороты я не могу, тем более что по словам Джона Скита «информация не документирована явно». И когда это средство впервые было представлено публике Хейлсбергом произошло много изменений, и не факт что их не будет в дальнейшем (без нарушения работы существующих решений).
Ваше замечание уместно и справедливо, спасибо что подсказали как оно в asp.net.
P.S. Два года назад я проходил курс внутреннего устройства Windows NT, и думаю что догадываюсь что такое контекст потока.
В контексте asp.net имеется ввиду сам asp.net.
P.S. Gen 0 = почти равен L2; Gen 1 = L3. Но об этом потом.
Gen2 232872512 — 222 Mb.
Данные проверял в Windbg и Process Explorer, консольное приложение собрано в режиме x64.
Оборудование:
Windows 8.1 64, i7-4702MQ ( L2 — 4x 256 Kb, L3 — 6 Mb ).
Игра слов, вы безусловно правы, согласен с вами.
В разных источниках разные данные:
Поколение 0 — изначально отводится от 256 Кбайт до 4 Мбайт, далее может меняется динамически. Он зависит от разрядности ОС, размера кэш памяти процессора L2 и L3.
Поколение 1 — немногим больше поколения 0.
Поколение 2 — не ограничен искусственно. 10 mb наверное первое пороговое значение, можно проверить в отладчике размер куч если интересно.
* CLR резервирует блоки памяти (запрашивает у Windows), но не выдает их процессу сразу и полностью. Блока два, один SOH другой LOH, и с ними тоже есть свои тонкости и настройки (подробней в 3 источнике).
Не имеет отношения к потокам? Тогда зачем Task и пул.
Не мешайте все в одну кучу. Если вы очень хорошо знаете работу этого типа в контексте aps.net, то это не распространяется в равной степени на другие его формы.
Загрузить школьную программу — 300 кредитов.
Научиться варить «Щи» — 350 кредитов.
Сейчас как раз дочитываю одноименную книгу, и О_О как много я не знал и еще не скоро пойму до конца.
Например: иногда рекурсия может быть JIT-оптимизирована так что не нужно будет создавать пролог, эпилог и делать очистку; иногда цикл for может быть оптимизирован так что не будет проверки индекса массива (-2 инструкции ASM); иногда упаковка происходит там где ее никто не ждал, и много другого.