C# - Действительно ли Возможно Выполнить итерации "кучи" GC?

Я не сравнил Буферы Протокола с собственной сериализацией Java с точки зрения скорости, но для собственной сериализации Java совместимости серьезное нет - нет. Это также не собирается быть столь же эффективным с точки зрения пространства как Буферы Протокола в большинстве случаев. Конечно, это несколько более гибко с точки зрения того, что это может сохранить, и с точки зрения ссылок и т.д. Буферы Протокола очень хороши в том, что предназначается для, и когда это соответствует Вашей потребности, это является большим - но существуют очевидные ограничения из-за совместимости (и другие вещи).

я недавно отправил Протокол Буферы, сравнивающие платформы в Java и.NET. Версия Java находится в основной проект Google (в каталог сравнительных тестов), версия.NET находится в мой проект порта C#. Если Вы хотите сравнить скорость петабайта со скоростью сериализации Java, Вы могли бы записать подобные классы и сравнить их. Если бы Вы интересуетесь interop, хотя, я действительно не дал бы собственную сериализацию Java (или собственный компонент.NET двоичная сериализация) долгое размышление.

существуют другие опции для совместимой сериализации помимо Буферов Протокола, хотя - Экономия , JSON и YAML приходит на ум, и существуют, несомненно, другие.

РЕДАКТИРОВАНИЕ: Хорошо, с interop, не являющимся настолько важным, стоит попытаться перечислить различные качества, которые Вы хотите из платформы сериализации. Одной вещью, о которой необходимо думать, является управление версиями - это - другая вещь, которую петабайт разработан для обработки хорошо, и назад и вперед (таким образом, новое программное обеспечение может считать старые данные и наоборот) - когда Вы придерживаетесь предложенных правил, конечно:)

попытавшийся быть осторожным относительно производительности Java по сравнению с собственной сериализацией, я действительно не был бы удивлен найти, что петабайт был быстрее так или иначе. Если у Вас есть шанс, используйте сервер vm - мои недавние сравнительные тесты показали серверу VM, чтобы быть более чем вдвое более быстры при сериализации и десериализации демонстрационных данных. Я думаю, что код петабайта удовлетворяет JIT VM's сервера очень приятно:)

Так же, как демонстрационная производительность фигурирует, сериализируя и десериализовывая два сообщения (228 байтов, 84 750 байтов), я получил эти результаты на своем ноутбуке с помощью сервера VM:

Benchmarking benchmarks.GoogleSize$SizeMessage1 with file google_message1.dat 
Serialize to byte string: 2581851 iterations in 30.16s; 18.613789MB/s 
Serialize to byte array: 2583547 iterations in 29.842s; 18.824497MB/s 
Serialize to memory stream: 2210320 iterations in 30.125s; 15.953759MB/s 
Deserialize from byte string: 3356517 iterations in 30.088s; 24.256632MB/s 
Deserialize from byte array: 3356517 iterations in 29.958s; 24.361889MB/s 
Deserialize from memory stream: 2618821 iterations in 29.821s; 19.094952MB/s 

Benchmarking benchmarks.GoogleSpeed$SpeedMessage1 with file google_message1.dat 
Serialize to byte string: 17068518 iterations in 29.978s; 123.802124MB/s 
Serialize to byte array: 17520066 iterations in 30.043s; 126.802376MB/s 
Serialize to memory stream: 7736665 iterations in 30.076s; 55.93307MB/s 
Deserialize from byte string: 16123669 iterations in 30.073s; 116.57947MB/s 
Deserialize from byte array: 16082453 iterations in 30.109s; 116.14243MB/s
Deserialize from memory stream: 7496968 iterations in 30.03s; 54.283176MB/s 

Benchmarking benchmarks.GoogleSize$SizeMessage2 with file google_message2.dat 
Serialize to byte string: 6266 iterations in 30.034s; 16.826494MB/s 
Serialize to byte array: 6246 iterations in 30.027s; 16.776697MB/s 
Serialize to memory stream: 6042 iterations in 29.916s; 16.288969MB/s 
Deserialize from byte string: 4675 iterations in 29.819s; 12.644595MB/s 
Deserialize from byte array: 4694 iterations in 30.093s; 12.580387MB/s 
Deserialize from memory stream: 4544 iterations in 29.579s; 12.389998MB/s 

Benchmarking benchmarks.GoogleSpeed$SpeedMessage2 with file google_message2.dat 
Serialize to byte string: 39562 iterations in 30.055s; 106.16416MB/s 
Serialize to byte array: 39715 iterations in 30.178s; 106.14035MB/s 
Serialize to memory stream: 34161 iterations in 30.032s; 91.74085MB/s 
Deserialize from byte string: 36934 iterations in 29.794s; 99.98019MB/s 
Deserialize from byte array: 37191 iterations in 29.915s; 100.26867MB/s 
Deserialize from memory stream: 36237 iterations in 29.846s; 97.92251MB/s 

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

, Как Вы видите для меньшего сообщения, это может быть очень быстро - более чем 500 маленьких сериализированных сообщений или десериализовало на миллисекунду . Даже с сообщением 87K это берет меньше, чем миллисекунда на сообщение.

5
задан user160677 22 September 2009 в 19:54
поделиться

2 ответа

Ответы на ваши вопросы:

  1. К сожалению, нет, вы не можете. Сборщик мусора CLR работает по метке, развертке и компактному шаблону, поэтому между запусками нет информации о куче (кроме размера кучи или текущего поколения экземпляра определенного типа), которая позволила бы вам перебирать все объекты в Это.

  2. Лучший способ контролировать сборщик мусора - использовать perfmon и наблюдать (или регистрировать) счетчики памяти CLR .

7
ответ дан 14 December 2019 в 01:12
поделиться

Некоторое время назад я искал в Интернете ответ на тот же вопрос, но не нашел способа программно перебрать кучу GC.

Если вам просто нужно посмотреть это информацию для отладки, вы можете запустить WinDbg и загрузить расширение SOS. чем вы можете использовать команду расширения! dumpheap, чтобы точно узнать, какие объекты находятся в куче GC. вы также можете использовать режим профилирования памяти dotTrace, если он у вас есть.

2
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: