Запись и восстановление состояния приложения для быстрого запуска приложения .NET - PullRequest
2 голосов
/ 30 марта 2012

Я работаю с приложением .NET с открытым исходным кодом, которое требует много времени для запуска и инициализации. Он создает тысячи объектов и настраивает их для первого использования. Я пытаюсь улучшить время запуска.

Есть ли способ захвата памяти приложения с помощью API-интерфейса Windows или аналогичного, а затем быстрое «восстановление» этого состояния после перезагрузки ПК? По сути, есть ли способ получить доступ и сохранить основную память приложения .NET и заставить CLR «поглотить» эту память позднее?

  • Самым простым способом было бы использовать Windows Hibernate для создания "hiberfile.sys", а затем сохранить копию этого файла (если это возможно). Каждый раз, когда запускается Windows, вы перезаписываете существующий hiberfile сохраненной «чистой» версией для следующего запуска. Это гарантирует, что вы можете сохранить / восстановить состояние приложения без необходимости иметь дело с памятью, указателями и дескрипторами. Может ли это работать?

  • Одним из способов было бы создание mem-диска, хотя я не знаю, возможно ли восстановление. (виртуальная память, которая фактически работает на жестком диске, позволяя сохранять / восстанавливать память в виде простого файла)

  • Похоже на этот вопрос, но немного по-другому, поскольку я не возражаю повторно вставить память приложения по точному адресу, на котором она была сохранена. ПК полностью в моих руках, и ради простоты предположим, что другие приложения не работают.

  • C # не поддерживает продолжение"из коробки", хотя Workflow Foundation в .NET 3.0 и выше позволяет останавливать и перезапускать рабочие процессы. Интересно, как приложение может вести себя как рабочий процесс.

  • Рэймонд Чен выступает против этого в сообщении в блоге , но здесь также не так много технических данных.

  • YAPM , монитор процесса с открытым исходным кодом способен «отображать / снимать / изменять защиту / деформировать области памяти в пространстве виртуальной памяти процесса». Может ли это быть чем-то похожим на то, что я ищу?

1 Ответ

2 голосов
/ 30 марта 2012

Если вы хотите, чтобы процесс сохранения / загрузки не изменялся во избежание первого использования, вы можете посмотреть serialization .

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

Сериализация на уровне объектов или даже для большой группы объектов позволит вам сохранить их и их состояние практически идентично демпингу памяти, но значительно упростит процесс загрузки и сделает его гораздо более надежным. .Net предлагает довольно хорошую поддержку сериализации и может выводить в двоичные файлы (небольшие, но зависящие от версии) или XML (большие, удобочитаемые, несколько более гибкие). Другие библиотеки могут предлагать больше методов различного использования (я полагаю, что есть JSON, который немного более многословен, но работает с веб-приложениями).

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

Так что да, это возможно и действительно может быть быстрее, хотя и не так, как вы изначально думали.

...